OpenCV 手势识别:拍照、录像功能详解及代码示例
OpenCV 手势识别:拍照、录像功能详解及代码示例
想体验用 手势 控制拍照和录像的乐趣吗?本文将带您使用 OpenCV 和 MediaPipe 库,一步步实现这一酷炫功能!
一、准备工作
-
安装必要库:
bash pip install opencv-python mediapipe autopy cvzone -
准备摄像头:确保您的电脑连接了可正常工作的摄像头。
二、代码详解pythonimport cv2import autopyimport mediapipe as mpfrom cvzone.HandTrackingModule import HandDetectorimport osimport timeimport numpy as np
设置屏幕和摄像头分辨率wScr, hScr = autopy.screen.size()wCam, hCam = 1280, 720
设置手部检测区域pt1, pt2 = (100, 100), (1200, 700)
打开摄像头cap = cv2.VideoCapture(0) cap.set(3, wCam) cap.set(4, hCam)
设置保存路径path = 'E:/'
初始化手部检测器detector = HandDetector(detectionCon=0.8)
初始化变量startDist = Nonecx, cy = 500, 500scale = 0i = 1
主循环while cap.isOpened(): success, img = cap.read() img = cv2.flip(img, flipCode=1) # 翻转图像
if success: hands, img = detector.findHands(img) # 检测手部 cv2.imshow('img', img)
# 按'q'键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break
# 双手控制 if len(hands) == 2: lmList1 = hands[0]['lmList'] lmList2 = hands[1]['lmList'] fingers = detector.fingersUp(hands[0]) foots = detector.fingersUp(hands[1])
# 握拳退出 if detector.fingersUp(hands[0]) == [0, 0, 0, 0, 0] and detector.fingersUp(hands[1]) == [0, 0, 0, 0, 0]: print('结束') cap.release() cv2.destroyAllWindows() break
# 竖起食指拍照 if detector.fingersUp(hands[0]) == [0, 1, 1, 0, 0] and detector.fingersUp(hands[1]) == [0, 1, 1, 0, 0]: ret, img = cap.read() cv2.imwrite(path + 'person' + str(i) + '.jpg', img) i = i + 1 print('拍照成功') time.sleep(1)
# 单手控制 if len(hands) == 1: # 竖起食指、中指、无名指拍照 if detector.fingersUp(hands[0]) == [0, 0, 1, 1, 1]: time.sleep(2) ret, img = cap.read() cv2.imwrite(path + 'person' + str(i) + '.jpg', img) i = i + 1 print('拍照成功') time.sleep(1)
# 竖起食指和中指开始录像 if detector.fingersUp(hands[0]) == [0, 1, 1, 1, 1]: cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', fourcc, 30.0, (640, 480))
while cap.isOpened(): ret, frame = cap.read() if ret == True: frame = cv2.flip(frame, 1) out.write(frame) # 保存视频 cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break
# 释放资源 cap.release() out.release() cv2.destroyAllWindows()
释放资源cap.release()cv2.destroyAllWindows()
三、常见问题及解决方案
-
缺少包: 运行代码前,请确保已安装所有需要的库。
-
摄像头问题: 检查摄像头连接是否正常,驱动是否安装正确。
-
文件路径问题: 确保保存路径存在且有写入权限。
-
控制流问题: 注意代码中的循环和条件判断逻辑,避免出现死循环或逻辑错误。
四、总结
本文介绍了如何使用 OpenCV 和 MediaPipe 实现基于手势识别的拍照和录像功能。您可以根据自己的需求修改代码,例如添加更多手势或更改控制逻辑。希望这篇文章能帮助您开启手势控制的奇妙之旅!
原文地址: https://www.cveoy.top/t/topic/cN9E 著作权归作者所有。请勿转载和采集!