Как получить порог для распознавания цвета кожи?

Я изменял код OpenCV 3.0 Python, чтобы распознавать жесты рук, рисуя контур вокруг пальцев, используя выпуклый корпус для распознавания точек на кончиках пальцев.

В любом случае, код работает, но он работает только с темным (черноватым) фоном. Код использует порог для бинаризации изображения, поэтому самой яркой формой будет рука (поэтому фон черный, а форма руки белая).

Как я могу изменить порог, чтобы бинаризировать изображение, чтобы просто выбрать цвет кожи, а не самые яркие цвета?

Например, после завершения бинаризации черная часть изображения видеопотока будет иметь все цвета, кроме телесных, а белая часть бинарного изображения будет телесного цвета.

Вот код:

def readCamera(self):
    _, self.original = self.cap.read()
    self.original = cv2.flip(self.original, 1)

def threshold(self):

    hsv = cv2.cvtColor(self.original, cv2.COLOR_BGR2HSV)

    value = (31, 31)
    blurred = cv2.GaussianBlur(hsv, value, 0)
    _, self.thresholded = cv2.threshold(hsv[:,:,0], 0, 255,
                                        cv2.THRESH_BINARY+cv2.THRESH_OTSU)

def extractContours(self):
    _, self.contours, _ = cv2.findContours(self.thresholded.copy(),
                                        cv2.RETR_TREE,
                                        cv2.CHAIN_APPROX_SIMPLE)

person BlindHouse    schedule 03.03.2016    source источник
comment
взгляните на функцию inRange. Если вы можете определить цветовой диапазон для кожи (лучше в пространстве HSV), он будет работать намного лучше, чем пороги otsu.   -  person Miki    schedule 03.03.2016


Ответы (1)


Как только вы конвертируете кадр в HSV, цвет кожи становится более зеленоватым. Примените фильтр RGB к этому изображению, чтобы отфильтровать часть кожи. При необходимости используйте трекбары, как показано ниже:

import cv2

def nothing(x): #needed for createTrackbar to work in python.
    pass    

cap = cv2.VideoCapture(0)
cv2.namedWindow('temp')
cv2.createTrackbar('bl', 'temp', 0, 255, nothing)
cv2.createTrackbar('gl', 'temp', 0, 255, nothing)
cv2.createTrackbar('rl', 'temp', 0, 255, nothing)
cv2.createTrackbar('bh', 'temp', 255, 255, nothing)
cv2.createTrackbar('gh', 'temp', 255, 255, nothing)
cv2.createTrackbar('rh', 'temp', 255, 255, nothing)
while true
        ret,img=cap.read()#Read from source
        hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
        bl_temp=cv2.getTrackbarPos('bl', 'temp')
        gl_temp=cv2.getTrackbarPos('gl', 'temp')
        rl_temp=cv2.getTrackbarPos('rl', 'temp')
        bh_temp=cv2.getTrackbarPos('bh', 'temp')
        gh_temp=cv2.getTrackbarPos('gh', 'temp')
        rh_temp=cv2.getTrackbarPos('rh', 'temp')
        thresh=cv2.inRange(hsv,(bl_temp,gl_temp,rl_temp),(bh_temp,gh_temp,rh_temp))
        if(cv2.waitKey(10) & 0xFF == ord('b')):
        break #break when b is pressed 
        cv2.imshow('Video', img)
        cv2.imshow('thresh', thresh)
person Saransh Kejriwal    schedule 03.03.2016
comment
Благодарю вас! это действительно помогло мне. У меня все еще есть проблемы с распознаванием только руки, но в целом он делает то, что мне нужно. - person BlindHouse; 06.03.2016