gpt4 book ai didi

python - 使用开放式 CV 和 Python 制作黑白图像轮廓

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:49 25 4
gpt4 key购买 nike

我正在尝试使用 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 的新手。

谢谢!

最佳答案

您正在尝试将 cv2.cvtColor 调用产生的单个 channel 同时分配给三个 channel ,因为 result_frame 是 RGB/三 channel 图像。您可能想要将单个 channel 分配给所有三个 channel 。干净地执行此操作的一种方法是利用 NumPy broadcasting通过在三维中创建一个单例 channel ,然后在所有 channel 上广播结果。由于您使用的是 OpenCV 的 cv2 接口(interface),因此用于处理图像的 native 数据类型是 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] 将使您的单 channel 图像成为 3D,第三个维度为单个(即 1)。然后使用 NumPy 广播将这个单 channel 图像同时广播到所有 channel 。

请注意,在分配给 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],:] 与在您指定的最后一个维度之后删除索引是一样的,隐式假设 :

关于python - 使用开放式 CV 和 Python 制作黑白图像轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com