OpenCV中cv2.inRange()参数尺寸不匹配报错,如何解决?
解决OpenCV inRange函数的尺寸不匹配错误
嘿,这个错误的根源很明显,你不小心犯了一个小疏忽:
你写的hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)是把BGR图像转换成了单通道的灰度图,但你定义的l_b和u_b是三通道的数组(对应HSV的三个通道阈值)。cv2.inRange要求输入的图像和阈值数组的尺寸/通道数必须匹配,单通道图像和三通道阈值自然会报错。
正确的修正步骤:
- 首先把颜色转换的参数改成
cv2.COLOR_BGR2HSV,这样才能得到三通道的HSV图像,和你的阈值数组匹配:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) - 另外别忘了在代码最后加上窗口等待和销毁的代码,不然显示的窗口会直接一闪而过:
cv2.waitKey(0) cv2.destroyAllWindows()
完整的修正代码:
import cv2 import numpy as np frame = cv2.imread('lena.jpg') # 修正颜色转换:BGR转HSV而非灰度 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 蓝色的HSV阈值范围 l_b = np.array([110,50,50]) u_b = np.array([130,255,255]) mask = cv2.inRange(hsv, l_b, u_b) cv2.imshow('frame', mask) # 添加窗口控制代码 cv2.waitKey(0) cv2.destroyAllWindows()
额外说明:
如果你的需求真的是处理灰度图,那阈值数组也要改成单通道的,比如l_b=np.array([50])、u_b=np.array([130]),但从你用的阈值范围来看,你应该是想提取蓝色区域,所以上面的修正才是正确的方向。
内容的提问来源于stack exchange,提问作者Senuda Jayalath




