在网上找了一些手势处理的实验。我将在这里简单地实现它。主要用到的知识是opencv、python基础语法、基础图像处理知识。最后的结果:获取视频(摄像头)的部分没什么好说的,直接获取摄像头。cap=cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件#cap=cv2.VideoCapture(0)#读取摄像头while(True):ret,frame=cap.read()key=cv2.waitKey(50)&0xFFifkey==ord('q'):breakcap.release()cv2.destroyAllWindows()肤色检??测这里使用RGB空间人脸的椭圆肤色检测模型肤色受亮度影响很大,所以很难将肤色点和非肤色点分开,也就是说,在这个空间处理后,肤色点是离散的点,中间嵌入了很多非肤色点,这对肤色区域标定(人脸标定、眼睛等)提出了挑战。如果将RGB转换到YCrCb空间,Y(亮度)的影响可以忽略,因为这个空间受亮度影响较小,肤色会产生很好的聚类。这样三维空间就会是二维的CrCb,肤色点就会形成一定的形状。例如,如果你有脸,你会看到面部区域,如果你有手臂,你会看到手臂的形状。defA(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)returnres轮廓处理轮廓处理主要用到两个函数,cv2.findContours和cv2.drawContours。这两个函数的使用很容易找到就不说了。这部分的主要问题被提取出来。轮廓有很多,但是我们只需要手的轮廓,所以我们需要使用sorted函数找到最大的轮廓。defB(img):#binaryimg=cv2.Canny(Laplacian,50,200)#二值化,精明检测h=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)#findcontour=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)#绘制黑色contoursreturnretall代码"""从视频中读取帧并保存为图片"""importcv2importnumpyasnpcap=cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#Readfile#cap=cv2.VideoCapture(0)#Readcamera#SkindetectiondefA(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)#奥斯图processingres=cv2.bitwise_and(img,img,mask=skin)returnresdefB(img):#binaryimg=cv2.Canny(Laplacian,50,200)#二值化,精明检测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)#绘制黑色轮廓returnretwhile(True):ret,frame=cap.read()#下面三行可以根据需要调整到您的计算机src=cv2.resize(frame,(400,350),interpolation=cv2.INTER_CUBIC)#windowsizecv2.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)#contour处理cv2.imshow("2",contour)key=cv2.waitKey(50)&0xFFifkey==ord('q'):breakcap.release()cv2.destroyAllWindows()PS:如果觉得我的分享不错,欢迎点赞和看它
