OpenCV cvtColor数据类型问题(错误:(-215))

12

我遇到并解决了这个数据类型的问题,希望能对一些人有所帮助。

通常我们会这样转换颜色,它有效:

img = cv2.imread("img.jpg"), 0)
imgColor=cv2.cvtColor(img , cv2.COLOR_GRAY2BGR)

然而有时您可能首先需要对图像进行标准化处理:

img = cv2.imread("img.jpg"), 0)/255.
imgColor=cv2.cvtColor(img , cv2.COLOR_GRAY2BGR)

这将导致以下错误:

错误:(-215)depth == CV_8U || depth == CV_16U || depth == CV_32F,函数中的>cv :: cvtColor

问题在于,在前一个示例中,dtype为uint8,而在后一个示例中为float64。要纠正此问题,请添加一行:

img = cv2.imread("img.jpg"), 0)/255.
img=img.astype(numpy.float32)
imgColor=cv2.cvtColor(img , cv2.COLOR_GRAY2BGR)

这是一个关于numpy除法行为的问题,而不是OpenCV。 - Miki
1个回答

9

因此,这是一个类似的问题,但与另一个函数cv2.drawKeypoints()相关。

这将起作用:

img = cv2.imread("img.jpg"), 1)
img_out = numpy.copy(img)
image_out = cv2.drawKeypoints(img,keypointList,img_out,(255,0,0),4)

然而,以下代码无法编译:
img = cv2.imread("img.jpg"), 1)/255.0 
img_out = numpy.copy(img)
image_out = cv2.drawKeypoints(img,keypointList,img_out,(255,0,0),4)

我们遇到了这个错误:

错误:(-5)输入图像类型不正确。

再次提醒,将"img"除以255或进行任何其他处理使其转换为浮点数,都会使"img"不成为drawKeypoints所需的正确类型。在此添加img = img.astype(numpy.float32)并没有帮助。对于输入图像img,uint8可以正常工作,但float32则不行。我在文档中没有找到这样的要求。与涉及cvtColor的上述问题不同之处令人困惑,它抱怨的是“类型”。

因此,为了使其正常工作:

img = cv2.imread("img.jpg"), 1)/255.0 
img_out = numpy.copy(img)
img=img.astype(numpy.uint8)
image_out = cv2.drawKeypoints(img,keypointList,img_out,(255,0,0),4)

对于最后一行代码,我认为cv2.DRAW_RICH_KEYPOINTS应该可以作为drawKeyPoints函数中的标志(即最后一个参数)。然而,只有当我使用数字4时它才有效。任何解释将不胜感激。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接