将MATLAB代码转换为OpenCV C ++

时间:2014-04-08 16:47:34

标签: c++ matlab opencv

我是OpenCV的新手并尝试使用C ++将以下MATLAB代码转换为OpenCV:

    [FX,FY]=gradient(mycell{index});

到目前为止,我已尝试过以下内容,但我的值与我的MATLAB结果完全不同

    Mat abs_FXR;
    Mat abs_FYR;
    int scale = 1;
    int delta = 0;

    // Gradient X
    Sobel(myImg, FXR, CV_64F, 1, 0, 3, scale, delta, BORDER_DEFAULT);
    convertScaleAbs( FXR, abs_FXR );
    imshow( window_name2, abs_FXR );

    // Gradient Y
    Sobel(myImg, FYR, CV_64F, 0, 1, 3, scale, delta, BORDER_DEFAULT);
    convertScaleAbs( FYR, abs_FYR );
    imshow( window_name3, abs_FYR );

我也尝试过根据这个问题使用filter2D,但它仍然提供了不同的结果:Matlab gradient equivalent in opencv

Mat kernelx = (Mat_<float>(1,3)<<-0.5, 0, 0.5);
Mat kernely = (Mat_<float>(3,1)<<-0.5, 0, 0.5);
filter2D(myImg, FXR, -1, kernelx);
filter2D(myImg, FYR, -1, kernely);
imshow( window_name2, FXR );
imshow( window_name3, FYR );

我不知道这是否偏离轨道,或者它只是一个我需要改变的参数。任何帮助将不胜感激。

更新 这是我对MATLAB的预期输出:

enter image description here enter image description here

但这是我使用Sobel从OpenCV获得的内容:

enter image description here enter image description here

这是我使用Filter2D方法从OpenCV获得的输出(我尝试增加高斯滤波器的大小,但与MATLAB相比仍然得到不同的结果)

enter image description here enter image description here

我还使用以下方法将图像转换为双精度:

eye_rtp.convertTo(eye_rt,CV_64F);

1 个答案:

答案 0 :(得分:2)

你需要做一个中心差异计算而不是使用Sobel滤波器(尽管Sobel确实给出了很好的导数)以匹配gradient是正确的。顺便说一句,如果您有图像处理工具箱,imgradientimgradientxy可以选择使用Sobel来计算渐变。 (注意,the answer in the question you referenced 错误 Sobel只提供二阶导数,因为有一阶和二阶Sobel算子可用。)

关于您看到的差异,您可能需要在myImg之前将filter2D转换为float或double。检查FXL等的输出类型

此外,双精度为CV_64F,单精度为CV_32F,但在这种情况下,这可能只会导致非常小的差异。