1

我刚刚使用 C api 和 C++ api 测试了 Sobel。但为什么不一样呢?我使用的所有参数都是相同的。

Sobel 使用 C API输出 - 使用 C API

Sobel 使用 C++ API输出 - 使用 C++ API

已编辑

C API:

/// Generate grad_x
grad_x = cvCreateImage(cvGetSize(grayImg), IPL_DEPTH_16S, 1);
abs_grad_x = cvCreateImage(cvGetSize(grayImg), 8, 1);

/// Gradient X
cvSobel(grayImg, grad_x, 1, 0, 3);
cvConvertScaleAbs(grad_x, abs_grad_x);
cvThreshold(abs_grad_x, abs_grad_x, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);

C++ API:

cv::Mat img_sobel;
cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0, BORDER_DEFAULT);

Mat img_threshold;
threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
4

2 回答 2

3

结果不同只有一个原因。数据类型!

在 C 版本中,您正在深度创建grad_xIPL_DEPTH_16S所以每个像素都有short数据类型。这提高了调用cvSobel函数时获得的结果的精度。cvSobel能够在结果中容纳更广泛的值(-32768 到 32767)grad_x

在 C++ 版本中,您没有初始化矩阵并指定目标类型CV_8U。该函数在cv::Sobel内部创建 CV_8U 类型的目标矩阵,计算结果,然后将它们钳制在目标数据类型的范围内,即从 0 到 255。因此所有负值都变为 0。

要在 C 版本中获得相同的结果,IPL_DEPTH_16S请将IPL_DEPTH_8U.

于 2013-01-15T19:42:49.897 回答
0

将 c++ 代码的最后一行从更改
threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);

threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY);

于 2013-01-15T17:55:04.050 回答