我是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得到的预期输出:
但是这是我从使用Sobel的OpenCV获得的东西:
这是我使用Filter2D方法从OpenCV中获得的输出(我尝试增加高斯滤波器的大小,但与MATLAB相比仍然得到不同的结果)
我还使用以下方法将图像转换为 double :
eye_rtp.convertTo(eye_rt,CV_64F);
最佳答案
正确的是,您需要进行集中差异计算,而不是使用Sobel过滤器(尽管Sobel确实提供了一个很好的导数)才能匹配gradient
。顺便说一句,如果您有图像处理工具箱,则imgradient
和imgradientxy
可以选择使用Sobel计算梯度。 (请注意the answer in the question you referenced是错误的,因为存在一阶和二阶Sobel运算符,所以Sobel仅提供二阶导数)。
关于您看到的差异,您可能需要将myImg
转换为float或double,再转换为filter2D
。检查FXL
的输出类型,等等。
同样, double 是CV_64F
,单精度是CV_32F
,尽管在这种情况下这可能只会造成很小的差异。
关于c++ - 将MATLAB代码转换为OpenCV C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22943336/