我在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
的元素,这是第一个。有什么问题?
答案 0 :(得分:2)
问题在于您在蒙版中设置值的方式。特别是这一行:
mask[y:h, x:w] = 255
您正尝试使用y:h
和x:w
切换到图像的每个维度以设置遮罩。冒号左侧是起始行或列,冒号右侧表示结束行或列。鉴于您从y
开始,您需要{{1>}使用相同的引用h
偏移 ...同样适用于y
和x
。
在冒号的正确值小于左边的情况下进行切片不会以任何方式修改数组,这就是为什么你没有得到任何输出的原因,因为当你最初全部为零时你没有修改掩码
你可能打算这样做:
w
这会将mask[y:y+h, x:x+w] = 255
给出的正确区域正确设置为白色(255)。