最近在做利用手势识别来进行控制led灯的效果如下
左手控制led亮,右手控制led灭。需要的文件有两个
代码如下import time.py
import cv2
import serial
import serial.tools.list_ports
from handUtils import HandDetector
camera=cv2.VideoCapture(0)
hand_detector=HandDetector()
while True:
success,img=camera.read()#返回里2个数值,一个是success,读取成功,另一个是每一帧的视频图片
if success:
img=cv2.flip(img,1)
hand_detector.process(img)
hand_detector.find_positions(img)
cv2.imshow('Video',img)
#ser.write([0x42])
k=cv2.waitKey(1)#等待按键1ms
if k==ord('q'):
break
camera.release()#不让程序占用
cv2.destroyAllWindows()
handUtils
import mediapipe as mp
import cv2
import serial
import serial.tools.list_ports
#串口
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print("无串口设备。")
else:
print("可用的串口设备如下:")
for comport in ports_list:
print(list(comport)[0], list(comport)[1])
# 方式1:调用函数接口打开串口时传入配置参数
ser = serial.Serial("COM3", 9600) # 打开COM17,将波特率配置为115200,其余参数使用默认值
if ser.isOpen(): # 判断串口是否成功打开
print("打开串口成功。")
print(ser.name) # 输出串口号
# data=bytearray([0x41])
# ser.write([0x41])
else:
print("打开串口失败。")
class HandDetector():
def __init__(self):
self.hand_detector=mp.solutions.hands.Hands()
self.draw_util=mp.solutions.drawing_utils
def process(self,img):
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
self.hands_data=self.hand_detector.process(img_rgb)
if self.hands_data.multi_hand_landmarks:
for handlms in self.hands_data.multi_hand_landmarks:
self.draw_util.draw_landmarks(img,handlms,mp.solutions.hands.HAND_CONNECTIONS)
def find_positions(self,img):
position={'Left':{},'Right':{}}
if self.hands_data.multi_hand_landmarks:
i=0
for hand in self.hands_data.multi_handedness:
print(hand)
score=hand.classification[0].score
if score>=0.8:
label=hand.classification[0].label
if label=='Left':
ser.write([0x41])
elif label=='Right':
ser.write([0x42])
具体学习过程可以参考Python编程手势识别_哔哩哔哩_bilibili 讲的非常好。还有就是串口发送可以参考我这个(我也忘了参考谁的了),反正就是先检测串口,然后打开串口,最后串口发送。至于单片机stm32的学习可以参考江科大协的教程,里面有串口发送以及led的相关知识,最后祝大家好运。再见啦!