python - opencv 2.4.0 laplacian 不同的结果取决于所使用的 API?

标签 python opencv

我正在使用 OpenCV 2.4.0 python 绑定(bind),我发现在计算图像的拉普拉斯算子时,我使用 cv2 API 从 cv2.cv 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 绑定(bind)可能不对应于单个 C++ 函数,而是对应于它们的某种组合?

最佳答案

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

关于python - opencv 2.4.0 laplacian 不同的结果取决于所使用的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11331830/

相关文章:

python - 在caffe中使用分类时出错

python - 子图投影覆盖tick_params

c++ - BOOST::thread worker 同步,C++ 和 OpenCV

python - 如何连接两个对象的路径?

python - 填充 Float Column 的 np.nan 条目会给出 ValueError : fill value must be in categories

python - Django 休息框架 : using ModelViewSet to get a list of instances by their PKs

opencv - 如何提高单应性精度?

matlab - 从 MATLAB 中的 MSER 检测获取区域点?

Python:检测到运动周围的重叠框

Python Pandas - 重命名和合并 3 个数据集