opencv 最小二乘法拟合曲线

//-----------------------------------【头文件包含部分】---------------------------------------
//       描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>

//-----------------------------------【命名空间声明部分】--------------------------------------
//    描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;

bool polynomial_curve_fit(std::vector<cv::Point>& key_point, int n, cv::Mat& A)
{
    //Number of key points
    int N = key_point.size();

    //构造矩阵X
    cv::Mat X = cv::Mat::zeros(n + 1, n + 1, CV_64FC1);
    for (int i = 0; i < n + 1; i++)
    {
        for (int j = 0; j < n + 1; j++)
        {
            for (int k = 0; k < N; k++)
            {
                X.at<double>(i, j) = X.at<double>(i, j) +
                    std::pow(key_point[k].x, i + j);
            }
        }
    }

    //构造矩阵Y
    cv::Mat Y = cv::Mat::zeros(n + 1, 1, CV_64FC1);
    for (int i = 0; i < n + 1; i++)
    {
        for (int k = 0; k < N; k++)
        {
            Y.at<double>(i, 0) = Y.at<double>(i, 0) +
                std::pow(key_point[k].x, i) * key_point[k].y;
        }
    }

    A = cv::Mat::zeros(n + 1, 1, CV_64FC1);
    //求解矩阵A
    cv::solve(X, Y, A, cv::DECOMP_LU);
    return true;
}

int main()
{
    //创建用于绘制的深蓝色背景图像
    cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3);
    image.setTo(cv::Scalar(0, 0, 100));

    //输入拟合点
    std::vector<cv::Point> points;
    points.push_back(cv::Point(100., 58.));
    points.push_back(cv::Point(150., 70.));
    points.push_back(cv::Point(200., 90.));
    points.push_back(cv::Point(252., 140.));
    points.push_back(cv::Point(300., 220.));
    points.push_back(cv::Point(350., 400.));

    //将拟合点绘制到空白图上
    for (int i = 0; i < points.size(); i++)
    {
        cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);
    }

    //绘制折线
    cv::polylines(image, points, false, cv::Scalar(0, 255, 255), 1, 8, 0);

    cv::Mat A;

    polynomial_curve_fit(points, 3, A);
    std::cout << "A = " << A << std::endl;

    std::vector<cv::Point> points_fitted;

    for (int x = 0; x < 400; x++)
    {
        double y = A.at<double>(0, 0) + A.at<double>(1, 0) * x +
            A.at<double>(2, 0)*std::pow(x, 2) + A.at<double>(3, 0)*std::pow(x, 3);

        points_fitted.push_back(cv::Point(x, y));
    }
    cv::polylines(image, points_fitted, false, cv::Scalar(255, 255, 255), 1, 8, 0);

    cv::imshow("image", image);

    cv::waitKey(0);
    return 0;
}

原文地址:https://www.cnblogs.com/yanghailin/p/12097913.html

时间: 2024-07-30 15:17:24

opencv 最小二乘法拟合曲线的相关文章

python中matplotlib实现最小二乘法拟合的过程详解

这篇文章主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧. 前言 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法还

书籍翻拍畸变校正

1.畸变校正的基本原理: 畸变矫正,首先应该知道畸变系数,然后做与畸变相反的变换,消除畸变. 所以我们需要找到畸变系数.如何去找畸变系数?从书的边界线来确定畸变方程. 2.分析结果: 二值化--剪裁书的边界--确定边界的曲线方程--校正 二值化:直接黑白 剪裁书的边界:通过角度突变,或是统计值变化很大. 确定曲线方程,最小二乘法拟合曲线 确定校正系数 三次插值法插值 3.算法流程: 4.方案实现:matlab 1.二值化效果:20160920 2.裁剪边界:20160920-20160921 3

程序设计基础(Python语言)嵩天等课后答案

嵩天等程序设计基础(Python语言)习题答案?本书系统地介绍了Python程序设计语言和程序设计的基本方法.从Python语言发展历史.配置环境开始,详细介绍了Python语言的各种数据类型.程序编写方法.图形图像开发和多种库函数的使用.本书强调以程序设计基本方法为出发点进行计算思维能力培养,提供了大量颇具现代感的实例,以利用Python语言解决一个个具体计算问题为手段,展示Python语言强大的功能以及利用程序设计语言解决问题的过程.本书内容丰富.叙述清晰.循序渐进,突出计算思维,是面向大学

曲线拟合的最小二乘法(基于OpenCV实现)

1.原理 在现实中经常遇到这样的问题,一个函数并不是以某个数学表达式的形式给出,而是以一些自变量与因变量的对应表给出,老师讲课的时候举的个例子是犯罪人的身高和留下的脚印长,可以测出一些人的数据然后得到一张表,它反应的是一个函数,回归的意思就是将它还原成数学表达式,这个式子也称为经验表达式,之所以叫经验就是说它不完全是实际中的那样准确,是有一定偏差的,只是偏差很小罢了. 最小二乘法     设经验 方程是y=F(x),方程中含有一些待定系数an,给出真实值{(xi,yi)|i=1,2,...n},

《Master Opencv...读书笔记》非刚性人脸跟踪 III

上篇文章中,我们获得了人脸的各种表情模式,也就是一堆标注点的形变参数.这次我们需要训练一中人脸特征(团块模型),它能够对人脸的不同部位(即"标注点")分别进行描述,作为后面人脸跟踪.表情识别的区分依据.本次博文的主要内容: a.      介绍下人脸特征检测器大概有哪些类别 b.      详细介绍随机梯度法,并介绍在人脸团块特征提取时的应用 c.      为了提高训练/跟踪的健壮性,利用上一讲对输入的图像进行大小.角度的约束 人脸特征检测器综述 人脸特征检测与普通的物体检测非常相似

一元线性回归模型与最小二乘法及其C++实现

原文:http://blog.csdn.net/qll125596718/article/details/8248249 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归.回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析.对于二维空间线性是一条直线:对于三维空间线性是一

最小二乘法学习一

本文主要讲解基本最小二乘法和带有约束条件的最小二乘法. 一  基本最小二乘法 最小二乘法是回归中最为基础的算法.它是对模型的输出和训练样本输出的平方误差(这里还乘以了1/2只是为了求导简化)为最小时的参数 进行学习. 特别地,对于线性模型有: 求导可得: 其中设计矩阵: %基本最小二乘法 clear all; close all; n = 50; N = 1000; x = linspace(-3,3,n)'; X = linspace(-3,3,N)'; y = x.^2 + 2*x + 3

《Master Opencv...读书笔记》非刚性人脸跟踪 IV (终)

一.我们目前为止拥有什么 为了有一个连续完整的认识,在介绍最后一节前,先梳理下至今我们训练了哪些数据特征,并且训练它们的目的是什么. 1.      ft_data:利用手工标注工具,获取最原始的样本训练数据,包括以下内容: 图像名称集合imnames:表明在哪幅图像上标注特征点: 二维坐标集合points:手工标准点,后续更高级别特征均围绕这些特征点展开: 对称坐标索引集合symmetry:标注样本图像的镜像图像上的特征点,扩大样本库: 连接索引集合connections:描述手工标注的人脸特

最小二乘法多项式曲线拟合原理与实现

概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x). 原理 [原理部分由个人根据互联网上的资料进行总结,希望对大家能有用] 给定数据点pi(xi,yi),其中i=1,2,…,m.求近似曲线y= φ(x).并且使得近似曲线与y=f(x)的偏差最小.近似曲线在点pi处的偏差δi= φ(xi)-y,i=1,2,...,m. 常见的曲线拟合方法: 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小       3.使偏差平方