计算机视觉:掩蔽人手

2024-06-10 07:57:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从现场视频流中检测我的手,并创建一个我的手的面具。不过,正如你从照片上看到的,我的成绩很差。

我的目标是跟踪手的运动,所以我所做的是将视频流从BGR转换成HSV颜色空间,然后对图像进行阈值处理以分离手的颜色,然后我试图找到手的轮廓,尽管最终的结果并不是我想要的。

我怎样才能提高最终结果呢?

import cv2
import numpy as np

cam = cv2.VideoCapture(1)
cam.set(3,640)
cam.set(4,480)
ret, image = cam.read()

skin_min = np.array([0, 40, 150],np.uint8)
skin_max = np.array([20, 150, 255],np.uint8)    
while True:
    ret, image = cam.read()

    gaussian_blur = cv2.GaussianBlur(image,(5,5),0)
    blur_hsv = cv2.cvtColor(gaussian_blur, cv2.COLOR_BGR2HSV)

#threshould using min and max values
    tre_green = cv2.inRange(blur_hsv, skin_min, skin_max)
#getting object green contour
    contours, hierarchy = cv2.findContours(tre_green,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#draw contours
    cv2.drawContours(image,contours,-1,(0,255,0),3)

    cv2.imshow('real', image)
    cv2.imshow('tre_green', tre_green)   

    key = cv2.waitKey(10)
    if key == 27:
        break

这里有图片链接:https://picasaweb.google.com/103610822612915300423/February7201303。 新的链接图像加轮廓,遮罩,和原始。 https://picasaweb.google.com/103610822612915300423/February7201304

这是上面的一张照片:

Sample picture of a torso with arms ... and a hand


Tags: 图像image颜色npgreenmincv2照片
2条回答

一个简单而强大的选项是直方图反投影。例如,使用H和S(来自HSV颜色空间)或a*和b*(来自La*b*颜色空间)创建二维直方图,使用手的不同training图像的像素。然后使用[cv2.calcBackProject][1]对流中的像素进行分类。它非常快,你应该很容易得到25至30帧,我想。注意这是一种学习感兴趣对象的颜色分布的方法。同样的方法也可以用于其他情况。

有很多方法可以执行像素阈值来分离“皮肤像素”和“非皮肤像素”,并且有一些论文基于几乎任何颜色空间(即使是使用RGB)。所以,我的答案只是基于Chai和Ngan在可视电话应用中使用肤色图的纸张人脸分割。他们使用了YCbCr的色彩空间,得到了很好的结果,论文还提到了一个对他们很有效的阈值:

(Cb in [77, 127]) and (Cr in [133, 173])

没有指定Y通道的阈值,但是有些文章提到Y > 80。对于您的单个图像,整个范围内的Y都很好,也就是说,实际上区分皮肤并不重要。

这里是输入,根据所述阈值的二值图像,以及丢弃小分量后的结果图像。

enter image description hereenter image description hereenter image description here

import sys
import numpy
import cv2

im = cv2.imread(sys.argv[1])
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)

skin_ycrcb_mint = numpy.array((0, 133, 77))
skin_ycrcb_maxt = numpy.array((255, 173, 127))
skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)
cv2.imwrite(sys.argv[2], skin_ycrcb) # Second image

contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, 
        cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(contours):
    area = cv2.contourArea(c)
    if area > 1000:
        cv2.drawContours(im, contours, i, (255, 0, 0), 3)
cv2.imwrite(sys.argv[3], im)         # Final image

最后,有相当数量的论文不依赖于单独的像素分类来完成这项任务。取而代之的是,它们从已知包含皮肤像素或非皮肤像素的标记图像的基部开始。例如,他们训练一个支持向量机,然后根据这个分类器区分其他输入。

相关问题 更多 >