2012-07-04 23 views
0

我使用的是OpenCV 2.4.0 python綁定,我發現在計算圖片的laplacian時,我會從cv2.cv API獲得與cv2 API不同的結果。opencv 2.4.0拉普拉斯不同的結果取決於使用的API?

如果我使用CV2 API:

im_laplacian = cv2.Laplacian(im_gray, cv2.IPL_DEPTH_32F, ksize = 3) 

im_laplacian總是UINT8(缺號),並ddepth必須IPL_DEPTH_32F或IPL_DEPTH_64F,如果我嘗試IPL_DEPTH_16S或IPL_DEPTH_32S我得到一個錯誤:

「OverflowError:Python的詮釋太大,轉換爲C長」

如果我使用cv2.cv API:

cvgray = cv.fromarray(im_gray) 
im_laplacian2 = cv.CreateImage(cv.GetSize(cvgray), cv.IPL_DEPTH_16S, 1)   
cv.Laplace(cvgray, im_laplacian2, 3) 

正如我所料,我得到了一個簽名的laplacian,這與C++ API中的結果是一樣的。 如果我做的:

im_laplacian2_scaled = cv.CreateImage(cv.GetSize(cvgray), 8, 1) 
cv.ConvertScaleAbs(dst, im_laplacian2_scaled, 1, 0) 

im_laplacian2_scaled是從CV2 API計算

在我的具體情況,我想我可以逃脫的CV2輸出, im_laplacian仍然是不同的,但我puzzeled,不該」所有的API產生相同的輸出? 他們使用不同的算法嗎? 或者也許cv2 python綁定不對應於單獨的C++函數,但它們的一些組合?

回答

3

cv2新API使用不同深度的常數:

  • cv2.CV_64F代替cv2.IPL_DEPTH_64F
  • cv2.CV_32F代替cv2.IPL_DEPTH_32F
  • cv2.CV_32S代替cv2.IPL_DEPTH_32S
  • cv2.CV_16S代替cv2.IPL_DEPTH_16S
  • 0的代替cv2.IPL_DEPTH_16U
  • cv2.CV_8S代替cv2.IPL_DEPTH_8S
  • cv2.CV_8U,而不是cv2.IPL_DEPTH_8U
+0

好吧!我看到發生了什麼事。在cv2 API中使用ddepth cv2.IPL_DEPTH_32F會產生與使用cv2.CV_8U相同的效果,這就是我得到的結果。我想:我仍然想知道爲什麼IPL_DEPTH_xxx常量在cv2 API中出現,它們出現在自動完成中,也許出於兼容性的原因?謝謝你的回答Andrey。 – martinako