双线性插值实现出错

时间:2017-06-13 14:47:59

标签: c++ opencv

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

  

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

1 个答案:

答案 0 :(得分:1)

这段代码中存在许多语法错误。首先,您使用的是xyval的指针,并且您不会取消引用它们,而是将它们按值传递给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的方式。此代码看起来像粘贴在一起的随机内容。我不会写它来冒犯你 - 只是凭借你目前的知识,你将不断陷入困境,因为你无法编写几行可编译的代码。