2017-06-13 13 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()'はdoubleへのポインタではなく、doubleをとるようです。 'image.at (x、y)= val;'はポインタも期待しないようです。 – ebyrob

+0

@ebyrob。はい。非整数座標の値を取得するためのものとは別にその論理はうまくいくだろうか? –

答えて

1

このコードには多くの構文エラーがあります。まず、xyvalのポインタを使用していますが、それらを参照せず、ローカル変数であるかのようにcvFloor()Mat::at()のような関数に値渡しします。これは機能しません。今はコンパイル時に変換エラーが発生します。

同じことは、この行のために行く:あなたは値によってポインタを渡し、ローカル変数(X2、Y2など)からポインタ(xとy)を減算しようとしている

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

ところで、x、y、valポインタを作る理由はありません。実際、それは理にかなっていません。

他、複数バグがあります。

は、例えば、Bil_interp()は、引数としてマットオブジェクトへのconst参照を取り、あなたが関数内でこのオブジェクトを変更しようとする - 別のコンパイルエラーを。

warpAffine()への呼び出しは、同じタイプ(1はCV_8Uあり、そして他方はCV_32である)を持っていないimgimgAffineとして、実行時エラーがトリガされます。 Bil_interp()

image.at<double>()は、関数に渡された画像がCV_64FC1二重対応のに対し、CV_32FC1あるので、実行時にプログラムをクラッシュさせる予定です。あなたは本当に両方の方法の観点から、あなたは明確にあなたが何をしているかわかりませんので、基本的なC++を学ぶことから始めなければならない


あなたがC++を使用するだけでなく、あなたがOpenCVのを使用する方法に関する。このコードは、貼り付けられたランダムなもののように見えます。私はあなたを怒らせるように書いていません。コンパイルするコードを数行書くことができないので、常にあなたが抱かれ続けるつもりであるあなたの現在の知識だけです。

+0

最後の段落の言い換えを検討してください。 OPが十分なC++を知らず、 'cv :: Mat'を効果的に使うための基本的な知識が不足していることは非常に明白です。なぜここにいるのですか?しかし、あなたはあなたのことをもっと穏やかにすることができます。 – rayryeng

+0

@KjMag。説明をありがとうございます。基本的に私はソフトウェア部門ではなく、最近コーディングを始めました。私は多くの時間がなく、一度にたくさんのことを学ぶ必要があります。私はすぐに間違いを訂正します。それは大丈夫Rayryengさんです。ありがとうございました。 –

+0

@rayryengおそらくあなたが正しいと思いますが、最後は少し厳しいと判明しましたが、OPは既にそれを読んでいますので、もう編集する必要はありません。 – KjMag

関連する問題