如何使用python中的opencv使用轮廓屏蔽视频帧

时间:2015-07-13 13:05:58

标签: python opencv image-processing matplotlib

我在python中使用opencv(cv2模块)来识别视频中的对象。在每个帧中,我想提取一个特定的区域,即轮廓。从opencv docs学习后,我有以下代码段:

        # np is numpy module, contours are expected results,
        # frame is each frame of the video

        # Iterate through the contours.
        for contour in contours:
            # Compute the bounding box for the contour, draw
            # it on the frame, and update the text.
            x, y, w, h = cv2.boundingRect(contour)

            # Find the mask and build a histogram for the object.
            mask = np.zeros(frame.shape[:2], np.uint8)
            mask[y:h, x:w] = 255
            masked_img = cv2.bitwise_and(frame, frame, mask = mask)
            obj_hist = cv2.calcHist([masked_img], [0], None, [256], [0, 256])

但是,当我使用matplotlib来显示masked_img时,它会返回一个暗图像。 obj_hist只有一个数字大于0的元素,这是第一个。有什么问题?

1 个答案:

答案 0 :(得分:2)

问题在于您在蒙版中设置值的方式。特别是这一行:

mask[y:h, x:w] = 255

您正尝试使用y:hx:w切换到图像的每个维度以设置遮罩。冒号左侧是起始行或列,冒号右侧表示结束行或列。鉴于您从y开始,您需要{{1>}使用相同的引用h 偏移 ...同样适用于yx

在冒号的正确值小于左边的情况下进行切片不会以任何方式修改数组,这就是为什么你没有得到任何输出的原因,因为当你最初全部为零时你没有修改掩码

你可能打算这样做:

w

这会将mask[y:y+h, x:x+w] = 255 给出的正确区域正确设置为白色(255)。