使用开放式CV和Python

时间:2016-09-22 14:07:51

标签: python opencv image-processing

我尝试使用OpenCV2和Python3将部分图像绘制为黑白图像。这是我尝试的代码:

(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x,y), (x+w,y+h),0,0)
sub_face = frame[y:y+h, x:x+w]
# apply a gaussian blur on this new recangle image
# sub_face = cv2.GaussianBlur(sub_face,(9, 9), 30, borderType = 0)
sub_face = cv2.cvtColor(sub_face, cv2.COLOR_BGR2GRAY)

# merge this blurry rectangle to our final image
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face

当我应用GaussianBlur方法时,它可以正常工作,但是当我尝试使用cvtColor方法时,它会失败并显示一条消息(在最后一行):无法将输入数组从形状(268,182)广播到形状(268,182,3) 。我做错了什么?

第一行中的 c 变量是一个轮廓(来自运动检测)。

我是Python和OpenCV的新手。

谢谢!

2 个答案:

答案 0 :(得分:2)

您正尝试将cv2.cvtColor调用产生的单个频道同时分配到三个频道,因为result_frame是RGB /三频道图像。您可能希望将单个通道分配给所有三个通道。干净利落的一种方法是通过在第三维中创建单个通道来利用NumPy broadcasting,然后通过所有通道广播结果。由于您使用OpenCV的cv2接口,因此用于操作图像的本机数据类型是NumPy数组:

# merge this blurry rectangle to our final image
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face[:,:,None]

此上下文中的:操作访问特定维度中的所有值。在这种情况下,我们需要第一维和第二维。因此,sub_face[:,:,None]将使您的单通道图像3D具有第三维(即1)。然后,使用NumPy广播将广播此单个频道图像同时发送到所有频道。

请注意,在分配给result_frame时,我没有必要明确访问第三维。这是因为result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]]result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1],:]与您指定的最后一个维度隐含地假设:之后删除索引相同。

答案 1 :(得分:0)

您将sub_face转换为单个通道图像,但result_frame是3通道图像。

在最后一行中,您尝试将单个通道阵列分配给3通道切片。

你可以这样做:

result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 0] = sub_face
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 1] = sub_face
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 2] = sub_face
相关问题