使用OpenCV Python将颜色从黑色反转为白色

6
我有一个需求,希望在黑色背景下检测白线,白色背景下检测黑线。我使用了位反操作,类似于以下代码:
cv2.bitwise_not(mask_black)

它一直完美运行,直到我添加了这样的条件:

if mask_black == cv2.bitwise_not(mask_black):

我遇到了一个错误

数值错误:具有多个元素的数组的真值是不明确的。请使用a.any()或a.all()

我对在条件语句中使用if黑色背景则检测白线、如果白色背景则检测黑线感到疑虑。

mask_black = cv2.inRange(hsv, low_black, high_black)
mask_not=cv2.bitwise_not(mask_black)

if mask_black==cv2.bitwise_and(mask_black, mask_not):
    body 
else:
    body

这里返回了上述错误。
3个回答

8
invert = cv2.bitwise_not(image)

这个完美地运作。


7

这个想法是使用cv2.countNonZero()检查白色像素的背景。 我们设置一个阈值,比如说50%。 如果背景中超过50%是白色像素,则表示我们正在寻找黑色线条。 同样,如果背景大多是黑色,则表示我们正在寻找白色线条。

import cv2

image = cv2.imread('1.png', 0)
w, h = image.shape[:2]

if cv2.countNonZero(image) > ((w*h)//2):
    # Detect black line
    ...
else:
    # Detect white line
    ...

要反转图像,您可以执行以下操作:

invert = cv2.bitwise_not(image) # OR
#invert = 255 - image


实际上,我正在使用Pi相机进行实时流媒体和查找轮廓,因此我的分辨率设置为100,100。所以我将100,100用作w,h。如果我使用上面的代码,我会得到以下错误“too many values to unpack”或“error:(-215) cn ==1 in function countNonZero”。 - Spartan
不要直接使用代码,而是使用代码的主要思想。主要思想是确定图像中白色像素的数量,然后根据数量检查白线或黑线。还要确保将灰度图像(仅1通道)传递给cv2.countNonZero()函数。由于您正在使用Pi相机,在将图像放入函数gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)之前将其转换为灰度图像。 - nathancy
我按照你说的继续进行,但是出现了 AttributeError: 'NoneType' object has no attribute 'shape' 的错误。也许这个错误是由于实时视频捕获引起的。 - Spartan
该错误是由于捕获的帧不正确/无效导致的。请确保status代码有效。 - nathancy
非常感谢您的建议,现在灰度显示已经可以了,但整个屏幕显示的是轮廓而不是只有白色或黑色,对此有什么建议吗? - Spartan
这超出了本帖的范围,你可能需要提一个新问题来询问。 - nathancy

1
使用cv2.bitwise_and(mask_black, mask_not),其中mask_notcv2.bitwise_not(mask_black)

出现相同的错误 if cv2.bitwise_and(mask_black, mask_not) : ValueError: 数组中有多个元素的真值是不明确的。请使用 a.any() 或 a.all() - Spartan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接