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中的With语句
Feb 02 Python
Python 性能优化技巧总结
Nov 01 Python
详解Python文本操作相关模块
Jun 22 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 Python
Python2与Python3的区别实例总结
Apr 17 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
python 字符串格式化的示例
Sep 21 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
php5.2.0内存管理改进
2007/01/22 PHP
php GeoIP的使用教程
2011/03/09 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
JS实现滑动插件
2020/01/15 Javascript
javascript实现评分功能
2020/06/24 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python中自定义函数的教程
2015/04/27 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
基于python生成器封装的协程类
2019/03/20 Python
详解【python】str与json类型转换
2019/04/29 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
python实现视频读取和转化图片
2019/12/10 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
为什么要有struct关键字
2012/05/08 面试题
C#笔试题集合
2013/06/21 面试题
试用期员工考核制度
2014/01/22 职场文书
小学体育教学反思
2014/01/31 职场文书
企业办公室主任岗位职责
2014/02/19 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers