2017-06-13 45 views
-2

我的項目目標是在仿射變換之後實現雙線性插值的自身函數。作爲初學者,我無法找到解決方案來找到圖像轉換後的非整數座標,所以我喜歡跟隨。它顯示執行後誤差雙線性插值實現的錯誤

不能將「X」(類型「雙*」)鍵入「CV ::點」

int main() 
{ 
    double value =0.0 ; 
    double i,j; 
    const cv::Mat img = cv::imread("/media/sf_vbox_share/ubuntushare/chess2.jpg",CV_8U);  
    Mat imgAffine; 
    Mat par(2, 3, CV_64FC1); 

    imgAffine = Mat::zeros(img.rows, img.cols,CV_32FC1);  
    par.at<double>(0,0)= 1; //p1 
    par.at<double>(1,0)= 0.02 ; //p2; 
    par.at<double>(0,1)= -0.03 ; //p3; 
    par.at<double>(1,1)= 1 ; //p4; 
    par.at<double>(0,2)= -0.001 ; //p5; 
    par.at<double>(1,2)= -0.005;//p6; 
    warpAffine(img,imgAffine,par, img.size()); 

    namedWindow("image",WINDOW_AUTOSIZE); 
    imshow("image",imgAffine); 

    //for locating non integer coordinates..  
    for(i=0.0;i< imgAffine.rows ; i += 0.1) 
    { 
     for(j=0.0;j< imgAffine.cols; j+= 0.1) 
     { 
      Bil_interp(imgAffine,&i,&j,&value); 
     } 
    } 

    imshow("interpol img",imgAffine);  
    waitKey(0); 
    return 0; 
} 

void Bil_interp(const Mat& image, double* x, double* y, double* val) 
{  
    int x1 = cvFloor(x);int y1 = cvFloor(y); 
    int x2 = x1+1;int y2 = y1+1; 
    double q11,q12,q21, q22;  
    q11 = (image.at<double>(x1,y1)); 
    q21 = (image.at<double>(x2,y1)); 
    q12 = (image.at<double>(x1,y2)); 
    q22 = (image.at<double>(x2,y2)); 

    val = ((1/((x2-x1)*(y2-y1))) *(q11*(x2-x)*(y2-y)+q21*(x2-x1)*(y2- 
      y) +q12*(x2-x)*(y-y1)+q22*(x-x1)*(y-y1))); 

    image.at<double>(x,y) = val;  
} 

我真的不知道該怎麼在代碼中使用cv::Point。我不允許在warpAffine函數中使用插值標誌。 我無法找到或理解任何帖子或文章。 任何人都可以建議我如何解決這裏的問題?我們如何知道有非整數座標?

+0

哇,那是一些有創意的縮進。 –

+0

可能有助於瞭解哪條線路會產生錯誤。它看起來像'cvFloor()'採取雙重,而不是指針加倍。 'image.at (x,y)= val;'也看起來不會指望指針。 – ebyrob

+0

@ebyrob。好的。除此之外,用於檢索非整數座標的值。那邏輯會起作用? –

回答

1

這段代碼有很多語法錯誤。首先,您使用的指針爲x,yval,並且您不要對它們進行解引用,而是將它們按值傳遞給像cvFloor()Mat::at()這樣的函數,就好像它們是局部變量一樣 - 這不起作用,並且每次調用這些函數現在在編譯過程中會給你一個轉換錯誤。

這同樣適用於這一行:

val = ((1/((x2-x1)*(y2-y1))) *(q11*(x2-x)*(y2-y)+q21*(x2-x1)*(y2- 
     y) +q12*(x2-x)*(y-y1)+q22*(x-x1)*(y-y1))); 

你按值傳遞指針,並嘗試減去局部變量(x2,y2等)的指針(x和y)。

順便說一句,沒有理由製作x,y和val指針。事實上,這沒有意義。

還有其他錯誤:

例如,Bil_interp()需要一個常量引用墊對象作爲參數,並試圖修改函數內部的對象 - 另一個編譯錯誤。

warpAffine()呼叫將觸發運行時錯誤作爲imgimgAffine不具有相同類型的(一個是CV_8U,另一種是CV_32)。

Bil_interp()image.at<double>()也是要在運行時程序崩潰,因爲圖像傳遞給函數是CV_32FC1,而雙對應CV_64FC1


你應該學習基本的C++,因爲你顯然不知道自己在做什麼真正開始,無論是在多麼方面使用C++,而且還涉及使用OpenCV的方式。這段代碼看起來像隨機的東西粘貼在一起。我不會寫它來冒犯你 - 只是隨着你目前的知識,你會一直卡住,因爲你無法編寫幾行可編譯的代碼。

+0

考慮改寫最後一段。很明顯,OP沒有足夠的C++知識,並且對如何有效地使用'cv :: Mat'缺乏一些基本的瞭解,這就是他們來到這裏的原因,但是對於你的觀點你可以更加溫和。 – rayryeng

+0

@KjMag。謝謝你的澄清。基本上我不是從軟件部門,但最近開始編寫代碼,我沒有太多時間,需要一次學習。我會很快糾正我的錯誤。 Rayryeng先生。謝謝。 –

+0

@rayryeng大概你是對的,最後一個結果是有點苛刻,但OP已經閱讀了,所以我想沒有必要再編輯了。 – KjMag