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

python进阶之装饰器之3如何利用装饰器强制函数上的类型检查

先占坑转载于:https://www.cnblogs.com/max520liuhu/p/9349358.html

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

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

Linux 30岁了~我们也老了

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

第三章 MongoDb Java应用 3.2

下面来看看3.1的运行结果&#xff1a; 运行结果&#xff1a; { "_id" : { "$oid" : "4c2845d8735efe55298d0dc9"} , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info&…

你对电感知之甚少

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

使用tmpfs存放MySQL的临时文件的问题一则

最近测试使用tmpfs文件系统作为tmpdir选项存放临时文件的位置&#xff0c;具体步骤网上有很多&#xff0c;但是遇到了一个小bug。 MySQL的相关参数&#xff1a; default-storage-engine INNODB innodb_flush_methodO_DIRECT tmpdir /tmp/mysqltmp /tmp/mysqltmp目录为tmpfs。…

git日常提交使用的命令行

本地初始化仓库,在你的项目根目录初始化仓库。 git init 初始化后再看多了一个.git文件夹&#xff0c;需要打开可查看隐藏文件夹权限。 接下来我们可以在远程简历一个和这个项目名字一样的仓库。 然后点击克隆&#xff0c;复制链接将本地git关联到远程中央仓库。 git remote ad…

mysql显示RMB符号乱码_mysql显示乱码

原文&#xff1a;http://www.2cto.com/database/201108/101151.htmlMySQL会出现中文乱码的原因不外乎下列几点&#xff1a;1.server本身设定问题&#xff0c;例如还停留在latin12.table的语系设定问题(包含character与collation)3.客户端程式(例如php)的连线语系设定问题强烈建…

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

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

千万不要死于无知

前一阵在做信息系统的安全建设方案&#xff0c;无意中发现我们财物的服务器SQL的&#xff33;&#xff21;密码为空&#xff0c;而且可以远程连上&#xff11;&#xff14;&#xff13;&#xff13;进行数据库操作。当时没把我吓死&#xff0c;太不小心了。有好多企业喜欢买来软…

康纳的表情包(思维)

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

java mysql实现原理_MySQL事务实现原理

MySQL事务隔离级别的实现原理知识储备只有InnoDB支持事务&#xff0c;所以这里说的事务隔离级别是指InnoDB下的事务隔离级别隔离级别读未提交&#xff1a;一个事务可以读取到另一个事务未提交的修改。这会带来脏读&#xff0c;幻读&#xff0c;不可重复读问题读已提交&#xff…

女大学生两块钱成功进外企

在一次招聘会上&#xff0c;北京某外企人事经理说&#xff0c;他们本想招一个有丰富工作经验的资深会计人员&#xff0c;结果却破例招了一位刚毕业的女大学生&#xff0c;让他们改变主意的起因只是一个小小的细节&#xff1a;这个学生当场拿出了两块钱。 人事经理说&#…

django入门项目图书管理

该项目利用了django实现了对图书的增删改查操作 步骤 1.在setting下配置好静态文件路径 STATICFILES_DIRS[os.path.join(BASE_DIR,static), ]2.models.py from django.db import models# Create your models here. class Book(models.Model):title models.CharField(max_lengt…

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

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

超级详细Tcpdump 的用法

第一种是关于类型的关键字&#xff0c;主要包括host&#xff0c;net&#xff0c;port, 例如 host 210.27.48.2&#xff0c;指明 210.27.48.2是一台主机&#xff0c;net 202.0.0.0 指明 202.0.0.0是一个网络地址&#xff0c;port 23 指明端口号是23。如果没有指定类型&#xff0…

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

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