OpenCV-Python报错:Overload resolution failed: Scalar value for argument ‘color’ is not numeric
在OpenCV中,许多绘图函数中的颜色参数接受的类型是cv::Scalar
,这个类型表示一个多元素(最多4个)的标量。而在Matplotlib中,颜色的表达方式有更多种:字符、RGB等,初学者常常将Matplotlib种的颜色表示法混用到OpenCV种,导致一系列错误。
下面就三类经典的犯错方式进行示例和纠正:
错误原因1:传入的颜色参数是字符串
import cv2
canvas = np.zeros((300, 300, 3), dtype='uint8')
for _ in range(1):
r = np.random.randint(0, 200)
center = np.random.randint(0, 300, size=(2, ))
color = np.random.randint(0, 255, size=(3, ))
# 直接使用'r'表示红色,错误
cv2.circle(canvas, tuple(center), r, 'r', thickness=-1)
cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
正确的方式是,已知红色的BGR值是(0,255,0),代码应改为:
import cv2
canvas = np.zeros((300, 300, 3), dtype='uint8')
for _ in range(1):
r = np.random.randint(0, 200)
center = np.random.randint(0, 300, size=(2, ))
color = np.random.randint(0, 255, size=(3, ))
# 使用[0,255,0]表示红色,正确
cv2.circle(canvas, tuple(center), r, [0,255,0], thickness=-1)
cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
错误原因2:传入的颜色参数是numpy数组
在较新的opencv版本中,color参数不能传入numpy数组,只能传入list或tuple。错误示例:
import cv2
canvas = np.zeros((300, 300, 3), dtype='uint8')
for _ in range(1):
r = np.random.randint(0, 200)
center = np.random.randint(0, 300, size=(2, ))
color = np.random.randint(0, 255, size=(3, ))
# 直接使用numpy数组,即便数据类型是int也会报错
cv2.circle(canvas, tuple(center), r, color=np.array((int(centroid_color[0]),int(centroid_color[1]),int(centroid_color[2]))), thickness=-1)
cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
总结
报错Scalar value for argument ‘color‘ is not numeric
的根本原因是用户传入的color参数类型不符合要求,应尽量使传入的参数为包含三个元素的list或tuple。在OpenCV4中,实测不需要设置numpy数组的int64或int32类型,转换为list即可,不需要考虑数据类型问题。