2014-04-08 98 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