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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
深入理解Django-Signals信号量
Feb 19 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
python中常见错误及解决方法
Jun 21 Python
高考考python编程是真的吗
Jul 20 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 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 获取mysql数据库信息代码
2009/03/12 PHP
PHP clearstatcache()函数详解
2010/03/02 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
PHP微信支付实例解析
2016/07/22 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
js中indexof的用法详细解析
2013/12/24 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
pycharm实现猜数游戏
2020/12/07 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
公司司机岗位职责范本
2014/03/03 职场文书
武侯祠导游词
2015/02/04 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python