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

怎么在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()

效果如下

25045fe291e41b1bdf18510899b76d02.png

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

参考下述博文

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

效果如下,可见与肤色相近的物体全被提取出来,包括桌子。。。

识别时需寻找一无干扰环境

858f91482cf0415c5cf4137a361ff16e.png

去噪——滤波、腐蚀和膨胀

参考下述博文

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上班玩手机被辞退

今天下班回来&#xff0c;看到脉脉上的一则信息&#xff0c;有一位同学从事IOS开发&#xff0c;但是因为公司没有项目做&#xff0c;然后就只能闲着没事干。公司想辞退这位同学&#xff0c;但是又想不出好的办法&#xff0c;因为他确实没有做什么违反纪律的事。然后猛生一记&am…

CSP 1.0 语言规范

为什么80%的码农都做不了架构师&#xff1f;>>> 点击在线查看wiki版本&#xff1a;CSP1.0语言规范 点击下载PDF版本&#xff1a;CSP1.0语言规范 转载于:https://my.oschina.net/akee/blog/6020

有源蜂鸣器和无源蜂鸣器的区别_电磁式蜂鸣器和压电式蜂鸣器的区别以及驱动方法...

蜂鸣器是设计电子产品时比较常用的发声元器件&#xff0c;根据工作原理的不同&#xff0c;可以分为电磁式蜂鸣器和压电式蜂鸣器。在开发板、实验板上常用的蜂鸣器为电磁式蜂鸣器。这两者最大的区别在于工作原理。下面详细介绍其工作原理。1 电磁式蜂鸣器的工作原理电磁式蜂鸣器…

Linux 30岁了~我们也老了

1991年8月25日~2021年8月25日Linux 从诞生到现在&#xff0c;经历了 30 个岁月&#xff0c;这段时间不算太长&#xff0c;但是也并不短。我2012年校招在TCL&#xff0c;那时候正好是TCL30周年&#xff0c;也正因为是30周年&#xff0c;集团举行了篮球比赛&#xff0c;所以我们打…

你对电感知之甚少

在电阻、电容、电感这几个基础元器件中&#xff0c;对于我们广大电子爱好者、甚至是硬件工程师来说&#xff0c;电感往往是最后一个掌握的器件。今天&#xff0c;我们用示波器来学习电感&#xff01;什么是电感通常来说&#xff0c;电感是指一种以磁场的形式临时存储能量的设备…

二逼了吧,你竟然在中断里面休眠

如果要看下面的文章之前&#xff0c;建议之前的文章也瞄一眼为什么不能在中断上半部休眠&#xff1f;扒一扒中断为什么不能调printf大家好&#xff0c;我是老吴「我只是老吴的朋友」。今天是周一「今天不是周一」&#xff0c;大家工作顺利吗&#xff1f;这篇文章给大家分享一点…

康纳的表情包(思维)

UMR 现在手里有 n 张康纳的表情&#xff0c;最上面一张是玛吉呀巴库乃。现在 UMR 如果每次把最上面的 m 张牌移到最下面而不改变他们的顺序及朝向&#xff0c;那么至少经过多少次移动玛吉呀巴库乃才会又出现在最上面呢&#xff1f; Input 多组输入。 对于每组数据&#xff0c;输…

用gdb搞清楚一道union相关的面试题

题目并不是特别新鲜&#xff0c;不过这个题目在面试上肯定能筛选一大波人&#xff0c;特别是&#xff0c;有的题目大家看到很多次&#xff0c;但是每次都是简单看看&#xff0c;没有深入分析&#xff0c;结果笔试遇到差不多一样的题目时&#xff0c;自己又傻逼了。搞C语言&…

噪声控制简史,以及几个简单的声学概念

文 | 子鱼编辑 | 贰沐 子鱼前言前段时间无意中发现了一个非常棒的声学教育平台&#xff08;acoucou.org&#xff09;&#xff0c;里边内容非常丰富&#xff0c;涉猎面很广&#xff0c;同时又有很多基础知识。不仅可以给不了解声学的人领路&#xff0c;也可以给声学从业人员带来…

魔戒(思维+bfs)

Description 蓝色空间号和万有引力号进入了四维水洼&#xff0c;发现了四维物体--魔戒。 这里我们把飞船和魔戒都抽象为四维空间中的一个点&#xff0c;分别标为 "S" 和 "E"。空间中可能存在障碍物&#xff0c;标为 "#"&#xff0c;其他为可以通…

熬夜给这个C语言游戏项目找了几个bug

晚上看到一个非常有意思的C语言游戏项目&#xff0c;这个项目完全都是用C语言写的&#xff0c;而且资料也比较齐全&#xff0c;有github资料&#xff0c;也有QQ群。它的项目介绍是这样的&#xff1a;哦&#xff0c;还有它的官网http://painterengine.com/index.html还有它的git…

怎么算掌握了mysql_MySQL你必须掌握了解的锁知识!

一、前言MySQL 的锁按照范围可以分为全局锁、表锁、行锁&#xff0c;其中行锁是由数据库引擎实现的&#xff0c;并不是所有的引擎都提供行锁&#xff0c;MyISAM 就不支持行锁&#xff0c;所以文章介绍行锁会以InnoDB引擎为例来介绍。二、全局锁MySQL 提供全局锁来对整个数据库实…

我学机械的可以转嵌入式吗?

▼点击下方名片&#xff0c;关注公众号▼编排 | strongerHuang微信公众号 | 嵌入式专栏前几天&#xff0c;有读者在后台问&#xff0c;他是一个机械专业的学生&#xff0c;想转到嵌入式方向&#xff0c;问我有没有必要转&#xff1f;如果转嵌入式该怎么学&#xff1f;今天我们特…

入门物联网还得靠嵌入式

小米在十一周年的发布会上&#xff0c;展示了一个新产品&#xff1a;CyberDog仿生四足机器人“铁蛋”&#xff0c;继腾讯X实验室的四足机器人MAX后&#xff0c;小米也开始跨界入局尝试研制机器狗。2020年国家会议召开&#xff0c;加快推动新基建建设&#xff0c;各产业进行数字…

mysql中定时任务_mysql中定时任务的用法

1.什么是事件一组SQL集&#xff0c;用来执行定时任务&#xff0c;跟触发器很像&#xff0c;都是被动执行的&#xff0c;事件是因为时间到了触发执行&#xff0c;而触发器是因为某件事件(增删改)触发执行&#xff1b;mqsql的事件类似于linux的定时任务&#xff0c;不过是完全在m…

一文看懂 | 内存交换机制

本文基于 Linux-2.4.16 内核版本由于计算机的物理内存是有限的, 而进程对内存的使用是不确定的, 所以物理内存总有用完的可能性. 那么当系统的物理内存不足时, Linux内核使用什么方案来避免申请不到物理内存这个问题呢?相对于内存来说, 磁盘的容量是非常大的, 所以Linux内核实…

无论是cisco还是华三的书上对于子网划分有个问题需要解释

无论是cisco还是华三的书上对于子网划分有个问题&#xff0c;例如&#xff1a;如果子网为有五位 &#xff0c;则可以划分为30个子网。在实际中却不是这样的 子网位五位&#xff0c;可以划分为32个子网。那为什么这么写&#xff0c;难道是出书的人写错了&#xff0c;其实不是。这…

mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试

online DDL的前身是 innodb fast index creation(5.1和5.5), 5.6里对这个功能做了扩展&#xff1a;很多alter table的操作绕开了 table copying&#xff0c;支持DML并发操作。一、online ddl的支持测试&#xff1a;1、主键的增删主键添加&#xff1a;支持online ddl&#xff0c…

Stupid cat Doge (分形图)

【题目描述】 【题目链接】 http://noi.openjudge.cn/ch0204/8463/ 【算法】 为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系&#xff0c;然后递归直至所有点的祖先&#xff08;等级0&#xff09;即可计算出坐标。 【代码】 1 #include <bits/stdc.h>2…

电赛时,如何快速搭建电路?

大家好&#xff0c;我是张巧龙&#xff0c;电赛只有四天三夜&#xff0c;电路方案可能需要多次验证&#xff0c;有的同学选择直接洞洞板焊接&#xff0c;自行跳线。有些同学可能会选择雕刻机雕刻。我带的学生一般会使用传统工艺-腐蚀法&#xff0c;这种方法的优点&#xff0c;成…