opencv 2.4.0 laplacian根据API使用的不同结果?

时间:2012-07-04 15:20:00

标签: python opencv

我正在使用OpenCV 2.4.0 python绑定,我发现在计算图像的laplacian时,我使用cv2.cv API中的cv2 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 int太大而无法转换为C long”

如果我使用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)

正如我所料,我得到了一个签名拉普拉斯,这与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计算的im_laplacian不同

在我的特殊情况下,我认为我可以逃脱cv2输出, 但我很困惑,难道不是所有的API都能产生相同的输出吗? 他们使用不同的算法吗? 或者cv2 python绑定可能不是单独的C ++函数,而是它们的某些组合?

1 个答案:

答案 0 :(得分: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
  • cv2.CV_16U代替cv2.IPL_DEPTH_16U
  • cv2.CV_8S代替cv2.IPL_DEPTH_8S
  • cv2.CV_8U代替cv2.IPL_DEPTH_8U