Python 如何在OpenCV中将numpy ndarray作为颜色传递?

Python 如何在OpenCV中将numpy ndarray作为颜色传递?,python,opencv,numpy,Python,Opencv,Numpy,我试图将一个数据数组传递到此行:cv2.fillPoly(im,pts=[cnt],color=(质心颜色[0],质心颜色[1],质心颜色[2]) 质心颜色如下所示:[0 255 0]类型为 然而,我一直得到这样的错误:TypeError:参数“color”的标量值不是数字 我如何正确地转换它 编辑:我当前更新的代码仍然收到相同的错误: im = cv2.imread('luffy.jpg') gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ret,thre

我试图将一个数据数组传递到此行:
cv2.fillPoly(im,pts=[cnt],color=(质心颜色[0],质心颜色[1],质心颜色[2])

质心颜色如下所示:
[0 255 0]
类型为

然而,我一直得到这样的错误:TypeError:参数“color”的标量值不是数字

我如何正确地转换它

编辑:我当前更新的代码仍然收到相同的错误:

im = cv2.imread('luffy.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)

contours,h = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    moment = cv2.moments(cnt)
    c_y = moment['m10']/(moment['m00']+0.01)
    c_x = moment['m01']/(moment['m00']+0.01)
    centroid_color = im[c_x,c_y]
    centroid_color = np.array((centroid_color[0],centroid_color[1],centroid_color[2]))
    r = lambda: random.randint(0,255)
    print type(centroid_color)
    cv2.fillPoly(im,cnt,centroid_color)

可以直接将numpy数组作为颜色参数传递,如下所示:

import numpy as np
import cv2

pts = np.array([[[10,40], [70,16], [100,90] ]], np.int32)
im = np.zeros([240,320, 3], np.uint8)
color = np.array((60,0,255))
cv2.fillPoly( im, pts, color)


cv2.imshow(" ", im)
cv2.waitKey(1)
clr = np.array([255, 0, 128])
cv2.fillPoly( im, pts, color=(clr[0], clr[1], clr[2]))
当然,也可以这样写(尽管没有必要):

import numpy as np
import cv2

pts = np.array([[[10,40], [70,16], [100,90] ]], np.int32)
im = np.zeros([240,320, 3], np.uint8)
color = np.array((60,0,255))
cv2.fillPoly( im, pts, color)


cv2.imshow(" ", im)
cv2.waitKey(1)
clr = np.array([255, 0, 128])
cv2.fillPoly( im, pts, color=(clr[0], clr[1], clr[2]))
编辑: Opencv要求颜色参数为浮点或整数类型的数组。从3通道RGB图像获得的类型可能是uint8。尝试添加

centroid_color = centroid_color.astype(np.int32, copy=False)
在将颜色参数传递给cv2.fillPoly之前


opencv错误消息在这里有点混乱…

对我来说,唯一有效的方法是:

self.points = np.int32(np.vstack([
    np.random.uniform(0, bounds[1], 3),
    np.random.uniform(0, bounds[0], 3)
]).T)
color = np.uint8(np.random.uniform(0, 255, 3))

c = tuple(map(int, color))
cv2.fillPoly(img, [self.points], color=c)

我遵循Automaton2000的答案,但在OpenCV 4.4中没有运气。 在尝试了一千次之后,我发现
color
参数必须作为
list
传递,而不是
np.ndarray
。同时,所有其他参数必须是
np.ndarray
,而不是
list
。干得好,OpenCV,浪费了我一个小时的时间

将numpy导入为np
进口cv2
pts=np.array([[10,40],[70,16],[100,90]],np.int32)
im=np.zero([240,320,3],np.uint8)
#color=np.array((60,0255))#不工作
颜色=[60,0255]#这很有效
cv2.填充多边形(im、pts、颜色)
cv2.imshow(“啊,opencv”,im)
cv2.等待键(0)
顺便说一下,这里是另一个
cv2.rectangle

将numpy导入为np
进口cv2
pts=np.concatenate([np.random.randint(0,120,(10,2)),np.random.randint(120,240,(10,2)),-1)
im=np.zero([240,240,3],np.uint8)
cv2.矩形(im,元组(pts[0,2]),元组(pts[0,2:]),[255,0255])
cv2.imshow(“啊,opencv”,im)
cv2.等待键(0)
尝试使用.tolist()

它解决了我的问题


您可以在上找到用法示例。

我不明白。出于某种原因,这段代码可以工作,但我的代码仍然返回TypeError:参数“color”的标量值不是数字。我正在确保我的颜色参数也是一个nparray。其他参数-im和pts是否必须在特定的数据类型中才能工作?我无法告诉您代码出了什么问题,因为我不知道您是如何创建
质心\u color
。我将编辑我的答案,并尝试更接近您的方法。谢谢。我用质心颜色的方式更新了这个问题,现在我知道这里有什么问题了。我据此编辑了我的答案。非常感谢你的评论!在经历了30分钟的cv2无稽之谈后,你让我不再浪费30分钟。我尝试了各种数据类型的np_数组,我尝试了元组,但没有,它必须是一个列表。谢谢opencv。