1

我正在使用 OpenCV 2.4.0 python 绑定,我发现在计算图像的拉普拉斯算子时,我使用来自 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 我收到错误:

“溢出错误: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++ 函数,而是它们的某种组合?

4

1 回答 1

3

cv2API 使用不同的深度常数:

  • 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
于 2012-07-04T15:41:48.547 回答