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爬取软考试题之ip自动代理
Mar 28 Python
python使用opencv读取图片的实例
Aug 17 Python
python实现字符串和字典的转换
Sep 29 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
Python内置random模块生成随机数的方法
May 31 Python
Python依赖包整体迁移方法详解
Aug 15 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
python全面解析接口返回数据
Feb 12 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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上传文件的增强函数
2010/07/21 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
简单实现Python爬取网络图片
2018/04/01 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
wxpython布局的实现方法
2019/11/01 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
Yahoo-PHP面试题3
2012/01/14 面试题
大学生职业规划论文
2014/01/11 职场文书
拾金不昧的表扬信
2014/01/16 职场文书
师德个人剖析材料
2014/02/02 职场文书
班主任对学生的评语
2014/04/26 职场文书
思想作风建设心得体会
2014/10/22 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书