计算机视觉:掩盖人手

win*_*d85 11 python opencv computer-vision

我想从实时视频流中检测到我的手并创建一个我的手的面具.然而,正如你从图片中看到的那样,我的结果非常糟糕.

我的目标是跟踪手的运动,所以我所做的就是从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
Run Code Online (Sandbox Code Playgroud)

这里是图片链接:https://picasaweb.google.com/103610822612915300423/February7201303.带图像的新链接以及轮廓,蒙版和原始图像. https://picasaweb.google.com/103610822612915300423/February7201304

这是上面的示例图片:

腋下的样本图片有胳膊和手

mmg*_*mgp 14

有许多方法可以执行像素方式阈值以将"皮肤像素"与"非皮肤像素"分开,并且有几乎基于任何色彩空间(甚至使用RGB)的纸张.因此,我的答案仅仅基于Chai和Ngan在可视电话应用中使用肤色映射的纸张分割.他们使用YCbCr色彩空间并获得了相当不错的结果,该文章还提到了一个适合他们的阈值:

(Cb in [77, 127]) and (Cr in [133, 173])
Run Code Online (Sandbox Code Playgroud)

Y没有指定频道的阈值,但有些论文提到Y > 80.对于你的单个图像,Y整个范围都很好,即实际区分皮肤无关紧要.

这是输入,根据所提到的阈值的二进制图像,以及丢弃小组件后的结果图像.

在此输入图像描述 在此输入图像描述 在此输入图像描述

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
Run Code Online (Sandbox Code Playgroud)

最后,有相当数量的论文不依赖于单个像素分类来完成此任务.相反,它们从已知包含皮肤像素或非皮肤像素的标记图像的基础开始.从那里他们训练,例如,SVM,然后基于该分类器区分其他输入.