OpenCV python inRange 方法导致 C++ 模块出错
OpenCV python inRange method causes error in C++ module
当我调用我的方法时出现以下错误[错误后给出]。
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 2
让我们从解释错误开始:
lb.type() == ub.type() in function inRange
这意味着它在检查下限 (lb) 和上限 (up) 是否与函数 inRange 中的类型相同的断言中失败。
查看您的代码,上限看起来像是整数:
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 )
当我调用我的方法时出现以下错误[错误后给出]。
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)
知道问题出在哪里吗?我在其他相关问题中找不到解决方案:
让我们从解释错误开始:
lb.type() == ub.type() in function inRange
这意味着它在检查下限 (lb) 和上限 (up) 是否与函数 inRange 中的类型相同的断言中失败。
查看您的代码,上限看起来像是整数:
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 )