双线性插值实现的错误
我的项目目标是在仿射变换之后实现双线性插值的自身函数。作为初学者,我无法找到解决方案来找到图像转换后的非整数坐标,所以我喜欢跟随。它显示执行后误差双线性插值实现的错误
不能将“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
函数中使用插值标志。 我无法找到或理解任何帖子或文章。 任何人都可以建议我如何解决这里的问题?我们如何知道有非整数坐标?
这段代码有很多语法错误。首先,您使用的指针为x
,y
和val
,并且您不要对它们进行解引用,而是将它们按值传递给像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()
呼叫将触发运行时错误作为img
和imgAffine
不具有相同类型的(一个是CV_8U
,另一种是CV_32
)。
在Bil_interp()
image.at<double>()
也是要在运行时程序崩溃,因为图像传递给函数是CV_32FC1
,而双对应CV_64FC1
。
你应该学习基本的C++,因为你显然不知道自己在做什么真正开始,无论是在多么方面使用C++,而且还涉及使用OpenCV的方式。这段代码看起来像随机的东西粘贴在一起。我不会写它来冒犯你 - 只是随着你目前的知识,你会一直卡住,因为你无法编写几行可编译的代码。
哇,那是一些有创意的缩进。 –
可能有助于了解哪条线路会产生错误。它看起来像'cvFloor()'采取双重,而不是指针加倍。 'image.at(x,y)= val;'也看起来不会指望指针。 –
ebyrob
@ebyrob。好的。除此之外,用于检索非整数坐标的值。那逻辑会起作用? –