OpenCV python inRange方法导致C++模块出错

Posted

技术标签:

【中文标题】OpenCV python inRange方法导致C++模块出错【英文标题】:OpenCV python inRange method causes error in C++ module 【发布时间】:2018-03-04 19:02:11 【问题描述】:

当我调用我的方法时出现以下错误 [在错误之后给出]。

error: /feedstock_root/build_artefacts/opencv_1496434080029/work/opencv-3.2.0/modules/core/src/arithm.cpp:1984: error: (-215) lb.type() == ub.type() in function inRange

生成代码的代码就在这里。我没有看到我提供给函数 cv2.inRange 的代码有任何问题

def red_filter(rgb_image):
    hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2HSV)

    avg_brightness = average_brightness(hsv_image)
    avg_saturation = average_saturation(hsv_image)

    # Define our color selection boundaries in HSV values
    lower_red = np.array([0, avg_saturation, avg_brightness]) 
    upper_red = np.array([20,255,255])

    # Define the masked area
    hsv_mask = cv2.inRange(hsv_image, lower_red, upper_red)

    # Copy image
    hsv_masked_image = np.copy(hsv_image)

    #  Mask the image to let the light show through
    hsv_masked_image[hsv_mask != 0] = [0, 0, 0]

    # Display it!
    plt.imshow(hsv_masked_image)

知道问题可能是什么吗?我在其他相关问题中找不到解决方案:Question 1 & Question 2

【问题讨论】:

我的猜测是avg_saturationavg_brightness 可能是浮点数而不是整数......因此下限(lb)和上限(ub)有不同的类型 @api55 你想把它放在答案中吗?当我降低值时它会起作用。 好的,给我一分钟,我会把它作为答案 【参考方案1】:

让我们从解释错误开始:

lb.type() == ub.type() in function inRange

这意味着它在检查函数 inRange 中的下限 (lb) 和上限 (up) 是否属于同一类型的断言中失败。

查看您的代码,上限看起来像是 int 数字:

upper_red = np.array([20,255,255])
print (upper_red.dtype) # this prints dtype('int32')

现在,下限有 2 个变量,我不知道它们是什么(float、int 等)。我假设它们是浮点数,让我们看看如果我输入两个浮点数会发生什么。

lower_red  = np.array([0, 1.2, 2.7])
print (lower_red .dtype) # this prints out dtype('float64')

如您所见,它们不是同一类型。现在问题已经解释了,让我们继续讨论可能的解决方案:

最简单的一个,如果你想截断它:

lower_red  = np.array([0, 1.2, 2.7], dtype=np.int32)
print (lower_red.dtype) # this prints out dtype('int32')
print (lower_red) # [0, 1, 2]

这会产生与以下相同的结果:

lower_red  = np.array([0, int(1.2), int(2.7)])

如果您不想截断,您可以随时进行 round 或 ceil(floor 与截断相同)。

例如:

avg_saturation = int(np.round(average_saturation(hsv_image)))

或者如果它是非负数:

avg_saturation = int( average_saturation(hsv_image) + 0.5 )

【讨论】:

以上是关于OpenCV python inRange方法导致C++模块出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

从 Objective C++ 调用 OpenCv inRange 函数时的行为不同

opencv 彩色图像分割(inrange)

OpenCV inRange 更改 Mat 类型

在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange

opencv函数之cv.InRange函数