首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV c++中的多项式曲线拟合

OpenCV c++中的多项式曲线拟合
EN

Stack Overflow用户
提问于 2021-07-07 22:14:56
回答 1查看 141关注 0票数 0

基于任何函数都可以用幂函数逼近这一事实,我在C++ OpenCV中实现了一种多项式曲线拟合方法。然后将方程写成矩阵形式,并进行求解。基本上,代码是这样的:

代码语言:javascript
复制
PolynomialFit(std::vector<cv::Point>& points, int order) {

    cv::Mat U(points.size(), (order + 1), CV_64F);
    cv::Mat Y(points.size(), 1, CV_64F);
    
    for (int i = 0; i < U.rows; i++) {
        for (int j = 0; j < U.cols; j++) {
            U.at<double>(i, j) = pow(points[i].x, j);
        }
    }
     
    for (int i = 0; i < Y.rows; i++) {
        Y.at<double>(i, 0) = points[i].y;
    }

    cv::Mat K((order + 1), 1, CV_64F);
    if(U.data != NULL) {
        K = (U.t() * U).inv() * U.t() * Y;
    }

大体上,我是这样称呼它的:

代码语言:javascript
复制
int order = 2;
        cv::Mat K = PolynomialFit(_points, order);
        
        if(_points.size() > 0) {
            for (int j = _points.at(0).x; j < _points.at(_points.size() - 1).x; j++) {

                cv::Point2d point(j, 0);
                for (int k = 0; k < order + 1; k++) {
                    point.y += K.at<double>(k, 0) * std::pow(j, k);
                }
                
                cv::circle(image, point, 1, cv::Scalar(0, 255, 0), CV_FILLED, CV_AA);
            }
        }

问题是,它只适用于特定类型的点。例如,在下图中,它仅适用于左侧曲线中的点。我怎样才能改变这种行为呢?我已经尝试过更改顺序参数,但是正确的曲线不会像它应该的那样拟合。

EN

回答 1

Stack Overflow用户

发布于 2021-07-07 23:35:06

为了计算拟合曲线,它必须变换轴。如下图所示,你可以得到两条具有水平x轴和垂直x轴的拟合曲线,然后得到误差幂的和,选择一条具有最小值和的曲线。

为此,您可以从PolynomialFit函数的代码中交换x和y。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68287740

复制
相关文章

相似问题

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