Opencv C-api和C+中的Sobel+;应用程序编程接口 我刚刚用C API和C++ API测试了索贝尔。但为什么不同呢?我使用的所有参数都是相同的

Opencv C-api和C+中的Sobel+;应用程序编程接口 我刚刚用C API和C++ API测试了索贝尔。但为什么不同呢?我使用的所有参数都是相同的,opencv,Opencv,输出-使用C API 输出-使用C++ API/P> 已编辑 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,

输出-使用C API

输出-使用C++ API/P> 已编辑

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);

从C++中更改C++代码的最后一行

阈值(img_sobel,img_阈值,0,255,CV_THRESH_OTSU+CV_THRESH_二进制)


阈值(img_sobel,img_阈值,0,255,CV_THRESH_OTSU | CV_THRESH_二进制)

产生不同结果的原因只有一个。数据类型

在C版本中,您使用
IPL\u DEPTH\u 16S
DEPTH创建
grad\u x
。因此每个像素都有
short
数据类型。这提高了调用
cvSobel
函数时得到的结果的精度
cvSobel
能够在结果
grad\u x
中容纳更大范围的值(-32768到32767)

在C++版本中,您不初始化矩阵并指定目的地类型<代码> CVY8UU < /代码>。函数

cv::Sobel
在内部创建cv_8U类型的目标矩阵,计算结果,然后将其钳制到目标数据类型的范围内,即从0到255。所以所有的负值都变成0


< >在C版本中得到相同的结果,将<代码> iPLY-DEXTHY16S/<代码>改为<代码> IPLY-DESTHOT8U/。< /P>你能不能为C和C++ API张贴一些代码?我不认为这是原因。Mizuki Kai,SGAR91——你是对的。对不起,我错了,我只是看到了这种差异,并认为这可能会导致问题,并在未分析问题的情况下发布答案。谢谢您的解决方案。但一直以来,我认为它需要使用16秒(在互联网上搜索后)。那么,哪种方法是正确的呢?这取决于你想要多高的精度。否则,“更正确”的将是精度更高的。再次感谢您的澄清。非常感谢你的帮助。