2017-01-26 3 views
1

Я использую обратную проекцию гистограммы, чтобы обнаружить мою ладонь в видеоролике веб-камеры. Я прекрасно понимаю контуры ладони. Проблема в том, что мое лицо и другие объекты «цвета кожи» также обнаруживаются. Как заставить мою гистограмму обнаруживать только мою ладонь и ничего больше (повышение точности гистограммы)?Открытое распознавание рук в ручном режиме - Изготовление спиныПроектирование ладони более точно?

Я использую область изображения моей ладони, чтобы вычислить гистограмму, прежде чем запускать программу. enter image description here

Обратите внимание на дверь и лицо получать обнаруживается в фоновом режиме:

Picture of the video feed: notice the door and face getting detected in the background

cap = cv2.VideoCapture(0) 
while True: 
    _, frame = cap.read() 
    frame = cv2.flip(frame, 1) 
    cv2.putText(frame, "Place region of the {} inside the box".format(objectName), (30,50), cv2.FONT_HERSHEY_SIMPLEX, 0.85, (255,0,105), 1, cv2.LINE_AA) 
    cv2.rectangle(frame, (100, 100), (150, 150), (255, 0 , 255), 2) 
    cv2.imshow("Video Feed", frame) 
    key = cv2.waitKey(10) 
    if key == 108: 
     objectColor = frame[100:150, 100:150] 
     break 
    if key == 27: 
     cv2.destroyAllWindows() 
     cap.release() 
     break 
hsvObjectColor = cv2.cvtColor(objectColor, cv2.COLOR_BGR2HSV) 
objectHist = cv2.calcHist([hsvObjectColor], [0,1], None, [12,15], [0,180,0,256]) 
cv2.normalize(objectHist, objectHist, 0,255,cv2.NORM_MINMAX) 

Следующий фрагмент кода обнаруживает ладонь, используя гистограмму выше.

hsvFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

objectSegment = cv2.calcBackProject([hsvFrame], [0,1], objectHist, [0,180,0,256], 1) 
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) 
cv2.filter2D(objectSegment, -1, disc, objectSegment) 
_, threshObjectSegment = cv2.threshold(objectSegment,70,255,cv2.THRESH_BINARY) 

threshObjectSegment = cv2.merge((threshObjectSegment,threshObjectSegment,threshObjectSegment)) 
locatedObject = cv2.bitwise_and(frame, threshObjectSegment) 

locatedObjectGray = cv2.cvtColor(locatedObject, cv2.COLOR_BGR2GRAY) 
_, locatedObjectThresh = cv2.threshold(locatedObjectGray, 70, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 
locatedObject = cv2.medianBlur(locatedObjectThresh, 5) 

ответ

0

Поскольку вы используете цветную гистограмму, очень сложно предотвратить разделение других похожих объектов цвета. Таким образом, как только сегментирование изображения выполняется, а рука и другие элементы сегментированы, вы можете использовать подключенные компоненты, а затем выделять область руки (путем сопоставления функций {функции стороны будут отличаться от характеристик шума}).

Еще одна вещь, которую вы можете изучить, - это сопоставление временных суперпикселей. Если вы можете найти точную границу руки в первом кадре, вы можете сегментировать ее в последовательных кадрах с помощью гистограммы, а затем находить область руки, временно сопоставляя суперпиксели.

0

Вы можете использовать Haarcascade для обнаружения лица, а затем просто положить маску и удалить его

+0

Если вы дать более подробную информацию о том, что (иллюстрирующей хорошей маске, к примеру), ваш ответ будет более полезным ... –

+0

Существует учебник по standex о том, как использовать Haar Cascades : (https://www.youtube.com/watch?v=88HdqNDQsEk) – BasuruK

Смежные вопросы