C++opencv实现最小二乘法拟合直线和平面

原创 2018年04月15日 20:17:33

使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧。
有关于原理部分,有时间再详细写一下。

#include "stdafx.h"
#include <opencv2/opencv.hpp>  
#include <vector>  
#include <iostream>  
#include <fstream>  

#pragma warning(disable:4244)

using namespace cv;
using namespace std;

/*输入一组坐标值,根据最小二乘法计算直线方程 y = kx + b 
先返回斜率 k ,再返回截距 b*/
Mat OLS_Line(vector<Point> point)
{
    //Ax = b的形式,将A b 写成矩阵的形式
    Mat A((int)point.size(), 2, CV_32F);
    Mat b((int)point.size(), 1, CV_32F);

    //初始化矩阵A
    for (size_t i = 0; i<point.size(); i++)
        A.at<float>((int)i, 1) = 1;
    for (size_t i = 0; i< point.size(); i++)
        A.at<float>((int)i, 0) = point[i].x;
//  cout <<矩阵A:<< endl << A << endl;

    //初始化矩阵b 
    for (size_t i = 0; i< point.size(); i++)
        b.at<float>((int)i, 0) = point[i].y;
//  cout <<"矩阵b"<< endl << b << endl;

    //根据线性代数知识,A'* A * x = A' * b 求得的矩阵 x 即为最优解
    //解 x = (A' * A)^-1 * A' * b

    Mat x = (A.t()*A).inv()*A.t()*b;

    return x;
}


/*输入一组坐标值,根据最小二乘法计算平面方程
分别返回 a ,b, c 的值
aX + bY - Z + c = 0 */
Mat OLS_Plane(vector<Point3f> point)
{
    //Ax = 0的形式,将A, b 写成矩阵的形式
    Mat A((int)point.size(), 3, CV_32F);
    Mat b((int)point.size(), 1, CV_32F);

//  cout <<"原始点为:"<< point << endl;

    //初始化矩阵A
    for (size_t i = 0; i< point.size(); i++)
        A.at<float>((int)i, 0) = (point[i].x);

    for (size_t i = 0; i< point.size(); i++)
        A.at<float>((int)i, 1) = (point[i].y);

    for (size_t i = 0; i<point.size(); i++)
        A.at<float>((int)i, 2) = 1;

//  cout << "矩阵A:" << endl << A << endl;

    //初始化矩阵b 
    for (size_t i = 0; i< point.size(); i++)
        b.at<float>((int)i, 0) = -(point[i].z);

//  cout << "矩阵b:" << endl << b << endl;

    //根据线性代数知识,A'* A * x = A' * b 求得的矩阵 x 即为最优解
    //解 x = (A' * A)^-1 * A' * b

    Mat x = -((A.t()*A).inv()*A.t()*b);

    return x;
}


int main()
{
    vector<Point> point;
    point.push_back(Point(1, 1));
    point.push_back(Point(2, 2));
    point.push_back(Point(3, 2));
    //point.push_back(Point(4, 10));

    cout << OLS_Line(point) << endl;;

    vector<Point3f> point3;
    point3.push_back(Point3f(2, -1,4));
    point3.push_back(Point3f(-1, 3, -2));
    point3.push_back(Point3f(0, 2, 5));
    point3.push_back(Point3f(0, 0, -14));
    //cout << point3 << endl;
    cout << OLS_Plane(point3) << endl;


    vector<Point3f> point33;
    point33.push_back(Point3f(-1, -1, -5));
    point33.push_back(Point3f(-8, 1, 0));
    point33.push_back(Point3f(3, 2, -12));
    point33.push_back(Point3f(0, 0, -8));
    //cout << point33 << endl;
    cout << OLS_Plane(point33) << endl;

    waitKey(0);
    system("pause");
    return 0;
}

最小二乘法 拟合平面直线

前言:     最近要实现一个算法,“对一系列点拟合出一条线,且区分出不属于改线的点”。在网上找了许多资料,用数学公式解释原理以及用matlab实现的居多,本文章主要解释用最小二乘法的进行点拟合成线,...
  • ouyangying123
  • ouyangying123
  • 2017-01-03 19:15:32
  • 4171

最小二乘法拟合直线--C++/Opencv

 1.原理 在现实中经常遇到这样的问题,一个函数并不是以某个数学表达式的形式给出,而是以一些自变量与因变量的对应表给出,老师讲课的时候举的个例子是犯罪人的身高和留下的脚印长,可以测出一些人的数据然后得...
  • To_Utopia
  • To_Utopia
  • 2009-11-28 14:02:00
  • 9019

opencv最小二乘法拟合平面

//Ax+by+cz=D   void cvFitPlane(const CvMat* points, float* plane){       // Estimate geometric cen...
  • u014260892
  • u014260892
  • 2016-07-30 08:18:28
  • 2840

最小二乘法拟合平面。

本文采用了opencv的一些函数来对平面进行拟合。 //Ax+by+cz=D void cvFitPlane(const CvMat* points, float* plane){ // ...
  • zhouyelihua
  • zhouyelihua
  • 2015-05-28 15:00:40
  • 15483

最小二乘法曲线拟合(C++)

  • 2010年10月23日 16:49
  • 6KB
  • 下载

最小二乘法拟合直线-C++实现

最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度): 其中,为任意像...
  • pl20140910
  • pl20140910
  • 2016-07-16 22:42:57
  • 5832

最小二乘法拟合直线 c++程序

//point.hclass Point //Point类的声明{public: //外部接口Point(float xx=0, float yy=0) {X=xx;Y=yy;}float GetX(...
  • passball
  • passball
  • 2009-05-21 20:53:00
  • 5612

最小二乘法直线拟合及其Matlab实现

最小二乘法,通常用在我们已知数学模型,但是不知道模型参数的情况下,通过实测数据,计算数学模型,例如,在题目中,数学模型就是直线方程y=ax+b,但是不知道直线方程的a和b。     本来呢,我们只需...
  • cp32212116
  • cp32212116
  • 2014-12-10 16:47:57
  • 11320

最小二乘法用于直线,多项式,圆,椭圆的拟合及程序实现

参考: http://blog.csdn.net/jairuschan/article/details/7517773/
  • piaoxuezhong
  • piaoxuezhong
  • 2017-03-31 13:05:08
  • 2809

python最小二乘法拟合直线

最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后...
  • m0_38128647
  • m0_38128647
  • 2017-07-22 09:48:02
  • 438
收藏助手
不良信息举报
您举报文章:C++opencv实现最小二乘法拟合直线和平面
举报原因:
原因补充:

(最多只允许输入30个字)