2014-04-08 101 views
1

我是新来的OpenCV,并试图用C++下面的MATLAB代码转换为OpenCV的:到目前为止转换MATLAB代码以OpenCV的C++

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

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

UPDATE 下面是从MATLAB我的预期输出:

enter image description hereenter image description here

但这里是我从OpenCV的使用越来越索贝尔:

enter image description hereenter image description here

而且这里是我使用Filter2D方法从OpenCV输出(我试过incr

eye_rtp.convertTo(eye_rt,CV_64F); 
+0

你能提供结果吗?(我的意思是你的梯度图像) – Hadi

回答

2

这是正确的,你需要:淡化我高斯滤波器的尺寸,但仍然得到比MATLAB不同的结果)

enter image description hereenter image description here

我一直在使用也转换我的形象为双精度为了匹配gradient,而不是使用索贝尔滤波器(尽管索贝尔确实给出了一个很好的导数)来做中心差分计算。顺便说一句,如果你有图像处理工具箱,imgradientimgradientxy可以选择使用Sobel来计算梯度。 (请注意,the answer in the question you referenced错误索贝尔仅提供二阶导数,因为有一阶和二阶索贝尔运算符可用)。

关于您所看到的差异,您可能需要将myImg转换为在filter2D之前浮动或加倍。检查输出类型FXL

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

+0

谢谢,他们都是'cv :: Mat'类型。对于转换,你的意思是像'myImg.convertTo(myImg,CV_64F)'?不幸的是,我最终得到了这样的结果:[链接](http://imgur.com/T0FjINR) – orikon

+0

@orikon我问的类型是'cv :: Mat'中的元素。我想知道如果元素是整数。对于转换,是的,这就是我的意思。 – chappjc

+0

啊我看,他们似乎是'unsigned char *' – orikon