android opencv 手势,使用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()

效果:

266c81f19dd9c5b45a498bd98f37510f.png

0ae39e02ad4d2123ccbde1907361503b.png

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 :

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发送邮件, 写法大致如 ...

随机推荐

在Xcode6.1.1模拟器中点击UITextView不出现软键盘?

使用Xcode6.1.1做一个小项目时,在storyboard中添加了一个UITextField,使用模拟器运行后,点击UITextField出现光标,也可以从外接键盘上输入文字,但是就是不出现软键盘 ...

AIX 中 Paging Space 使用率过高的分析与解决

AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高.系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起.针对这种情况,通常可以靠增加Paging ...

从零开始学android开发-setBackgroundDrawable与setBackgroundResource的区别

setBackgroundDrawable和setBackgroundResource的区别很多网友不知道View类提供的setBackgroundDrawable和setBackgroundReso ...

C++课程设计2

PS:大一下学期C++课程设计 1.成绩管理系统 #include #include #include #in ...

FlatList 核心运用

WGS84,GCJ02, BD09坐标转换

public class Gps { private double wgLat; private double wgLon; public Gps(double wgLat, double wgLon ...

安装office自定义项,安装期间出错

由于安装vs2013,导致excel打开时出现问题 [解决方案] 开始菜单-excel图标处,右键快捷菜单-以管理员身份运行-新建空白工作簿 文件-选项-加载项-管理中选择COM加载项,转到-删除Lo ...

转载:JAVA序列化与反序列化 (作者:YSOcean)

原文:https://www.cnblogs.com/ysocean/p/6870069.html File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878 ...

hashset和treeset的区别

hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...

iOS:触摸事件和手势识别的介绍

触摸事件和手势识别的介绍 1.iOS的输入事件  UIKit可识别三种类型的输入事件: 触摸事件 运动事件 远程控制事件 iOS中许多事件对象都是UIEvent类的实例,UIEvent记录了事件所产生 ...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值