私のプロジェクト目標は、アフィン変換後の双線形補間のための独自の関数を実装することです。私は初心者なので、画像変換後に非整数座標を見つける解決策を見つけることができなかったので、私は次のようにしました。それは双線形補間の実装でのエラー
として実行した後にエラーが表示されている「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
機能で補間フラグを使用することはできません。 投稿や記事を見つけたり、理解したりすることができませんでした。 誰も私にこの問題を解決する方法を教えてもらえますか?非整数座標がどのくらい正確にわかるか?
うわー、それはいくつかの独創的なインデントです。 –
エラーを生成する行を知るのに役立ちます。 'cvFloor()'はdoubleへのポインタではなく、doubleをとるようです。 'image.at(x、y)= val;'はポインタも期待しないようです。 –
ebyrob
@ebyrob。はい。非整数座標の値を取得するためのものとは別にその論理はうまくいくだろうか? –