Vision informatique: masquer une main humaine

j'aimerais détecter ma main à partir d'un flux vidéo en direct et créer un masque de ma main. Cependant, comme vous pouvez le voir sur la photo, j'obtiens de très mauvais résultats.

mon but est de suivre le mouvement de la main, donc ce que j'ai fait était de convertir le flux vidéo de BGR à L'espace de couleur HSV puis j'ai battu l'image afin d'isoler la couleur de ma main, puis j'ai essayé de trouver les contours de ma main bien que le résultat final n'est pas tout à fait ce que je voulais atteindre.

comment améliorer le résultat final?

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

voici le lien avec les photos: https://picasaweb.google.com/103610822612915300423/February7201303 . Nouveau lien avec image plus contours, masque et original. https://picasaweb.google.com/103610822612915300423/February7201304

et voici un exemple d'image d'en haut:

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

11
demandé sur wind85 2013-02-07 17:14:10
la source

2 ответов

il y a plusieurs façons d'effectuer le seuil de pixel-sage pour séparer les" pixels de peau "des" pixels non-peau", et il y a des papiers basés sur pratiquement n'importe quel espace coloré (même avec RVB). Donc, ma réponse est simplement basée sur la Segmentation du visage de papier en utilisant la carte de couleur de peau dans les Applications vidéophone par Chai et Ngan. Ils ont travaillé avec le YCbCr colorspace et ont obtenu de très bons résultats, le papier mentionne également un seuil qui a bien fonctionné pour eux:

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

le les seuils pour le canal Y ne sont pas spécifiés, mais il y a des documents qui mentionnent Y > 80 . Pour votre image simple, Y dans l'ensemble de la gamme est très bien, c'est-à-dire qu'il n'a pas d'importance pour réellement distinguer la peau.

Voici l'entrée, l'image binaire selon les seuils mentionnés, et l'image résultante après avoir écarté de petits composants.

enter image description here enter image description here enter 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

enfin, il existe un nombre tout à fait décent de documents qui ne reposent pas sur une classification par pixel sage pour cette tâche. Au lieu de cela, ils commencent à partir d'une base d'images étiquetées qui sont connues pour contenir des pixels de peau ou des pixels non-peau. À partir de là, ils forment, par exemple, un SVM et distinguent ensuite d'autres entrées basées sur ce Classificateur.

14
répondu mmgp 2013-02-07 20:44:14
la source

une option simple et puissante est rétroprojection histogramme . Par exemple, créez un histogramme 2D en utilisant H et S (à partir de l'espace de couleur HSV) ou a* et b* (à partir de L'espace de couleur La*b*), en utilisant des pixels de différentes entraînement images de votre main. Puis utilisez [cv2.calcBackProject] [1] pour classer les pixels dans votre flux. Il est très rapide et vous devriez obtenir 25 à 30 fps facilement, je suppose. Notez que c'est une façon d'apprendre la distribution de couleur de votre objet d'intérêt. La même méthode peut être utilisée dans d'autres situations.

3
répondu TH. 2013-02-08 14:49:24
la source

Autres questions sur