【问题标题】:opencv 2.4.0 laplacian different results depending on API used?opencv 2.4.0 laplacian 不同的结果取决于所使用的 API?
【发布时间】:2012-07-04 15:20:00
【问题描述】:

我正在使用 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++ 函数,而是它们的某种组合?

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    新的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

    【讨论】:

    • 好的!我明白发生了什么。在 cv2 API 中使用 ddepth cv2.IPL_DEPTH_32F 产生与使用 cv2.CV_8U 相同的效果,这就是我得到的结果。我想的更简单的答案:-P 我仍然想知道为什么 IPL_DEPTH_xxx 常量出现在 cv2 API 中,它们在自动完成中出现,也许是出于兼容性原因?感谢您的回答安德烈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-04-27
    • 2018-12-22
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多