Python实现手势识别。


点击上方蓝字关注我们


作者:露露核桃露
https://blog.csdn.net/qq_45874897/article/details/105516981

获取视频(摄像头)
这部分没啥说的,就是获取摄像头。
cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件#cap = cv2.VideoCapture(0)#读取摄像头while(True):ret, frame = cap.read() key = cv2.waitKey(50) & 0xFFif key == ord('q'):breakcap.release()cv2.destroyAllWindows()
肤色检测
这里使用的是椭圆肤色检测模型
在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间将为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态。
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 res
轮廓处理
轮廓处理的话主要用到两个函数,cv2.findContours和cv2.drawContours,这两个函数的使用使用方法很容易搜到就不说了,这部分主要的问题是提取到的轮廓有很多个,但是我们只需要手的轮廓,所以我们要用sorted函数找到最大的轮廓。
def 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 ret
全部代码
""" 从视频读取帧保存为图片"""import cv2import numpy as npcap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.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 = 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()
回复下方 「关键词」,获取优质资源
回复关键词 「linux」,即可获取 185 页 Linux 工具快速教程手册和154页的Linux笔记。
回复关键词 「Python进阶」,即可获取 106 页 Python 进阶文档 PDF
回复关键词 「Python面试题」,即可获取最新 100道 面试题 PDF
回复关键词 「python数据分析」,即可获取47页python数据分析与自然语言处理的 PDF
回复关键词 「python爬虫」,满满五份PPT爬虫教程和70多个案例
回复关键词 「Python最强基础学习文档」,即可获取 168 页 Python 最强基础学习文档 PDF,让你快速入门Python 推荐我的微信号
来围观我的朋友圈,我的经验分享,技术更新,不定期送书,坑位有限,速速扫码添加!
备注:开发方向_昵称_城市,另送你10本Python电子书。点个在看你最好看




