双线性插值实现的错误

问题描述:

我的项目目标是在仿射变换之后实现双线性插值的自身函数。作为初学者,我无法找到解决方案来找到图像转换后的非整数坐标,所以我喜欢跟随。它显示执行后误差双线性插值实现的错误

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

+0

哇,那是一些有创意的缩进。 –

+0

可能有助于了解哪条线路会产生错误。它看起来像'cvFloor()'采取双重,而不是指针加倍。 'image.at (x,y)= val;'也看起来不会指望指针。 – ebyrob

+0

@ebyrob。好的。除此之外,用于检索非整数坐标的值。那逻辑会起作用? –

这段代码有很多语法错误。首先,您使用的指针为x,yval,并且您不要对它们进行解引用,而是将它们按值传递给像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()呼叫将触发运行时错误作为imgimgAffine不具有相同类型的(一个是CV_8U,另一种是CV_32)。

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


你应该学习基本的C++,因为你显然不知道自己在做什么真正开始,无论是在多么方面使用C++,而且还涉及使用OpenCV的方式。这段代码看起来像随机的东西粘贴在一起。我不会写它来冒犯你 - 只是随着你目前的知识,你会一直卡住,因为你无法编写几行可编译的代码。

+0

考虑改写最后一段。很明显,OP没有足够的C++知识,并且对如何有效地使用'cv :: Mat'缺乏一些基本的了解,这就是他们来到这里的原因,但是对于你的观点你可以更加温和。 – rayryeng

+0

@KjMag。谢谢你的澄清。基本上我不是从软件部门,但最近开始编写代码,我没有太多时间,需要一次学习。我会很快纠正我的错误。 Rayryeng先生。谢谢。 –

+0

@rayryeng大概你是对的,最后一个结果是有点苛刻,但OP已经阅读了,所以我想没有必要再编辑了。 – KjMag