网络编程
位置:首页>> 网络编程>> Python编程>> python实现手势识别的示例(入门)

python实现手势识别的示例(入门)

作者:露露核桃露  发布时间:2021-02-17 03:52:55 

标签:python,手势识别

使用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几天,做出这个东西自己已经很满足了,当然和那些大佬也是没法比的,没有什么东西是速成的,只能一步一个脚印的走。

来源:https://blog.csdn.net/qq_45874897/article/details/105516981

0
投稿

猜你喜欢

  • 1.筛选出目标值所在行 单列筛选# df[列名].isin([目标值])对当前列中存在目标值的行会返回True,不存在的返回Fal
  • 开发工具Python版本:3.6.4相关模块:cv2模块;以及一些Python自带的模块。环境搭建安装Python并添加到环境变量,pip安
  • 下载中间件在每一个scrapy工程中都有一个名为 middlewares.py 的文件,这个就是中间件文件其中下载中间件的类为 XxxDow
  • 安装pygal,可参阅:pip和pygal的安装实例教程基本XY线:import pygalfrom math import cos&quo
  • 前言在深度学习中,有时候我们需要对某些节点的梯度进行一些定制,特别是该节点操作不可导(比如阶梯除法如 ),如果实在需要对这个节点进行操作,
  • 方法一在 Pillow 中,resize() 方法会强制将图片缩放到指定的大小,可能会导致图片变形或失真;而 thumbnail() 方法则
  • 成天都要与样式打交道的朋友,相信对CSS选择符(CSS Selectors)都不会陌生。不过对于刚接触或者还不是很熟悉css的朋友来说,能够
  • 很常见的一个图片轮播Flash,使用之后发现在IE下按F5刷新之后Flash区域就变成一大块背景色,内容轮播出不来了。有趣的是右键点击Fla
  • 在网页设计发展到一定阶段的时候就必然会和其他学科或领域只是产生交汇和共鸣,在阅读《超越CSS:web设计艺术精髓》这本书的时候,发现原来we
  • 在工作和学习中如果同时传输多个文件,大的安装包,python提供了一种无线传输的方法,开启一个本地http服务器,同一局域网下可方便访问 经
  • 背景最近在搞爬虫,很多小组件里面都使用了 Python 的 requests 库,很好用,很强大。但最近发现很多任务总是莫名其妙的卡住,不报
  • 一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断。例如:复制代码a =
  • 在写 Python 代码的时候,一个很好的编码实践就是使得你的代码简洁,易懂。组织代码,设置变量,以及给函数有意义的名字,都是几个不错的方法
  • Zeroc Ice简介  Zeroc ICE(Internet Communications Engine ,互联网通信引擎)是目前功能比较
  • 在日常工作中,可能会遇到各类表格合并的需求。这类需求只要搞懂核心原理都很简单,本质都是万变不离其宗,相信大部分读者都能解决大部分需求。基本思
  • 前天不小心把硬盘格式化了,丢了好多照片,后来用Recuva这款软件成功把文件恢复过来,可是恢复的文件中有好多重复的文件和无法打开的图片,所以
  • 一、情景     eg:查看一条数据的详情,需要跳转页面,并进行传值二、思路方式1:触发详情按钮时,Js获取到
  • 本文实例为大家分享了python实现通讯录系统的具体代码,供大家参考,具体内容如下一、首先,给大家看一下这个系统的主菜单效果如下:二、步骤分
  • 元素的CSS样式,除了包括内联的(即通过style属性加上的)样式定义外,还有页面嵌入的css和外部引入的css两种方式。但在JS中通过el
  • 今天小编来和大家聊一下Python当中的altair可视化模块,并且通过调用该模块来绘制一些常见的图表,借助Altair,我们可以将更多的精
手机版 网络编程 asp之家 www.aspxhome.com