购物网站设计流程图,网站建立好如何做seo,西安有几个区,做照片用的视频模板下载网站怎么在Python3.5 中利用OpenCV实现一个手势识别功能发布时间#xff1a;2020-12-22 11:56:32来源#xff1a;亿速云阅读#xff1a;67作者#xff1a;Leah怎么在Python3.5 中利用OpenCV实现一个手势识别功能#xff1f;相信很多没有经验的人对此束手无策#xff0c;为此本…怎么在Python3.5 中利用OpenCV实现一个手势识别功能发布时间2020-12-22 11:56:32来源亿速云阅读67作者Leah怎么在Python3.5 中利用OpenCV实现一个手势识别功能相信很多没有经验的人对此束手无策为此本文总结了问题出现的原因和解决方法通过这篇文章希望你能解决这个问题。OpenCV用摄像头捕获视频采用方法调用OpenCV——cv2.VideoCapture()def video_capture():cap cv2.VideoCapture(0)while True:# capture frame-by-frameret, frame cap.read()# our operation on the frame come here# gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 可选择灰度化# display the resulting framecv2.imshow(frame, frame)if cv2.waitKey(1) 0xFF ord(q): # 按q键退出break# when everything done , release the capturecap.release()cv2.destroyAllWindows()效果如下肤色识别——椭圆肤色检测模型参考下述博文https://www.jb51.net/article/202594.htm代码如下def ellipse_detect(img):# 椭圆肤色检测模型skinCrCbHist np.zeros((256, 256), dtypenp.uint8)cv2.ellipse(skinCrCbHist, (113, 155), (23, 15), 43, 0, 360, (255, 255, 255), -1)YCRCB cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)(y, cr, cb) cv2.split(YCRCB)skin np.zeros(cr.shape, dtypenp.uint8)(x, y) cr.shapefor i in range(0, x):for j in range(0, y):CR YCRCB[i, j, 1]CB YCRCB[i, j, 2]if skinCrCbHist[CR, CB] 0:skin[i, j] 255dst cv2.bitwise_and(img, img, maskskin)return dst效果如下可见与肤色相近的物体全被提取出来包括桌子。。。识别时需寻找一无干扰环境去噪——滤波、腐蚀和膨胀参考下述博文https://www.jb51.net/article/202599.htm采用方法高斯滤波 cv2.GaussianBlur() 膨胀 cv2.dilate()代码如下# 膨胀def dilate_demo(image):# 灰度化gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化ret, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 定义结构元素的形状和大小kernel cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# 膨胀操作dst cv2.dilate(binary, kernel)return dst# 腐蚀def erode_demo(image):# 灰度化gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化ret, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 定义结构元素的形状和大小kernel cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))# 腐蚀操作dst cv2.erode(binary, kernel)return dst# 滤波def img_blur(image):# 腐蚀操作# img_erode erode_demo(image)# 膨胀操作img_dilate dilate_demo(image)# 均值滤波# blur cv2.blur(image, (5, 5))# 高斯滤波blur cv2.GaussianBlur(img_dilate, (3, 3), 0)return blurCanny边缘检测参考OpenCV中文教程https://www.kancloud.cn/aollo/aolloopencv/271603代码如下# Canny边缘检测vdef canny_detect(image):edges cv2.Canny(image, 50, 200)return edges识别——轮廓匹配Tensorflow框架实在太难搭搭了半天没搭出来还一堆错误。。。所以采用轮廓匹配 cv2.matchShapes() 方案如下划分出了一个手势识别区域可避免周围环境的干扰也可简化图像处理过程寻找轮廓时采用寻找矩形框架 cv2.boundingRect()的方法找到最大轮廓即手势的轮廓将找到的轮廓直接与标准图片进行匹配简化识别过程但在匹配时发现“剪刀”的手势常与“石头”、“布”的手势匹配到一起。。。所以另辟蹊径在匹配时加上了对于矩形框架面积的判断一般来说有如下规律石头value [0, 0, 0]value[0] cv2.matchShapes(img_contour, img1, 1, 0.0)value[1] cv2.matchShapes(img_contour, img2, 1, 0.0)value[2] cv2.matchShapes(img_contour, img3, 1, 0.0)min_index np.argmin(value)if min_index 0: # 剪刀print(text[int(min_index)], value)elif min_index 1 and w*h print(text[int(min_index)], value)elif min_index 1 and w*h 25000: # 剪刀print(text[0], value)elif min_index 2 and w * h 30000: # 布print(text[int(min_index)], value)elif min_index 2 and w * h 30000: # 剪刀print(text[0], value)程序会根据匹配值和面积大小来决定识别结果例如下述结果1.179515828609219, 0.9604643714904955, 0.9896353720020925分别对应剪刀、石头、布的匹配值越小说明越吻合结合最终识别情况来看在三种手势中石头的识别成功率最高约98%布其次约88%剪刀最低约80%而且结果易受环境亮度影响环境过暗或过亮有时候手势轮廓都出不来。。。看来仍有待改进还是得用机器学习的方法石头 [1.179515828609219, 0.9604643714904955, 0.9896353720020925]看完上述内容你们掌握怎么在Python3.5 中利用OpenCV实现一个手势识别功能的方法了吗如果还想学到更多技能或想了解更多相关内容欢迎关注亿速云行业资讯频道感谢各位的阅读