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 相关文章推荐
django创建自定义模板处理器的实例详解
Aug 14 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
python 实现全球IP归属地查询工具
Dec 18 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
Python快速优雅的批量修改Word文档样式
May 20 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php实现短信发送代码
2015/07/05 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
Python面向对象特殊成员
2017/04/24 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
python中sys.argv函数精简概括
2018/07/08 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
物业门卫岗位职责
2013/12/28 职场文书
珍惜资源的建议书
2014/08/26 职场文书
项目备案申请报告
2015/05/15 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
Python中super().__init__()测试以及理解
2021/12/06 Python
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏