您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
基于OpenCV的手掌检测和手指计数
 
作者:努比
  2505  次浏览      16
 2021-3-15  
 
编辑推荐:
本文主要介绍了OpenCV通过导入库python导入图像,使用余弦定理识别手指等内容。
本文来自于小白学视觉 ,由火龙果软件Linda编辑、推荐。

利用余弦定理使用OpenCV-Python实现手指计数与手掌检测。

手检测和手指计数

接下来让我们一起探索以下这个功能是如何实现的。

OpenCV

OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库。OpenCV的构建旨在为计算机视觉应用程序提供通用的基础结构,并加速在商业产品中使用机器感知。

导入库

cv2: opencv [pip install opencv]

numpy:用于处理数组和数学[pip install numpy]

import cv2 as cv
import numpy as npt

导入图像

img_path = "data/palm.jpg"
img = cv.imread(img_path)
cv.imshow('palm image',img)

手掌图像

皮肤Mask

用于突出显示图像上的特定颜色。

hsvim:将BGR(蓝色,绿色,红色)图像更改为HSV(色相,饱和度,值)。

较低:HSV中的肤色范围较小。

upper:HSV中皮肤颜色的上限。

skinRegionHSV:在HSV色彩空间的上下像素值范围内检测皮肤。

模糊:使图像模糊以改善遮罩。

脱粒:脱粒。

hsvim = cv.cvtColor (img, cv.COLOR_BGR2HSV)
lower = np.array ([0, 48, 80], dtype = "uint8")
upper = np.array ([20, 255, 255], dtype = "uint8")
skinRegionHSV = cv.inRange(hsvim, lower, upper)
blurred = cv.blur(skinRegionHSV, (2,2))
ret,thresh = cv.threshold (blurred,0,255,cv.THRESH_BINARY)
cv.imshow ("thresh", thresh)

处理结果

轮廓线绘制

现在让我们在图像上找到轮廓。

contours, hierarchy = cv.findContours (thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
contours = max(contours, key=lambda x: cv.contourArea(x))
cv.drawContours (img, [contours], -1, (255,255,0), 2)
cv.imshow("contours", img)

手掌轮廓线

凸包检测

hull = cv.convexHull(contours)
cv.drawContours (img, [hull], -1, (0, 255, 255), 2)
cv.imshow("hull", img)

检测结果

凸缺陷检测

手掌与凸包检测轮廓线的任何偏离的地方都可以视为凸度缺陷。

hull = cv.convexHull (contours, returnPoints=False)
defects = cv.convexityDefects (contours, hull)

凸缺陷示例

余弦定理

现在,这是数学时间!让我们了解余弦定理。

在三角学中,余弦定律将三角形边的长度与其角度之一的余弦相关。使用如图1所示的符号表示,余弦定律表明,其中γ表示长度a和b的边之间的长度以及与长度c的边相对的角度。

图1

式:

通过现在看这个公式,我们知道如果有的话;a,b和gama然后我们也找到c以及是否有c ; a,b,c然后我们也找到伽玛(反之亦然)

为了找到伽玛,使用以下公式:

使用余弦定理识别手指

图2

在图2中,我画了一个Side:a,b,c和angle:gamma。现在,该伽马始终小于90度,因此可以说:如果伽马小于90度或pi / 2,则将其视为手指。

手指个数计算

注意:如果您不熟悉凸出缺陷,可以阅读文章

凸缺陷返回一个数组,其中每一行都包含以下值:

起点

终点

最远点

到最远点的大概距离

通过这一点,我们可以轻松得出Sides:a,b,c(请参见CODE),并且根据余弦定理,我们还可以得出两根手指之间的伽马或角度。如前所述,如果伽玛小于90度,我们会将其视为手指。知道伽玛后,我们只需画一个半径为4的圆,到最远点的近似距离即可。在将文本简单地放入图像中之后,我们就表示手指数(cnt)。

if defects is not None:
cnt = 0
for i in range (defects.shape[0]): # calculate the angle
s, e, f, d = defects[i][0]
start = tuple(contours[s][0])
end = tuple(contours[e][0])
far = tuple(contours[f][0])
a = np.sqrt ((end[0] - start[0]) ** 2 + (end[1] - start[1]) ** 2)
b = np.sqrt ((far[0] - start[0]) ** 2 + (far[1] - start[1]) ** 2)
c = np.sqrt ((end[0] - far[0]) ** 2 + (end[1] - far[1]) ** 2)
angle = np.arccos ((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)) # cosine theorem
if angle <= np.pi / 2: # angle less than 90 degree, treat as fingers
cnt += 1
cv.circle (img, far, 4, [0, 0, 255], -1)
if cnt > 0:
cnt = cnt+1
cv.putText (img, str(cnt), (0, 50), cv.FONT_HERSHEY_SIMPLEX,1, (255, 0, 0) , 2, cv.LINE_AA)

让我们看看最终结果

cv.imshow('final_result',img)

我们也可以通过调用“ cv.VideoCapture()”来对视频执行此操作。代码

 

   
2505 次浏览       16
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]
 
最新文章
多目标跟踪:AI产品经理需要了解的CV通识
深度学习架构
卷积神经网络之前向传播算法
从0到1搭建AI中台
工业机器人控制系统架构介绍
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
更多...   
成功案例
某综合性科研机构 人工智能与机器学习应用
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow框架实践
某领先数字地图提供商 Python数据分析与机器学习
中国移动 人工智能、机器学习和深度学习
更多...