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获取豆瓣电影简介代码分享
Jan 16 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
十分钟利用Python制作属于你自己的个性logo
May 07 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
django云端留言板实例详解
Jul 22 Python
Django REST Framework之频率限制的使用
Sep 29 Python
Django框架安装方法图文详解
Nov 04 Python
pytorch自定义二值化网络层方式
Jan 07 Python
基于Python爬取fofa网页端数据过程解析
Jul 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实现二维数组根据key进行排序的方法
2016/12/30 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
json 定义
2008/06/10 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
javascript几个易错点记录
2014/11/26 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Python流程控制 while循环实现解析
2019/09/02 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
公司营业员的工作总结自我评价
2013/10/05 职场文书
成人继续教育实施方案
2014/03/01 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
党支部对照检查材料
2014/08/25 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
运动会观后感
2015/06/09 职场文书