Python如何使用opencv进行手势识别详解
目录
- 前言
- 原理
- 程序部分
- 附另一个手势识别实例
- 总结
前言 本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。
【Python如何使用opencv进行手势识别详解】
原理
文章图片
首先先进行手部的检测,找到之后会做Hand Landmarks。
文章图片
将手掌的21个点找到,然后我们就可以通过手掌的21个点的坐标推测出来手势,或者在干什么。
程序部分 第一安装Opencv
pip install opencv-python
第二安装mediapipe
pip install mediapipe
程序
先调用这俩个函数库
import cv2import mediapipe as mp
然后再调用摄像头
cap = cv2.VideoCapture(0)
函数主体部分
while True:ret, img = cap.read()#读取当前数据if ret:cv2.imshow('img',img)#显示当前读取到的画面if cv2.waitKey(1) == ord('q'):#按q键退出程序break
全部函数
import cv2import mediapipe as mpimport timecap = cv2.VideoCapture(1)mpHands = mp.solutions.handshands = mpHands.Hands()mpDraw = mp.solutions.drawing_utilshandLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=3)handConStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)pTime = 0cTime = 0while True:ret, img = cap.read()if ret:imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)result = hands.process(imgRGB)# print(result.multi_hand_landmarks)imgHeight = img.shape[0]imgWidth = img.shape[1]if result.multi_hand_landmarks:for handLms in result.multi_hand_landmarks:mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle)for i, lm in enumerate(handLms.landmark):xPos = int(lm.x * imgWidth)yPos = int(lm.y * imgHeight)# cv2.putText(img, str(i), (xPos-25, yPos+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)# if i == 4:#cv2.circle(img, (xPos, yPos), 20, (166, 56, 56), cv2.FILLED)# print(i, xPos, yPos)cTime = time.time()fps = 1/(cTime-pTime)pTime = cTimecv2.putText(img, f"FPS : {int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)cv2.imshow('img', img)if cv2.waitKey(1) == ord('q'):break
这样我们就能再电脑上显示我们的手部关键点和坐标了,对于手势识别或者别的操作就可以通过获取到的关键点的坐标进行判断了。
附另一个手势识别实例
'''@Time : 2021/2/6 15:41 @Author : WGS@remarks : '''""" 从视频读取帧保存为图片"""import cv2import numpy as np# cap = cv2.VideoCapture("C:/Users/lenovo/Videos/wgs.mp4") #读取文件cap = cv2.VideoCapture(0)# 读取摄像头# 皮肤检测def A(img):YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)# 转换至YCrCb空间(y, cr, cb) = cv2.split(YCrCb)# 拆分出Y,Cr,Cb值cr1 = cv2.GaussianBlur(cr, (5, 5), 0)_, skin = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# Ostu处理res = cv2.bitwise_and(img, img, mask=skin)return resdef B(img):# binaryimg = cv2.Canny(Laplacian, 50, 200) #二值化,canny检测h = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 寻找轮廓contour = h[0]contour = sorted(contour, key=cv2.contourArea, reverse=True)# 已轮廓区域面积进行排序# contourmax = contour[0][:, 0, :]#保留区域面积最大的轮廓点坐标bg = np.ones(dst.shape, np.uint8) * 255# 创建白色幕布ret = cv2.drawContours(bg, contour[0], -1, (0, 0, 0), 3)# 绘制黑色轮廓return retwhile (True):ret, frame = cap.read()# 下面三行可以根据自己的电脑进行调节src = https://www.it610.com/article/cv2.resize(frame, (400, 350), interpolation=cv2.INTER_CUBIC)# 窗口大小cv2.rectangle(src, (90, 60), (300, 300), (0, 255, 0))# 框出截取位置roi = src[60:300, 90:300]# 获取手势框图res = A(roi)# 进行肤色检测cv2.imshow("0", roi)gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)dst = cv2.Laplacian(gray, cv2.CV_16S, ksize=3)Laplacian = cv2.convertScaleAbs(dst)contour = B(Laplacian)# 轮廓处理cv2.imshow("2", contour)key = cv2.waitKey(50) & 0xFFif key == ord('q'):breakcap.release()cv2.destroyAllWindows()
总结 到此这篇关于Python如何使用opencv进行手势识别的文章就介绍到这了,更多相关Python用opencv手势识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 订阅如何影响物联网设备的用户体验
- 如何保证kafka消费的顺序性
- 使用APICloud|使用APICloud AVM框架开发人事档案管理助手app实战
- 如何在Vue中使用debouce防抖函数
- Python数据可视化Pyecharts制作Heatmap热力图
- python|python 中 lxml 的 etree 标签解析
- python可视化数据分析pyecharts初步尝试
- python|python 包 requests 实现请求操作
- Vue使用Echart图标插件之柱状图
- Flutter使用RepositoryProvider解决跨组件传值问题