【问题标题】:Opencv - polynomial function fittingOpencv - 多项式函数拟合
【发布时间】:2016-10-11 23:06:34
【问题描述】:

在opencv(或其他c++ lib)中,是否有类似matlabfit的函数可以进行3d多项式曲面拟合(即f(x,y)= p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2)。谢谢

【问题讨论】:

    标签: opencv model-fitting function-fitting


    【解决方案1】:

    openCV (contrib.hpp) 中有一个名为cv::polyfit() 的未记录函数。它将 x 坐标的 Mat 和 y 坐标的另一个 Mat 作为输入。使用 Mats 不是很容易,但您可以构建一个包装器来发送 vectorcv::Point 点。

    vector <float> fitPoly(const vector <Point> &src, int order){
        Mat src_x = Mat(src.size(), 1, CV_32F);
        Mat src_y = Mat(src.size(), 1, CV_32F);
        for (int i = 0; i < src.size(); i++){
            src_x.at<float>(i, 0) = (float)src[i].x;
            src_y.at<float>(i, 0) = (float)src[i].y;
        }
    
        return cv::polyfit(src_x, src_y, order);
    }
    

    【讨论】:

    • -1 因为您的答案不完整。 polyfit 函数不再存在,并且您提供的内容不适用于旧函数,因为没有函数返回 cv::Mat 或向量,它们作为可变引用传递。此外,ii 索引可能是一个错字。
    【解决方案2】:

    我认为 opencv 中没有库,但你可以这样做:

    int main( int argc, char** argv )
    {
    Mat z    = imread("1449862093156643.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    
    Mat M = Mat_<double>(z.rows*z.cols,6);
    Mat I=Mat_<double>(z.rows*z.cols,1);
    for (int i=0;i<z.rows;i++)
        for (int j = 0; j < z.cols; j++)
        {
            double x=(j - z.cols / 2) / double(z.cols),y= (i - z.rows / 2) / double(z.rows);
            M.at<double>(i*z.cols+j, 0) = x*x;
            M.at<double>(i*z.cols+j, 1) = y*y;
            M.at<double>(i*z.cols+j, 2) = x*y;
            M.at<double>(i*z.cols+j, 3) = x;
            M.at<double>(i*z.cols+j, 4) = y;
            M.at<double>(i*z.cols+j, 5) = 1;
            I.at<double>(i*z.cols+j, 0) = z.at<uchar>(i,j);
        }
    SVD s(M);
    Mat q;
    s.backSubst(I,q);
    cout<<q;
    imshow("Orignal",z);
    cout<<q.at<double>(2,0);
    Mat background(z.rows,z.cols,CV_8UC1);
    for (int i=0;i<z.rows;i++)
        for (int j = 0; j < z.cols; j++)
        {
            double x=(j - z.cols / 2) / double(z.cols),y= (i - z.rows / 2) / double(z.rows);
            double quad=q.at<double>(0,0)*x*x+q.at<double>(1,0)*y*y+q.at<double>(2,0)*x*y;
            quad+=q.at<double>(3,0)*x+q.at<double>(4,0)*y+q.at<double>(5,0);
            background.at<uchar>(i,j) = saturate_cast<uchar>(quad);
        }
    imshow("Simulated background",background);
    waitKey();
    return 0;
    }
    

    Original post is here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 2010-11-05
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2016-07-04
      相关资源
      最近更新 更多