我的項目目標是在仿射變換之後實現雙線性插值的自身函數。作爲初學者,我無法找到解決方案來找到圖像轉換後的非整數座標,所以我喜歡跟隨。它顯示執行後誤差雙線性插值實現的錯誤
不能將「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()'採取雙重,而不是指針加倍。 'image.at(x,y)= val;'也看起來不會指望指針。 –
ebyrob
@ebyrob。好的。除此之外,用於檢索非整數座標的值。那邏輯會起作用? –