python实现手势识别的示例(入门)


Posted in Python onApril 15, 2020

使用open-cv实现简单的手势识别。刚刚接触python不久,看到了很多有意思的项目,尤其时关于计算机视觉的。网上搜到了一些关于手势处理的实验,我在这儿简单的实现一下(PS:和那些大佬比起来真的是差远了,毕竟刚接触不久),主要运用的知识就是opencv,python基本语法,图像处理基础知识。

最终实现结果:

python实现手势识别的示例(入门)

获取视频(摄像头

这部分没啥说的,就是获取摄像头。

cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件
#cap = cv2.VideoCapture(0)#读取摄像头
while(True):
  ret, frame = cap.read()  key = cv2.waitKey(50) & 0xFF
  if key == ord('q'):
  	break
cap.release()
cv2.destroyAllWindows()

肤色检测

这里使用的是椭圆肤色检测模型
在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间将为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态。

def A(img):

  YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
  (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
  cr1 = cv2.GaussianBlur(cr, (5,5), 0)
  _, skin = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #Ostu处理
  res = cv2.bitwise_and(img,img, mask = skin)
  return res

轮廓处理

轮廓处理的话主要用到两个函数,cv2.findContours和cv2.drawContours,这两个函数的使用使用方法很容易搜到就不说了,这部分主要的问题是提取到的轮廓有很多个,但是我们只需要手的轮廓,所以我们要用sorted函数找到最大的轮廓。

def B(img):

  #binaryimg = cv2.Canny(Laplacian, 50, 200) #二值化,canny检测
  h = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #寻找轮廓
  contour = h[0]
  contour = sorted(contour, key = cv2.contourArea, reverse=True)#已轮廓区域面积进行排序
  #contourmax = contour[0][:, 0, :]#保留区域面积最大的轮廓点坐标
  bg = np.ones(dst.shape, np.uint8) *255#创建白色幕布
  ret = cv2.drawContours(bg,contour[0],-1,(0,0,0),3) #绘制黑色轮廓
  return ret

全部代码

""" 从视频读取帧保存为图片"""
import cv2
import numpy as np
cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件
#cap = cv2.VideoCapture(0)#读取摄像头

#皮肤检测
def A(img):

  YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
  (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
  cr1 = cv2.GaussianBlur(cr, (5,5), 0)
  _, skin = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #Ostu处理
  res = cv2.bitwise_and(img,img, mask = skin)
  return res

def B(img):

  #binaryimg = cv2.Canny(Laplacian, 50, 200) #二值化,canny检测
  h = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #寻找轮廓
  contour = h[0]
  contour = sorted(contour, key = cv2.contourArea, reverse=True)#已轮廓区域面积进行排序
  #contourmax = contour[0][:, 0, :]#保留区域面积最大的轮廓点坐标
  bg = np.ones(dst.shape, np.uint8) *255#创建白色幕布
  ret = cv2.drawContours(bg,contour[0],-1,(0,0,0),3) #绘制黑色轮廓
  return ret


while(True):

  ret, frame = cap.read()
  #下面三行可以根据自己的电脑进行调节
  src = cv2.resize(frame,(400,350), interpolation=cv2.INTER_CUBIC)#窗口大小
  cv2.rectangle(src, (90, 60), (300, 300 ), (0, 255, 0))#框出截取位置
  roi = src[60:300 , 90:300] # 获取手势框图

  res = A(roi) # 进行肤色检测
  cv2.imshow("0",roi)

  gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
  dst = cv2.Laplacian(gray, cv2.CV_16S, ksize = 3)
  Laplacian = cv2.convertScaleAbs(dst)

  contour = B(Laplacian)#轮廓处理
  cv2.imshow("2",contour)

  key = cv2.waitKey(50) & 0xFF
  if key == ord('q'):
      break
cap.release()
cv2.destroyAllWindows()

本人学了python几天,做出这个东西自己已经很满足了,当然和那些大佬也是没法比的,没有什么东西是速成的,只能一步一个脚印的走。

到此这篇关于python实现手势识别的示例(入门)的文章就介绍到这了,更多相关python 手势识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的魔法方法深入理解
Jul 09 Python
用python 制作图片转pdf工具
Jan 30 Python
Linux下使用python自动修改本机网关代码分享
May 21 Python
python编程开发之日期操作实例分析
Nov 13 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
python SVM 线性分类模型的实现
Jul 19 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
django学习之ajax post传参的2种格式实例
May 14 Python
使用python计算三角形的斜边例子
Apr 15 #Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 #Python
解决python Jupyter不能导入外部包问题
Apr 15 #Python
Python+redis通过限流保护高并发系统
Apr 15 #Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 #Python
pyinstaller打包找不到文件的问题解决
Apr 15 #Python
使用Pycharm分段执行代码
Apr 15 #Python
You might like
php 无限级 SelectTree 类
2009/05/19 PHP
php绘制一条直线的方法
2015/01/24 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
详解Python中for循环的使用
2015/04/14 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
详解python的变量缓存机制
2021/01/24 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
海蓝之谜(LA MER)澳大利亚官方商城:全球高端奢华护肤品牌
2017/10/27 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
开展批评与自我批评发言材料
2014/10/17 职场文书
小学英语复习计划
2015/01/19 职场文书
爱心捐款活动总结
2015/05/09 职场文书
任长霞观后感
2015/06/16 职场文书
2016公司年会主持词
2015/07/01 职场文书
调研报告的主要写法
2019/04/18 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB