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 序列的方法总结
Oct 18 Python
Python绘制七段数码管实例代码
Dec 20 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
python处理multipart/form-data的请求方法
Dec 26 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
使用python绘制横竖条形图
Apr 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
Python自动化开发学习之三级菜单制作
2017/07/14 Python
python散点图实例之随机漫步
2018/08/27 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
TCP/IP的分层模型
2013/10/27 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
财政局长自荐信范文
2013/12/22 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
新年联欢会主持词
2014/03/27 职场文书
教师业务学习材料
2014/12/16 职场文书
会议主持人开场白台词
2015/05/28 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
JavaScript异步操作中串行和并行
2021/11/20 Javascript