上山打老虎 发表于 2021-6-24 09:59:50

树莓派opencv手势识别点亮led灯或响蜂鸣器 (附完整代码)

  前言
材料:树莓派 摄像头 SG90舵机两个 PCA9685拓展板 led小灯 蜂鸣器模块  一、树莓派引脚介绍
  树莓派引脚对照表

可以看到一共有三种定义方式 分别是Wiring Pi编码,BCM编码和BOARD物理引脚编码。
  1.1引脚设置


  在最开始终端输入
sudo raspi-config
  进入设置 后找到
Interfacing Options
  进入 找到
Remote GPIO
  开启GPIO
  二、代码书写
  2.1引入库


  在最开始导入库
import RPi.GPIO as GPIO #1导入引脚库
<p>GPIO.setmode(GPIO.BOARD) # 2定义引脚方式 此处为BOARD编码</p>
GPIO.setup(channel, GPIO.OUT) # 3建立通道 该函数需要两个参数 第一个为引脚编号 第二个为模式定义<br><h1>此处为输出</h1><br>
<p>GPIO.output(7, True)#4 驱动通道</p>
<p>GPIO.cleanup()#5清除 释放资源</p>
  2.2示例代码点亮led 响蜂鸣器


#导入gpio模块 调用引脚
<p>import RPi.GPIO as GPIO</p>
<br><h1>初始化引脚模式为BOARD 屏蔽警告</h1><br>
<p>GPIO.setmode(GPIO.BOARD)</p>
<p>GPIO.setwarnings(False)</p>
<br><h1>引脚定义 蜂鸣器接的35引脚 led接的37引脚</h1><br>
<p>beep=35</p>
<p>led=37</p>
<p>GPIO.setup(beep,GPIO.OUT)#设置gpio模式为输出</p>
<p>GPIO.setup(led,GPIO.OUT)</p>
<p>GPIO.output(led,GPIO.HIGH)#开灯</p>
<p>GPIO.output(led,GPIO.LOW)#关灯</p>
<p>GPIO.output(beep,GPIO.HIGH)#蜂鸣器响</p>
<p>GPIO.output(beep,GPIO.LOW)#蜂鸣器关</p>
  三完整代码 图片
#!/usr/bin/env python2<br><h1>-<em>- coding: utf-8 -</em>-</h1><br>
<p>"""</p>
<ul>
<li>@par Copyright (C): 2010-2020, hunan CLB Tech</li>
<li>@file         50_Hand_gestures.py</li>
<li>@version      V2.0</li>
<li>@details</li>
<li>@par History</li></ul>
<p>@author: zhulin</p>
<p>"""</p>
<p>import cv2</p>
<p>import numpy as np</p>
<p>import math</p>
<p>import time</p>
<p>import sys</p>
<p>import Adafruit_PCA9685#导入PCA9685模块</p>
<br><h1>设置编码为utf-8</h1><br>
<p>import importlib</p>
importlib.reload(sys)<br><h1>sys.setdefaultencoding('utf8')</h1><br>
<br><h1>导入gpio模块 调用引脚</h1><br>
<p>import RPi.GPIO as GPIO</p>
<br><h1>初始化引脚模式为BOARD 屏蔽警告</h1><br>
<p>GPIO.setmode(GPIO.BOARD)</p>
<p>GPIO.setwarnings(False)</p>
<br><h1>引脚定义 蜂鸣器接的35引脚 led接的37引脚</h1><br>
<p>beep=35</p>
<p>led=37</p>
<p>GPIO.setup(beep,GPIO.OUT)#设置gpio模式为输出</p>
<p>GPIO.setup(led,GPIO.OUT)</p>
<br><h1>初始化PCA9685和舵机</h1><br>
<p>servo_pwm = Adafruit_PCA9685.PCA9685()# 实例话舵机云台</p>
<br><h1>设置舵机初始值,可以根据自己的要求调试</h1><br>
<p>servo_pwm.set_pwm_freq(60)# 设置频率为60HZ</p>
<p>servo_pwm.set_pwm(5,0,325)# 底座舵机</p>
<p>servo_pwm.set_pwm(4,0,325)# 倾斜舵机</p>
<p>time.sleep(1)</p>
<br><h1>初始化摄像头并设置阙值</h1><br>
<p>cap = cv2.VideoCapture(0)</p>
<p>cap.set(3,120)</p>
<p>cap.set(4,160)</p>
<p>while(1):</p>
<p>try:#an error comes if it does not find anything in window as it cannot find contour of max area</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 0>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 1>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 2>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 3>
</p>
<p># define range of skin color in HSV</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 4>
<p>#extract skin colur imagw</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 5>
<p>#extrapolate the hand to fill dark spots within</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 6>
<p>#blur the image</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 7>
<p>#find contours</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 8>
<p>#find contour of max area(hand)</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 9>
<p>#approx the contour a little</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 10>
<p>#make convex hull around hand</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 11>
<p>#define area of hull and area of hand</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 12>
<p>#find the percentage of area not covered by hand in convex hull</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 13>
<p>#find the defects in convex hull with respect to hand</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 14>
<p># l = no. of defects</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 15>
<p>#code for finding no. of defects due to fingers</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 16>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 17>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 18>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 19>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 20>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 21>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 22>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 23>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 24>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 25>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 26>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 27>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 28>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 29>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 30>
<p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 31>
</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 32>
<p>k = cv2.waitKey(5) &amp; 0xFF</p>
<p>if k == 27:</p>
<space10eb1589f504bb36557c11a1a3a40ca2Code 33>
<p>cv2.destroyAllWindows()</p>
<p>cap.release()</p>
  实现功能 :
识别手势1 伸一个指头 点亮LED 灯
识别手势2 伸两个指头 关闭LED 灯
识别手势3 伸三个指头 响蜂鸣器
识别手势4 伸四个指头 蜂鸣器关
识别手势5 伸5个指头 声光警报
成品展示:

页: [1]
查看完整版本: 树莓派opencv手势识别点亮led灯或响蜂鸣器 (附完整代码)