精华内容
下载资源
问答
  • 使用最小二乘法拟合平面,借助pcl点云库中的估计法矢的类来得到模型中点云曲面法矢估计。 是一个较为简单,常用的代码。txt文件
  • C++实现最小二乘法拟合平面

    千次阅读 2020-09-04 11:13:10
    https://blog.csdn.net/u013541523/article/details/80135568),该链接为了推导介绍方便,只考虑了1种z=ax+by+d的情况,实际代码情况有3种情况,否则某些合理的点会导致逆矩阵为0求不出平面参数。 ...

    直接上代码(部分理论可以参考:https://blog.csdn.net/u013541523/article/details/80135568),该链接为了推导介绍方便,只考虑了1种z=ax+by+d的情况,实际代码情况有3种情况,否则某些合理的点会导致逆矩阵为0求不出平面参数。

    ModelPointXYZFloat.h

    class ModelPointXYZFloat {
    public:
    	ModelPointXYZFloat();
    	virtual ~ModelPointXYZFloat();
    
    	//unit:m
    	float x_;
    	float y_;
    	float z_;
    };
    

    ModelPointXYZFloat.cpp

    #include "ModelPointXYZFloat.h"
    
    ModelPointXYZFloat::ModelPointXYZFloat() {
    	// TODO Auto-generated constructor stub
    	x_ = 0;
    	y_ = 0;
    	z_ = 0;
    }
    
    ModelPointXYZFloat::~ModelPointXYZFloat() {
    	// TODO Auto-generated destructor stub
    }
    

    LeastSquaresFitLine.h

    #ifdef X86
    #include "ModelPointXYZFloat.h"
    #else
    #include "src/ModelPointXYZFloat.h"
    #endif
    
    #include <vector>
    
    class LeastSquaresFitPlane {
    public:
    	LeastSquaresFitPlane();
    	virtual ~LeastSquaresFitPlane();
    
    	//ax+by+cz+d = 0;(a,b,c为法线)
    	static bool LeastSquaresFitPlane3D(const std::vector<ModelPointXYZFloat>& points, double& a, double& b, double& c, double& d);
    
    private:
    	//z = ax+by+d
    	static bool LeastSquaresFitPlaneZ(double(*arr)[3], double* val ,double& a, double& b, double& c, double& d);
    	//y = ax+bz+d
    	static bool LeastSquaresFitPlaneY(double(*arr)[3], double* val, double& a, double& b, double& c, double& d);
    	//x = ay+bz+d
    	static bool LeastSquaresFitPlaneX(double(*arr)[3], double* val, double& a, double& b, double& c, double& d);
    };
    

    LeastSquaresFitPlane.cpp

    /*
     * LeastSquaresFitPlane.cpp
     *
     *  Created on: 2020年9月3日
     *      Author: zzb
     */
    
    #include "LeastSquaresFitPlane.h"
    
    #include <math.h>
    
    LeastSquaresFitPlane::LeastSquaresFitPlane() {
    	// TODO Auto-generated constructor stub
    
    }
    
    LeastSquaresFitPlane::~LeastSquaresFitPlane() {
    	// TODO Auto-generated destructor stub
    }
    
    bool LeastSquaresFitPlane::LeastSquaresFitPlane3D(
    		const std::vector<ModelPointXYZFloat>& points, double& a, double& b,
    		double& c, double& d) {
    	double Mxsq = 0, Mysq = 0, Mzsq = 0, Mxy = 0, Mxz = 0, Myz = 0, Mx = 0, My = 0, Mz = 0;
    
    	for (unsigned int i = 0; i < points.size(); i++){
    		Mxsq += pow(points[i].x_, 2);
    		Mysq += pow(points[i].y_, 2);
    		Mzsq += pow(points[i].z_, 2);
    
    		Mxy += points[i].x_ * points[i].y_;
    		Mxz += points[i].x_ * points[i].z_;
    		Myz += points[i].y_ * points[i].z_;
    
    		Mx += points[i].x_;
    		My += points[i].y_;
    		Mz += points[i].z_;
    	}
    
    	int n = points.size();
    
    	double arr_z[3][3] = { { Mxsq, Mxy, Mx },
    	{ Mxy, Mysq, My },
    	{ Mx, My, n } };
    	double val_z[3] = { Mxz, Myz, Mz };
    	if (LeastSquaresFitPlaneZ(arr_z, val_z, a, b, c, d)){
    		return true;
    	}
    
    	double arr_y[3][3] = { { Mxsq, Mxz, Mx },
    	{ Mxz, Mzsq, Mz },
    	{ Mx, Mz, n } };
    	double val_y[3] = { Mxy, Myz, My };
    	if (LeastSquaresFitPlaneY(arr_y, val_y, a, b, c, d)){
    		return true;
    	}
    
    	double arr_x[3][3] = { { Mysq, Myz, My },
    	{ Myz, Mzsq, Mz },
    	{ My, Mz, n } };
    	double val_x[3] = { Mxy, Mxz, Mx };
    	if (LeastSquaresFitPlaneX(arr_x, val_x, a, b, c, d)){
    		return true;
    	}
    
    	return false;
    }
    
    bool LeastSquaresFitPlane::LeastSquaresFitPlaneZ(double (*arr)[3], double* val,
    		double& a, double& b, double& c, double& d) {
    	double arr_r = arr[0][0] * arr[1][1] * arr[2][2]
    		+ arr[0][1] * arr[1][2] * arr[2][0]
    		+ arr[0][2] * arr[1][0] * arr[2][1]
    		- arr[0][2] * arr[1][1] * arr[2][0]
    		- arr[0][1] * arr[1][0] * arr[2][2]
    		- arr[0][0] * arr[1][2] * arr[2][1];
    	if (fabs(arr_r) <= 1e-5){
    		//行列式值等于0,没有逆矩阵
    		return false;
    	}
    
    	//根据伴随矩阵求逆
    	double arr_inv[3][3] = { 0 };
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			double marr[2][2] = { 0 };
    			for (int m = 0, k = 0; m < 3; m++, k++){
    				if (m == i){
    					k--;
    					continue;
    				}
    
    				for (int n = 0, l = 0; n < 3; n++, l++){
    					if (n == j){
    						l--;
    						continue;
    					}
    
    					marr[k][l] = arr[m][n];
    				}
    			}
    
    			arr_inv[j][i] = pow(-1, (i + j)) * (marr[0][0] * marr[1][1] - marr[0][1] * marr[1][0]) / arr_r;
    		}
    	}
    
    	double ret[3] = { 0 };
    	for (int m = 0; m < 3; m++){
    		ret[m] = 0;
    
    		for (int j = 0; j < 3; j++){
    			ret[m] += arr_inv[m][j] * val[j];
    		}
    	}
    
    	a = -ret[0];
    	b = -ret[1];
    	c = 1;
    	d = -ret[2];
    
    	return true;
    }
    
    bool LeastSquaresFitPlane::LeastSquaresFitPlaneY(double (*arr)[3], double* val,
    		double& a, double& b, double& c, double& d) {
    	double arr_r = arr[0][0] * arr[1][1] * arr[2][2]
    		+ arr[0][1] * arr[1][2] * arr[2][0]
    		+ arr[0][2] * arr[1][0] * arr[2][1]
    		- arr[0][2] * arr[1][1] * arr[2][0]
    		- arr[0][1] * arr[1][0] * arr[2][2]
    		- arr[0][0] * arr[1][2] * arr[2][1];
    	if (fabs(arr_r) <= 1e-5){
    		//行列式值等于0,没有逆矩阵
    		return false;
    	}
    
    	//根据伴随矩阵求逆
    	double arr_inv[3][3] = { 0 };
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			double marr[2][2] = { 0 };
    			for (int m = 0, k = 0; m < 3; m++, k++){
    				if (m == i){
    					k--;
    					continue;
    				}
    
    				for (int n = 0, l = 0; n < 3; n++, l++){
    					if (n == j){
    						l--;
    						continue;
    					}
    
    					marr[k][l] = arr[m][n];
    				}
    			}
    
    			arr_inv[j][i] = pow(-1, (i + j)) * (marr[0][0] * marr[1][1] - marr[0][1] * marr[1][0]) / arr_r;
    		}
    	}
    
    	double ret[3] = { 0 };
    	for (int m = 0; m < 3; m++){
    		ret[m] = 0;
    
    		for (int j = 0; j < 3; j++){
    			ret[m] += arr_inv[m][j] * val[j];
    		}
    	}
    
    	a = -ret[0];
    	b = 1;
    	c = -ret[1];
    	d = -ret[2];
    
    	return true;
    }
    
    bool LeastSquaresFitPlane::LeastSquaresFitPlaneX(double (*arr)[3], double* val,
    		double& a, double& b, double& c, double& d) {
    	double arr_r = arr[0][0] * arr[1][1] * arr[2][2]
    		+ arr[0][1] * arr[1][2] * arr[2][0]
    		+ arr[0][2] * arr[1][0] * arr[2][1]
    		- arr[0][2] * arr[1][1] * arr[2][0]
    		- arr[0][1] * arr[1][0] * arr[2][2]
    		- arr[0][0] * arr[1][2] * arr[2][1];
    	if (fabs(arr_r) <= 1e-5){
    		//行列式值等于0,没有逆矩阵
    		return false;
    	}
    
    	//根据伴随矩阵求逆
    	double arr_inv[3][3] = { 0 };
    	for (int i = 0; i < 3; i++){
    		for (int j = 0; j < 3; j++){
    			double marr[2][2] = { 0 };
    			for (int m = 0, k = 0; m < 3; m++, k++){
    				if (m == i){
    					k--;
    					continue;
    				}
    
    				for (int n = 0, l = 0; n < 3; n++, l++){
    					if (n == j){
    						l--;
    						continue;
    					}
    
    					marr[k][l] = arr[m][n];
    				}
    			}
    
    			arr_inv[j][i] = pow(-1, (i + j)) * (marr[0][0] * marr[1][1] - marr[0][1] * marr[1][0]) / arr_r;
    		}
    	}
    
    	double ret[3] = { 0 };
    	for (int m = 0; m < 3; m++){
    		ret[m] = 0;
    
    		for (int j = 0; j < 3; j++){
    			ret[m] += arr_inv[m][j] * val[j];
    		}
    	}
    
    	a = 1;
    	b = -ret[0];
    	c = -ret[1];
    	d = -ret[2];
    
    	return true;
    }
    
    
    展开全文
  • 最小二乘法拟合平面原理MATLAB&C++实现 最小二乘法拟合平面原理 最小二乘法是我们平时用的比较的多一种拟合算法,尤其是在直线拟合,平面拟合中,大量的工程实践验证了其具有简便好用的特点。但是,其抗噪声性...

    最小二乘法拟合平面原理MATLAB&C++实现

    最小二乘法拟合平面原理

    	最小二乘法是我们平时用的比较的多一种拟合算法,尤其是在直线拟合,平面拟合中,大量的工程实践验证了其具有简便好用的特点。但是,其抗噪声性差,对测量数据有较高的要求。下面我们探讨一下其基本原理和实现过程。
    	首先,我们会用各种仪器测量得到多组数据。当然,至少要有不同的三组数据,且不能在同一条直线上取这些数据,这是确定一个平面的基本要求。
    

    在这里插入图片描述

    	我们选择平面方程为:
    	ax + by + cz + d = 0
    	为了方便构建误差函数,我们转换形式,我们可以用下面方程表示:
    	z = ax + by + c
    	我们构建最小二乘误差函数:
    

    在这里插入图片描述

    当误差函数取得最小值时,我们就得到了最佳拟合的平面。
    视a,b,c为自变量,我们对其求导,得到如下方程组:
    在这里插入图片描述
    移项,整理可得:
    在这里插入图片描述
    为了方便求解,我们用矩阵的形势来表示上述方程组,
    在这里插入图片描述
    转变形势,得到a,b,c的表达式:
    在这里插入图片描述

    将测量数据带入上式,即可求出a,b,c的值。
    

    MATLAB实现

    clc;
    clear all;
    x = [1478.5,1190.5,2043];
    y = [968.5,1449.5,1432];
    z = [33202.83,33185.18,33168.82];
    a12 = sum(xy’);
    a13 = sum(x);
    a22 = sum(y.^2);
    a23 = sum(y);
    a33 = size(x,2);
    c11 = sum(x
    z’);
    c22 = sum(yz’);
    c33 = sum(z);
    A = [a11 a12 a13;
    a12 a22 a23;
    a13 a23 a33];
    B = inv(A);
    C = B
    [c11;c22;c33];

    c++实现

    int n = cloud_.size();
    Eigen::MatrixXd points;
    points.resize(n, 3);
    for (int i = 0; i < n; i++)
    {
    points(i, 0) = cloud_.at(i).x;
    points(i, 1) = cloud_.at(i).y;
    points(i, 2) = cloud_.at(i).z;
    }
    double A11 = 0, A12 = 0, A13 = 0;
    double A21 = 0, A22 = 0, A23 = 0;
    double A31 = 0, A32 = 0, A33 = 0;
    double B1 = 0, B2 = 0, B3 = 0;
    A11 = (points.array().col(0) * points.array().col(0)).sum();
    A12 = (points.array().col(0) * points.array().col(1)).sum();
    A13 = (points.array().col(0)).sum();
    A21 = A12;
    A22 = (points.array().col(1) * points.array().col(1)).sum();
    A23 = (points.array().col(1)).sum();
    A31 = A13; A32 = A23;
    A33 = n;
    B1 = (points.array().col(0) * points.array().col(2)).sum();
    B2 = (points.array().col(1) * points.array().col(2)).sum();
    B3 = (points.array().col(2)).sum();
    Eigen::MatrixXd A;
    A.resize(3, 3);
    A(0, 0) = A11; A(0, 1) = A12; A(0, 2) = A13;
    A(1, 0) = A21; A(1, 1) = A22; A(1, 2) = A23;
    A(2, 0) = A31; A(2, 1) = A32; A(2, 2) = A33;
    Eigen::MatrixXd B;
    B.resize(3, 1);
    B(0, 0) = B1; B(1, 0) = B2; B(2, 0) = B3;
    double C1 = 0, C2 = 0, C3 = 0;
    C1 = A.inverse()(0, 0) * B(0) + A.inverse()(0, 1) * B(1) + A.inverse()(0, 2) * B(2);
    C2 = A.inverse()(1, 0) * B(0) + A.inverse()(1, 1) * B(1) + A.inverse()(1, 2) * B(2);
    C3 = A.inverse()(2, 0) * B(0) + A.inverse()(2, 1) * B(1) + A.inverse()(2, 2) * B(2);

    展开全文
  • 给定n个三维点的坐标,根据这些点坐标由最小二乘法拟合平面。 分析推导: 平面一般方程为ax+by+cy+d=0; 这里为了便于描述,将平面方程变形为:z=Ax+By+C(相当于令上述平面一般方程中的c=-1,a=A,b=B,d=C)。...

    问题:

    给定n个三维点的坐标,根据这些点坐标由最小二乘法拟合平面。

    分析推导:

    平面一般方程为ax+by+cy+d=0;

    这里为了便于描述,将平面方程变形为:z=Ax+By+C(相当于令上述平面一般方程中的c=-1,a=A,b=B,d=C)。因为已知了n个三维点的坐标,所以理想情况下将各点坐标代入平面方程中构建一个方程组,求解方程组即可。

    \left\{\begin{matrix}z_0=Ax_0+By_0+C \\ z_1=Ax_1+By_1+C \\ \cdots \end{matrix}\right.

    但是由于n个三维点的测量误差,点不一定在平面上,所以上述方程组是无解的。因此,采用最小二乘法求解上述线性方程组

    下面对方程z=Ax+By+C根据最小二乘法求解其中的系数A,B,C。

    构建方程的目标函数

    J(A,B,C)=\sum_{i=0}^{n}(Ax_{i}+By_{i}+C-z_{i})^{2}

    求解A,B,C使得损失函数J最小,采用微积分中的最小二乘法,即对A,B,C分别求偏导,令其偏导均为0,如下所示:

    \left\{\begin{matrix} \partial J/\partial A=2*\sum_{i=0}^{n}(Ax_i+By_i+C-z_i)*x_i=0\\ \partial J/\partial B=2*\sum_{i=0}^{n}(Ax_i+By_i+C-z_i)*y_i=0 \\\partial J/\partial C=2*\sum_{i=0}^{n}(Ax_i+By_i+C-z_i)=0 \end{matrix}\right.

    将上述方程组进行展开、变形,得到一个未知量为A,B,C的线性方程组:

    \left\{\begin{matrix}A \sum_{}x_i^2+B\sum_{}x_iy_i+C\sum_{}x_i=\sum_{}x_iz_i \\ A \sum_{}x_iy_i+B\sum_{}y_i^2+C\sum_{}y_i=\sum_{}y_iz_i \\ A \sum_{}x_i+B\sum_{}y_i+C*n=\sum_{}z_i \end{matrix}\right.

    构建上述方程组的系数矩阵Coeff,以及方程右边的常数向量v

    Coeff=\begin{bmatrix} \sum_{}x_i^2 &\sum_{}x_iy_i &\sum_{}x_i \\ \sum_{}x_iy_i &\sum_{}y_i^2 &\sum_{}y_i \\ \sum_{}x_i &\sum_{}y_i &n \end{bmatrix}

    v=\begin{Bmatrix}\sum_{}x_iz_i \\ \sum_{}y_iz_i \\ \sum_{}z_i \end{Bmatrix}

    由此构建了形如Coeff *x=v的线性方程组,x=Coeff^{-1} * v,由此即可计算得到方程组的解\vec{x}

    关于最小二乘法是否有解,以及最小二乘法的解是否为全局最优解,参考这篇文章的介绍:https://www.zhihu.com/question/427449730

    上面完成了最小二乘法求解平面方程的理论推导,下面进行代码实现: C++结合OpenCV实现矩阵运算

    cv::Vec4f fitplane(vector<cv::Point3f> ptsvec)
    {
    	int n = ptsvec.size();
    	cv::Mat input_pts(n, 3, CV_32FC1);
    	for (int i = 0; i < n; i++)
    	{
    		input_pts.at<float>(i, 0) = ptsvec[i].x;
    		input_pts.at<float>(i, 1) = ptsvec[i].y;
    		input_pts.at<float>(i, 2) = ptsvec[i].z;
    	}
    	double A11 = 0, A12 = 0, A13 = 0;
    	double A21 = 0, A22 = 0, A23 = 0;
    	double A31 = 0, A32 = 0, A33 = 0;
    	double B1 = 0, B2 = 0, B3 = 0;
    	for (int i = 0; i < n; i++)
    	{
    		A11 += input_pts.at<float>(i, 0)*input_pts.at<float>(i, 0);
    		A12 += input_pts.at<float>(i, 0)*input_pts.at<float>(i, 1);
    		A13 += input_pts.at<float>(i, 0);
    		A21 += input_pts.at<float>(i, 0)*input_pts.at<float>(i, 1);
    		A22 += input_pts.at<float>(i, 1)*input_pts.at<float>(i, 1);
    		A23 += input_pts.at<float>(i, 1);
    		A31 += input_pts.at<float>(i, 0);
    		A32 += input_pts.at<float>(i, 1);
    		B1 += input_pts.at<float>(i, 0)*input_pts.at<float>(i, 2);
    		B2 += input_pts.at<float>(i, 1)*input_pts.at<float>(i, 2);
    		B3 += input_pts.at<float>(i, 2);
    	}
    	A33 = n;
    
    	cv::Mat A(3, 3, CV_32FC1);
    	A.at<float>(0, 0) = A11; A.at<float>(0, 1) = A12; A.at<float>(0, 2) = A13;
    	A.at<float>(1, 0) = A21; A.at<float>(1, 1) = A22; A.at<float>(1, 2) = A23;
    	A.at<float>(2, 0) = A31; A.at<float>(2, 1) = A32; A.at<float>(2, 2) = A33;
    	cv::Mat B(3, 1, CV_32FC1);
    	B.at<float>(0, 0) = B1; B.at<float>(1, 0) = B2; B.at<float>(2, 0) = B3;
    	cv::Mat X;
    	X = A.inv()*B;//X为3*1解向量,分别对应平面方程z=ax+by+c中的abc
    	cv::Vec4f v;
    	v[0] = X.at<float>(0, 0);
    	v[1] = X.at<float>(1, 0);
    	v[2] = X.at<float>(2, 0);
    	return v;
    }

    随机给一组点进行测试:(该点为三维坐标系中Oxy平面附近的一组点,坐标的z值在0附近小范围波动,拟合的平面法向量应该近似等于(0,0,1))。

    
    int main()
    {
    	vector<cv::Point3f> pts;
    	//pts.resize(5);
    	pts.push_back(cv::Point3f(10.1, 20.5, 0.12));
    	pts.push_back(cv::Point3f(15.1, 34.5, 0.1));
    	pts.push_back(cv::Point3f(13.1, 7.5, -0.05));
    	pts.push_back(cv::Point3f(10.1, 25.5, 0.03));
    	pts.push_back(cv::Point3f(14.1, 10.5, 0.1));
    	pts.push_back(cv::Point3f(16.1, 40.5, 0.2));
    	pts.push_back(cv::Point3f(32.1, 10.5, -0.2));
    	cv::Vec4f v = fitplane(pts);
        cout << "coeff: "<< v[0] << ", "<< v[1] <<", " << v[2] << endl;
    	return 0; 
    }

    程序运行后的打印结果如下图:

    展开全文
  • 最小二乘法拟合平面 -- 代码实现(C++, Eigen3)说明作者[ 哈哈kls ]的推导C++实现 说明 本文基于博主 哈哈kls 的博文:最小二乘法拟合平面 的公式推导,用C++进行实现。 文章出处:...

    最小二乘法拟合平面 -- 代码实现(C++, Eigen3)

    说明

    本文基于博主 哈哈kls 的博文:最小二乘法拟合平面 的公式推导,用C++进行实现。
    文章出处:https://blog.csdn.net/konglingshneg/article/details/82585868

    作者[ 哈哈kls ]的推导

    Alt
    注:上图最后一句应该是: z = a 0 x + a 1 y + a 2 z=a_{0}x+a_{1}y+a{2} z=a0x+a1y+a2

    C++实现

    #include <iostream>
    #include <vector>
    #include <Eigen/Dense>
    #include <Eigen/Cholesky>
    #include <Eigen/LU>
    #include <Eigen/QR>
    #include <Eigen/SVD>
    
    using namespace std;
    using namespace Eigen;
    
    /*
    * From: https://blog.csdn.net/konglingshneg/article/details/82585868
    * Author: JARK006(JARK006@QQ.COM)
    * z = a0x + a1y + a2
    * a0*x + a1*y - z + a2 = 0
    * 入参:points --待拟合平面的点集
    * 返回:拟合平面法向量 { a0, a1, -1 }
    */
    vector<double> FittingPlaneEigen(vector<vector<double>>& points) {
        vector<vector<double>> mat3x4(3, vector<double>(4, 0));
        for (const auto& p : points) {
            // 3x3 方程组参数   p[0]:x, p[1]:y, p[2]:z
            // 对角线对称,只需处理5个
            mat3x4[0][0] += p[0] * p[0];
            mat3x4[0][1] += p[0] * p[1];
            mat3x4[0][2] += p[0];
            mat3x4[1][1] += p[1] * p[1];
            mat3x4[1][2] += p[1];
    
            // 3x1 方程组值
            mat3x4[0][3] += p[0] * p[2];
            mat3x4[1][3] += p[1] * p[2];
            mat3x4[2][3] += p[2];
        }
    
        MatrixXd A(3, 3);
        A <<
            mat3x4[0][0], mat3x4[0][1], mat3x4[0][2],
            mat3x4[0][1], mat3x4[1][1], mat3x4[1][2],
            mat3x4[0][2], mat3x4[1][2], (double)points.size();
        MatrixXd B(3, 1);
        B << mat3x4[0][3], mat3x4[1][3], mat3x4[2][3];
    
        //以下三个方式前14位有效数字基本一致,任选一个
        //来源:https://eigen.tuxfamily.org/dox/group__LeastSquares.html
        MatrixXd a = A.bdcSvd(ComputeThinU | ComputeThinV).solve(B);
        //MatrixXd a = A.colPivHouseholderQr().solve(B);
        //MatrixXd a = A.lu().solve(B);
    
        // a0*x + a1*y - z + a2 = 0 法向量为:a(0), a(1), -1
        return { a(0), a(1), -1.0 };
        
        // 若需 A*x + B*y + C*z + D = 0 形式,则A,B,C,D为{ a(0), a(1), -1.0, a(2) }
        // return { a(0), a(1), -1.0, a(2) };
    }
    
    展开全文
  • 代码中除了用OpenCV3.3库函数进行直线拟合,还自己根据拟合公式写了一个拟合接口函数,两个拟合出来的效果是一样的。
  • 平面公式为:Ax+By+Cz=D 代码: ...//对应的方程:Ax+By+Cz=D 其中 A = plane12[0], B = plane12[1], C = plane12[2], D = plane12[3],这是要注意的方程的表示 //float plane12[4] = { 0 };//定义用来储存平面参数...拟合
  • 最小二乘法曲面拟合

    2015-03-29 12:49:06
    可以实现利用最小二乘法对直线 圆 球 平面拟合 ,并给出误差评价
  • 最小二乘法 拟合平面直线

    万次阅读 2017-01-03 19:15:32
    在网上找了许多资料,用数学公式解释原理以及用matlab实现的居多,本文章主要解释用最小二乘法的进行点拟合成线,matlab 和 c++两个版本的代码实现。 使用矩阵实现: 根据公式A = (X'*X)-1*X'*Y(这个公式可以拟合...
  • 使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧。 有关于原理部分,有时间再详细写一下。 #include "stdafx.h" #...
  • 最小二乘法拟合椭圆——MATLAB和Qt-C++实现

    千次阅读 热门讨论 2018-07-01 21:31:26
    本小节Jungle尝试用最小二乘法拟合椭圆,并用MATLAB和C++实现。 1.理论知识 平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程通式为 其中 在原始测得的N(N≥5)组...
  • 最小二乘法拟合圆——MATLAB和Qt-C++实现

    万次阅读 热门讨论 2018-07-01 21:24:46
    本节Jungle尝试用最小二乘法拟合圆,并用MATLAB和C++实现。 1.理论知识 根据圆心(A,B)和半径R可确定平面上一个圆。平面上圆方程的通式为 其中 第一个圆的通式是关于a、b和c的线性方程。利用最小二乘法...
  • opencv最小二乘法拟合平面

    千次阅读 2016-07-30 08:18:28
    //定义用来储存平面参数的数组     cvFitPlane(points_mat, plane12); //调用方程    我们拟合出来的方程:Ax+By+Cz=D 其中 A=plane12[0], B=plane12[1], C=plane12[2], D=plane12[3], ...
  • 最小二乘法拟合平面

    万次阅读 多人点赞 2015-05-28 15:00:40
    本文采用了opencv的一些函数来对平面进行拟合。 //Ax+by+cz=D void cvFitPlane(const CvMat* points, float* plane){ // Estimate geometric centroid. int nrows = points->rows; int ncols = points->cols...
  • 本节Jungle用C++实现最小二乘法拟合平面直线。 1.理论知识 平面直线的通用方程可以表示为 其中,A是直线的截距,B是直线的斜率。对于测量的二维坐标(x,y),x是精确分布的,而y是观测值。基于最小二乘的理论,...
  • 最小二乘法原理以及其平面拟合c++实现代码
  • 最小二乘法拟合直线-C++实现

    万次阅读 多人点赞 2016-07-16 22:42:57
    最近公司的一个项目需要计算TVDI...为某一NDVI对应的最小地表温度,对应的是湿边;为某一NDVI对应的最大地表温度,对应的是干边;a,b为湿边的拟合方程系数,c,d为干边的拟合方程系数。 在拟合干边和湿边的过程
  • //直接复制到cpp文件中就.../=拟合y=a0+a1x+a2x2+……+apoly_n*xpoly_n==/ /=n是数据个数 xy是数据值 poly_n是多项式的项数==/ /=返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)===/ void polyfit(int n, d.
  • 本文原创,转载请注明来源:https://blog.csdn.net/syc666946/article/details/79954587最小二乘原理见https://blog.csdn.net/jairuschan/article/details/7517773关于原文下面评论中的问题:为什么最后一步明明是...
  • 点云拟合平面-最小二乘法

    千次阅读 2020-11-18 17:23:33
    参考:https://blog.csdn.net/qq_45427038/article/details/100139330 1. 普通的最小二乘拟合平面 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import math # 从...
  • 最小二乘法计算平面

    千次阅读 2020-08-13 23:42:16
    通过最小二乘法,可以求解平面的参数:a,b,ca,b,ca,b,c,进而求解平面度。 本文假定测量数据为: #-- coding:UTF-8 -- #空间平面的方程:z = ax + by + c #目标:求解a,b,c的值 #已知条件:12个被测点的三维坐标 ...
  • 最小二乘法拟合三维直线

    千次阅读 2020-02-05 18:06:30
    在《高等数学》的书中给出了最小二乘法拟合直线的具体实例,但是那个例子是拟合二维直线的f(t)=at+b,那么三维直线怎么使用最小二乘法来拟合呢?我们先来看看《高等数学》书中的例子,由于任何实数的平方都是正数或...
  • //拟合平面直线或曲线展示 private: PointCloud::Ptr cloud; PointT point_min; PointT point_max; double a_3d; double b_3d; double c_3d; double k_line; double b_line; }; //fitting.cpp #include "fitting.h...
  • 移动最小二乘法(MLS)曲线曲面拟合C++代码实现

    万次阅读 多人点赞 2017-01-07 22:54:44
    移动最小二乘法(MLS)曲线曲面拟合曲线曲面拟合有很多种方法,Beizer,B样条等,曲面拟合移动最小二乘法是一个很好的选择,本文会详细讲解一下移动最小二乘法方法拟合曲面,并给出C++代码实现。 本文首先是最小二...
  • 已知若干组圆上的测量坐标值,利用最小二乘法拟合圆,可输出圆心及半径值
  • 最小二乘法拟合椭圆——MATLAB和Qt-C++实现 https://blog.csdn.net/sinat_21107433/article/details/80877758 以上文章中,C++代码有问题。因此参考如下文章,得到正确的结果。 矩阵求逆-高斯消元法介绍及其实现 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 418
精华内容 167
关键字:

c++最小二乘法拟合平面

c++ 订阅