首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Opencv -多项式函数拟合

Opencv -多项式函数拟合
EN

Stack Overflow用户
提问于 2016-06-10 21:29:01
回答 2查看 10.6K关注 0票数 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-11 19:00:22

我不认为opencv中有一个库,但您可以这样做:

代码语言:javascript
复制
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;
}

原稿在这里

票数 3
EN

Stack Overflow用户

发布于 2018-06-21 09:31:00

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37757409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档