opencv cvtColor dtype问题(错误:( - 215))

run*_*ken 12 python opencv numpy

我偶然发现了这个dtype问题并希望它对某些人有所帮助.

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

img = cv2.imread("img.jpg"), 0)
imgColor=cv2.cvtColor(img , cv2.COLOR_GRAY2BGR)
Run Code Online (Sandbox Code Playgroud)

但有时您可能会先将图像标准化:

img = cv2.imread("img.jpg"), 0)/255.
imgColor=cv2.cvtColor(img , cv2.COLOR_GRAY2BGR)
Run Code Online (Sandbox Code Playgroud)

这将导致此错误:

错误:(-215)深度== CV_8U || 深度== CV_16U || 深度== 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)
Run Code Online (Sandbox Code Playgroud)

run*_*ken 8

所以这将是一个类似的问题,已经解决但与另一个函数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)
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译:

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)
Run Code Online (Sandbox Code Playgroud)

这里我们有这个错误:

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

再次,除以255或使用"img"导致转换为浮点数的任何其他处理将使"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)
Run Code Online (Sandbox Code Playgroud)

对于最后一行,我认为cv2.DRAW_RICH_KEYPOINTS将作为标志(drawKeyPoints函数中的最后一个参数).但是只有当我使用数字4时它才有效.任何解释将不胜感激.