双线性插值实现的错误

Error with Bilinear interpolation implementation

本文关键字:错误 实现 插值 双线性      更新时间:2023-10-16

我的项目目标是在仿射变换后实现自己的双线性插值函数。由于我是初学者,我找不到解决方案来定位图像转换后的非整数坐标,所以我做了以下工作。执行后显示错误为

无法将"x"(键入"double*")转换为类型"cv::P oint">

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函数中使用插值标志。 我找不到或理解任何帖子或文章。 谁能建议我如何解决这里的问题?我们怎么知道有非整数坐标?

这段代码中有许多语法错误。首先,你使用指针来xyval,你不会取消引用它们,而是按值将它们传递给像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()将对 Mat 对象的 const 引用作为参数,并且您尝试在函数内修改此对象 - 另一个编译错误。

warpAffine()的调用将触发运行时错误,因为imgimgAffine没有相同的类型(一个是CV_8U,另一个是CV_32)。

image.at<double>()Bil_interp()中也会在运行时使程序崩溃,因为传递给函数的图像是CV_32FC1,而 double 对应于CV_64FC1


你真的应该从学习基本的C++开始,因为你显然不知道你在做什么,无论是在如何使用C++方面,还是关于你如何使用openCV。这段代码看起来像是粘贴在一起的随机内容。我写它不是为了冒犯你 - 只是以你目前的知识,你会一直卡住,因为你无法编写几行可以编译的代码。