Python如何使用opencv进行手势识别详解

目录

  • 前言
  • 原理
  • 程序部分
  • 附另一个手势识别实例
  • 总结

前言 本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。
【Python如何使用opencv进行手势识别详解】
原理 Python如何使用opencv进行手势识别详解
文章图片

首先先进行手部的检测,找到之后会做Hand Landmarks。
Python如何使用opencv进行手势识别详解
文章图片

将手掌的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手势识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读