打开CV手部识别 - 使手掌的背投影更准确吗?

时间:2017-01-26 16:16:07

标签: python python-2.7 opencv opencv3.0 opencv-contour

我使用直方图反投影来检测网络摄像头视频中的手掌。 我完全掌握了手掌的轮廓。问题是,我的脸和其他"肤色"像对象也被检测到。 如何使我的直方图仅检测到我的手掌而不是其他任何东西(提高直方图精度)?

在运行程序之前,我使用手掌图像的一个区域来计算直方图。 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)

2 个答案:

答案 0 :(得分:1)

由于您使用的是颜色直方图,因此很难防止其他类似的颜色对象被分割。因此,一旦图像分割完成并且手和其他东西被分割,你可以使用连接的组件然后分离出手区域(通过特征匹配{手的特征将与噪声特征不同})。

您可以探索的另一件事是时间超像素匹配。如果您可以在第一帧中找到手的确切边界,则可以使用直方图在连续帧中对其进行分割,然后通过在时间上匹配超像素来定位手区域。

答案 1 :(得分:0)

您可以使用Haarcascade检测面部,然后只需戴上面具并将其移除