2016-10-20 94 views
5

我遇到並找出這個dtype問題,並希望它對一些問題有幫助。opencv cvtColor dtype問題(錯誤:(-215))

通常我們會轉換顏色這樣的,它的工作原理:

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) 

這將導致此錯誤:

error: (-215) depth == CV_8U || depth == CV_16U || depth == CV_32F in function >cv::cvtColor

重點是,在前面的例子中,dtype是uint8,而後者是float64。 要糾正這一點,添加一行:

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

這是一個特定於'numpy'行爲的分割問題,而不是OpenCV。 – Miki

回答

4

因此,這將是解決,但涉及到另外一個功能類似的問題,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) 

在這裏,我們有這樣的錯誤:

error: (-5) Incorrect type of input image.

此外,除以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) 

最後一行,我想cv2.DRAW_RICH_KEYPOINTS會工作的標誌(在drawKeyPoints函數的最後一個參數)。但是,只有當我使用它的數字4它的作品。任何解釋將不勝感激。

相關問題