我的项目目标是在仿射变换后为双线性插值实现自己的函数。由于我是初学者,我无法找到解决方案,在图像转换后找到非整数坐标,所以我确实喜欢以下。它在执行后显示错误
无法转换' x' (键入' double *')键入' cv :: Point'
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 :(得分:1)
这段代码中存在许多语法错误。首先,您使用的是x
,y
和val
的指针,并且您不会取消引用它们,而是将它们按值传递给cvFloor()
和{等函数{1}}好像它们是局部变量 - 这不起作用,现在每次调用这些函数都会在编译期间给出转换错误。
这一行也是如此:
Mat::at()
你按值传递指针并尝试从局部变量(x2,y2等)中减去指针(x和y)。
BTW没有理由制作x,y和val指针。事实上,这没有任何意义。
还有其他 多个 错误:
例如,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)));
将对象的const引用作为参数,并尝试在函数内修改此对象 - 另一个编译错误。
对Bil_interp()
的调用将触发运行时错误,warpAffine()
和img
的类型不同(一个是imgAffine
,另一个是{{ 1}})。
CV_8U
中的 CV_32
也会在运行时崩溃程序,因为传递给函数的图像是image.at<double>()
,而double对应Bil_interp()
。
你应该从学习基本的C ++开始,因为你显然不知道你在做什么,无论是你如何使用C ++,还是你使用openCV的方式。此代码看起来像粘贴在一起的随机内容。我不会写它来冒犯你 - 只是凭借你目前的知识,你将不断陷入困境,因为你无法编写几行可编译的代码。