怎么在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-frame

ret, frame = cap.read()

# our operation on the frame come here

# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 可选择灰度化

# display the resulting frame

cv2.imshow('frame', frame)

if cv2.waitKey(1) & 0xFF == ord('q'): # 按q键退出

break

# when everything done , release the capture

cap.release()

cv2.destroyAllWindows()

效果如下

肤色识别——椭圆肤色检测模型

参考下述博文

https://www.jb51.net/article/202594.htm

代码如下def ellipse_detect(img):

# 椭圆肤色检测模型

skinCrCbHist = np.zeros((256, 256), dtype=np.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, dtype=np.uint8)

(x, y) = cr.shape

for 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] = 255

dst = cv2.bitwise_and(img, img, mask=skin)

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 blur

Canny边缘检测

参考OpenCV中文教程

https://www.kancloud.cn/aollo/aolloopencv/271603

代码如下# Canny边缘检测v

def 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实现一个手势识别功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能相关推荐

  1. java opencv 开发环境_在IntelliJ IDEA 13中配置OpenCV的Java开发环境

    准备工作: 下载IDEA 13(这里以版本13为例,后面简称IDEA): 下载Java JDK(用于配置基本的Java开发环境): 下载OpenCV 2.4.9(这里以版本2.4.9为例,据这篇文章说 ...

  2. ios opencv图片处理_如何在 iOS 工程中使用 OpenCV?

    前言 OpenCV ,是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别.去红眼.追踪移动物体等等的图像相关的功能.更 ...

  3. python神奇时钟项目_怎么在Python项目中利用Pygame绘制一个时钟

    怎么在Python项目中利用Pygame绘制一个时钟 发布时间:2020-11-30 14:24:30 来源:亿速云 阅读:54 作者:Leah 怎么在Python项目中利用Pygame绘制一个时钟? ...

  4. python中case的用法_如何在Python中使用TestCase实现一个断言功能

    如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...

  5. python中利用opencv简单做图片比对

    python环境中,利用opencv对二值单通道图片进行比对 下面代码中利用了两种比对的方法,一 对图片矩阵(m x m)求解特征值,通过比较特征值是否在一定的范围内,判断图片是否相同.二 对图片矩阵 ...

  6. opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)

    opencv 创建图像 This project stemmed from my predilection of the visual arts - as a computing student, I ...

  7. 用python画微笑脸表情_一种检测视频中人脸微笑表情的方法与流程

    本发明涉及视频检测技术领域,特别涉及一种视频中人脸微笑表情的检测方法. 背景技术: 近几年来,表情识别技术在计算机视觉和模式识别领域逐步成为一个重要的研究热点,已经有越来越多的科研成果是基于图像或视频 ...

  8. ubuntu使用python opencv_Ubuntu中“利用Opencv + python进行特征匹配”的环境搭建

    2.安装Python插件:点击Vscode左侧第五个方框对应的功能,搜索Python并安装 3.安装pip (以下步骤均在终端Terminal中执行) sudo apt install pytho-p ...

  9. Python中利用Opencv进行车牌号检测

    初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...

最新文章

  1. 实用目标检测器 | 性能超YoloV5,推理耗时不变(附github源码)
  2. 【DP优化】【P1430】序列取数
  3. 详解Spring中@Autowire,@Value 注解实现原理
  4. php curl 缓存请求_PHP异步非阻塞实现方法
  5. 点击控件动态创建新页面
  6. 解决同一条sql在pl/sql工具中执行很快,在程序中却很慢
  7. 网络安全专业名词解释
  8. UCI数据集(论文常用数据集)
  9. 【测评】思维导图的战争!手绘和数字思维导图哪个更实用?
  10. 微商爆粉2.0全自动批量加人模拟手动操作
  11. Java内存模型——《深入理解Java虚拟机》笔记
  12. SPSS之单样本的T检验
  13. Graphite 简介
  14. 用马青公式计算π的c程序
  15. 快收藏!高手Linux运维管理必备工具大全,你会吗?
  16. h3c 全局启用密码复杂度
  17. Python 程序:24点计算器
  18. 十二不香,十三香!包邮送iPhone13一部!
  19. 全球及中国外延硅晶片行业投资分析及前景方向预测报告2022年版
  20. notability录音定位_《Notability》详细教程,助你开启学霸之路

热门文章

  1. Screen Painter 程序设计
  2. 度量相似性数学建模_一种基于粒子群位置更新思想灰狼优化算法的K-Means文本分类方法与流程...
  3. mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......
  4. 计算机系统遵循,自考《计算机系统结构》第10章精讲
  5. 集合添加元素python_Python基础:列表、字典、元组、集合、添加和删除元素,增删...
  6. mysql多主单向环形_mysql多主单向--gt;环形同步_MySQL
  7. 如何用python打印田字格_如何用 3D 打印一双顶级跑鞋回形针
  8. mysql中下杠怎么打_怎么打字母下方的短横杠?,下横杠怎么打
  9. 第一季3:HI3518E方案整体架构介绍(硬件和软件支持)
  10. 获取系统信息2——linux中使用随机数