使用opencv进行简单的手势检测[by Python]
简单的手势识别,基本思路是基于皮肤检测,皮肤的颜色在HSV颜色空间下与周围环境的区分度更高,从RGB转换到HSV颜色空间下针对皮肤颜色进行二值化,得到mask:
def HSVBin(img):
hsv = cv2.cvtColor(img,cv2.COLOR_RGB2HSV) lower_skin = np.array([100,50,0])
upper_skin = np.array([125,255,255]) mask = cv2.inRange(hsv,lower_skin,upper_skin)
return mask
其中:
cvtColor用于颜色空间转换。
inRange中,lower指图像中低于这个值,图像值会变成0;upper指图像中高于这个值,图像值会变成0,而在这之间的值变为255。
然后通过腐蚀与膨胀等形态学变化去除一些噪点,得到更完整的白色(皮肤)色块,最后找出色块的轮廓,并通过色块大小排除一些面积较小的噪点:
def getContours(img):
kernel = np.ones((5,5),np.uint8)
closed = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
closed = cv2.morphologyEx(closed,cv2.MORPH_CLOSE,kernel)
_,contours,h = cv2.findContours(closed,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
vaildContours = []
for cont in contours:
if cv2.contourArea(cont)>9000:
vaildContours.append(cv2.convexHull(cont))
return vaildContours
膨胀:dilate,进行膨胀操作时,将内核 B划过图像,将内核B覆盖区域的最大像素值提取,并代替锚点位置的像素,这一最大化操作会导致图像中的亮区开始“扩展”。
腐蚀:erode,将最小像素值提取原始图片里的一个像素(1或者0)只有在核下的所有像素都是1的时候才被认为是1.否则它就被腐蚀掉了(变成0)。根据核的大小来决定在边界附近的多少像素会被丢弃掉,所以前景物体的厚度或大小会缩小,或者说白色区域会减小。这个在移除小的白色噪点时很有用。
ones(shape[,dtype,order]) 依据一个给定的形状和类型返回一个新的元素全部为1的数组。
data type :uint8 -->range:0~255,一张图片的数据类型默认为unit8
开:腐蚀之后再膨胀的另一个名字。我们使用函数cv2.morphologyEx()。
闭:膨胀之后再腐蚀,在用来关闭前景对象里的小洞或小黑点很有用。
轮廓检测 cv2.findContours,接收参数为二值图。
def main():
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret,img = cap.read()
skinMask = HSVBin(img)
contours = getContours(skinMask)
cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.imshow('capture',img)
k = cv2.waitKey(10)
if k == 27:
break
cv2.waitKey()--waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。返回值为当前键盘按键值。
完整代码如下:
import cv2
import numpy as np def main():
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret,img = cap.read()
skinMask = HSVBin(img)
contours = getContours(skinMask)
cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.imshow('capture',img)
k = cv2.waitKey(10)
if k == 27:
break def getContours(img):
kernel = np.ones((5,5),np.uint8)
closed = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
closed = cv2.morphologyEx(closed,cv2.MORPH_CLOSE,kernel)
_,contours,h = cv2.findContours(closed,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
vaildContours = []
for cont in contours:
if cv2.contourArea(cont)>9000:
#x,y,w,h = cv2.boundingRect(cont)
#if h/w >0.75:
#filter face failed
vaildContours.append(cv2.convexHull(cont))
#rect = cv2.minAreaRect(cont)
#box = cv2.cv.BoxPoint(rect)
#vaildContours.append(np.int0(box))
return vaildContours def HSVBin(img):
hsv = cv2.cvtColor(img,cv2.COLOR_RGB2HSV) lower_skin = np.array([100,50,0])
upper_skin = np.array([125,255,255]) mask = cv2.inRange(hsv,lower_skin,upper_skin)
#res = cv2.bitwise_and(img,img,mask=mask)
return mask if __name__ =='__main__':
main()
效果:
使用opencv进行简单的手势检测[by Python]的更多相关文章
- Python使用OpenCV实现简单的人脸检测
文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- cvSmooth函数 和 OpenCV自带的人脸检测
记录cvSmooth函数的用法和 OpenCV自带的人脸检测. (1)cvSmooth函数 void cvSmooth( const CvArr* src, CvArr* dst,int smooth ...
- 看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
引言 在 android 开发过程中,我们经常需要对一些手势,如:单击.双击.长按.滑动.缩放等,进行监测.这时也就引出了手势监测的概念,所谓的手势监测,说白了就是对于 GestureDetector ...
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...
- 9.3、Libgdx手势检测
(官网:www.libgdx.cn) 触摸屏在输入的基础上增加了手势检测,比如两个手指实现缩放,单击或双击屏幕,长按屏幕等. Libgdx提供了GestureDetector来帮助你检测以下手势: t ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- OpenCV实战:人脸关键点检测(FaceMark)
Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Date: 2018-03-20 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
随机推荐
- Django学习笔记(6)——Form表单
知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...
- 最近一年语义SLAM有哪些代表性工作?
点击"计算机视觉life"关注,置顶更快接收消息! 本文由作者刘骁授权发布,转载请联系原作者,个人主页http://www.liuxiao.org 目前 Semantic SLAM ...
- Powershell:关于hashtable你想知道的一切
译者语:本篇为一篇译文,详细介绍了在powershell中如何使用hashtable这种数据类型.本文为本人2018年最后一篇博文(哈哈,一年内写没写几篇),也是本人的第一次译文,有不足之处还请指教. ...
- .Net语言 APP开发平台——Smobiler学习日志:基于Access数据库的Demo
说明:该demo是基于Access数据库进行客户信息的新增.查看.编辑 新增客户信息和客户列表 Demo下载:https://github.com/comsmobiler/demo-videos 中 ...
- 【转载】Windows Server 2012服务器删除IIS方法
在Windows Server2012版本的服务器系统中,我们可以通过服务器管理器中的"添加角色和功能"来添加IIS的Web服务器,当我们不再使用IIS功能时候,我们也可以通过删除 ...
- WPF 窗口大小自适应
在设置桌面不同分辨率以及较大DPI下,窗口如何显示的问题. 方案一 设置窗口最大值和最小值显示 通过对比当前屏幕的可显示区域,将窗口高宽最大值和最小值,设置为窗口的实际高宽(此例中仅设置高度) 界面设 ...
- Spring笔记02_注解_IOC
目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...
- Java 由浅入深GUI编程实战练习(二)
一,项目简介 1.利用Java GUI 绘制图像界面,设置整体布局 2.编写一个随机数生成1~100的随机数 3.编写一个验证类,用于验证用户输入值与生成随机数是否相等并记录用户猜测次数,当用户猜测成 ...
- [转载] spring aop 环绕通知around和其他通知的区别
前言: spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知 是不能决定的,他们只 ...
- 浏览器与Node的事件循环(Event Loop)有何区别?
前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的. 一.线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里 ...