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

Posted

技术标签:

【中文标题】OpenCV c ++中的多项式曲线拟合【英文标题】:Polynomial curve fitting in OpenCV c++ 【发布时间】:2021-07-07 14:14:55 【问题描述】:

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

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;
    

我主要是这样称呼它的:

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);
            
        

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

【问题讨论】:

【参考方案1】:

为了计算拟合曲线,它必须变换轴。 如下图所示,可以得到2条横x轴和纵x轴的拟合曲线,然后求误差幂之和,选择一条求和最小的曲线。

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

【讨论】:

以上是关于OpenCV c ++中的多项式曲线拟合的主要内容,如果未能解决你的问题,请参考以下文章

MatlabCurve曲线拟合后如何获得高精度参数

如何使用两个独立变量将拟合数据曲线拟合到已知公式?

将密度曲线拟合到R中的直方图

matlab 符号计算 求空间曲线长度

matlab拟合正弦曲线的问题

matlab中一数组的时域曲线如何转换为频域曲线