python⼿势识别代码_python实现⼿势识别的⽰例(⼊门)使⽤open-cv实现简单的⼿势识别。刚刚接触python不久,看到了很多有意思的项⽬,尤其时关于计算机视觉的。⽹上搜到了⼀些关于⼿势处理的实验,我在这⼉简单的实现⼀下(PS:和那些⼤佬⽐起来真的是差远了,毕竟刚接触不久),主要运⽤的知识就是
opencv,python基本语法,图像处理基础知识。
最终实现结果:
获取视频(摄像头)
这部分没啥说的,就是获取摄像头。
cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取⽂件
#cap = cv2.VideoCapture(0)#读取摄像头
while(True):
ret, frame = ad() key = cv2.waitKey(50) & 0xFF
if key == ord('q'):
break
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 = urArea, 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 cv2
import numpy as np
cap = 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 res
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 = urArea, 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
while(True):
ret, frame = ad()
#下⾯三⾏可以根据⾃⼰的电脑进⾏调节
src = size(frame,(400,350), interpolation=cv2.INTER_CUBIC)#窗⼝⼤⼩
roi = src[60:300 , 90:300] # 获取⼿势框图
res = A(roi) # 进⾏肤⾊检测
cv2.imshow("0",roi)
python新手代码示例gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
dst = cv2.Laplacian(gray, cv2.CV_16S, ksize = 3)
Laplacian = vertScaleAbs(dst)
contour = B(Laplacian)#轮廓处理
cv2.imshow("2",contour)
key = cv2.waitKey(50) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
本⼈学了python⼏天,做出这个东西⾃⼰已经很满⾜了,当然和那些⼤佬也是没法⽐的,没有什么东西是速成的,只能⼀步⼀个脚印的⾛。
到此这篇关于python实现⼿势识别的⽰例(⼊门)的⽂章就介绍到这了,更多相关python ⼿势识别内容请搜索我们以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持我们!
时间: 2020-04-12
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论