三维空间离散点如何拟合平面?

这篇具有很好参考价值的文章主要介绍了三维空间离散点如何拟合平面?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0.引言

  在点云建模过程中,有时需要对扫描建模的点云进行标定,在实际使用中往往以地面做为参照平面,需要将扫描的三维空间点云进行拟合平面,以便纠正扫描结果。本文对三维空间离散点拟合平面算法进行总结,并给出几种编程语言下的算法实现代码。

1.算法原理

  (1)最小二乘法
  三维空间离散点如何拟合平面?

  (2)平面方程拟合
  三维空间离散点如何拟合平面?

2.算法实现

  (1)C#

using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;  
  
List<List<double>> dLL =new List<List<double>>();  
using (StreamReader sr = new StreamReader("E:\\4.txt", Encoding.UTF8))  
            {  
                string line;  
                // 从文件读取并显示行,直到文件的末尾   
                while ((line = sr.ReadLine()) != null)  
                {  
                    string[] strs = line.Split(',');  
                    List<double> dL = new List<double>();  
                    dL.Add(double.Parse(strs[0]));  
                    dL.Add(double.Parse(strs[1]));  
                    dL.Add(double.Parse(strs[2]));  
                    dLL.Add(dL);  
                }  
    }  
  
Matrix<double> A,b;  
double[,] dA=new double[dLL.Count(), 3];  
double[,] db = new double[dLL.Count(), 1];  
double[,] da = new double[3, 1];  
for (int i = 0; i < dLL.Count(); i++)  
{  
    dA[i, 0] = dLL[i][0];  
    dA[i, 1] = dLL[i][1];  
    dA[i, 2] = 1;  
    db[i,0] = dLL[i][2];  
}  
A = DenseMatrix.OfArray(dA);  
b = DenseMatrix.OfArray(db);  
Matrix<double> a = (A.Transpose() * A).Inverse() * A.Transpose() * b;  
Console.WriteLine("a0,a1,a2:"+a[0,0].ToString("f6")+","+a[1,0].ToString("f6") + ","+a[2,0].ToString("f6"));  

  (2)C++

//planePoints存储需要拟合的三维点云
vector<Eigen::Vector3d> planePoints;  
Eigen::MatrixXd A(planePoints.size(), 3);  
Eigen::VectorXd b(planePoints.size());  
//将观测点输入矩阵  
for (int i = 0; i < planePoints.size(); i++)  
{  
    A(i, 0) = planePoints[i](0);  
    A(i, 1) = planePoints[i](1);  
    A(i, 2) = 1;  
    b(i) = planePoints[i](2);  
}  
  
//使用最小二乘法求得系数向量  
Eigen::Vector3d a = (A.transpose()*A).inverse()*A.transpose()*b;  

  (3)Matlab

%文件名
fileName = "E:\\4.txt";  
points = csvread(fileName , 0, 0);  
length = size(points(:,1));  
A=[points(:,1),points(:,2),ones(length(1),1)];  
b=points(:,3);  
a=inv(A'*A)*A'*b;  

  (4)Java

//s为点文件数据字符串
String[] strs =  s.toString().split("\n");  
double dA[][] = new double[strs.length][3];  
double db[][] = new double[strs.length][1];  
double da[][] = new double[3][1];  
for(int i = 0;i <strs.length;i++){  
    if(strs[i].equals(""))continue;  
    String[] strs2 = strs[i].split(",");  
    dA[i][0]=Double.parseDouble(strs2[0]);  
    dA[i][1]=Double.parseDouble(strs2[1]);  
    dA[i][2] = 1;  
    db[i][0]=Double.parseDouble(strs2[2]);  
}  
//multiply、inverse、transpose分别为矩阵乘法、求逆、转置  
da = multiply(multiply(inverse(multiply(transpose(dA),dA)),transpose(dA)),db);  

  (5)VBA

Imports MathNet.Numerics.LinearAlgebra
Imports MathNet.Numerics.LinearAlgebra.Double  
  
Dim arr() As String, i As Long  
        arr = Split(CreateObject("scripting.filesystemobject").opentextfile("E:\\4.txt").readall.ToString(), vbLf)  
        Dim dA(UBound(arr), 2) As Double, db(UBound(arr), 0) As Double  
        Dim str() As String  
        For i = 0 To UBound(arr)  
            'ReDim Preserve Txt(i)  
            If arr(i) = "" Then  
                Continue For  
            End If  
            str = Split(arr(i), ",")  
            dA(i, 0) = Convert.ToDouble(str(0))  
            dA(i, 1) = Convert.ToDouble(str(1))  
            dA(i, 2) = 1  
            db(i, 0) = Convert.ToDouble(str(2))  
        Next  
        Dim A, b, ma As Matrix  
        A = DenseMatrix.OfArray(dA)  
        b = DenseMatrix.OfArray(db)  
        ma = (A.Transpose() * A).Inverse() * A.Transpose() * b  
        Console.WriteLine("a0,a1,a2:" + ma(0, 0).ToString("f6") + "," + ma(1, 0).ToString("f6") + "," + ma(2, 0).ToString("f6"))

  (6)Python

from numpy import *;
  
f=open('E:\\4.txt', encoding='gbk')  
txt=[]  
strs = []  
A = []  
b = []  
a = []  
for line in f:  
    strs=line.strip().split(',')  
    A.append([float(strs[0]),float(strs[1]),1])  
    b.append([float(strs[2])])  
A = mat(A)  
b = mat(b)  
a = (A.T*A).I*A.T*b  
print(a)

参考资料:
[1] HIIWAR_ZB. 最小二乘法——拟合平面方程(深度相机外参标定、地面标定); 2020-06-23 [accessed 2023-06-25].
[2]哈哈kls . 最小二乘法拟合平面; 2018-09-10 [accessed 2023-06-25].
[3] 脱掉外衣看本质. 三维空间离散点 平面拟合算法 C++实现; 2019-03-07 [accessed 2023-06-25].文章来源地址https://www.toymoban.com/news/detail-508658.html

到了这里,关于三维空间离散点如何拟合平面?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 三维空间刚体运动之旋转矩阵与变换矩阵

    点: 点是空间中的基本元素,没有长度,没有体积; 向量: 把两个点连接起来,就构成了向量,向量可以看成从某点指向另一点的一个箭头;只有当我们指定这个三维空间中的某个坐标系时,才可以谈论该向量在此坐标系下的坐标;默认向量就是列向量; 坐标系: 三根不

    2024年02月11日
    浏览(47)
  • PCL 判断两条线段的平行性(三维空间)

    这里使用一种比较有趣的方式来判断三维空间中两条线段的平行性,我们都知道两条线段所代表的矢量进行叉乘计算所得数值,代表了由这两条线段组成的平行四边形的面积值,如下图所示: ok,那么如果将此结论推广到三维空间呢?可以得到下面的形式: 其中, i ⃗

    2024年02月10日
    浏览(34)
  • 视觉SLAM14讲笔记-第3讲-三维空间刚体运动

    空间向量之间的运算包括: 数乘、加法、减法、内积、外积。 内积 :可以描述向量间的投影关系,结果是一个标量。 a ⃗ ⋅ b ⃗ = ∑ i = 1 3 a i b i = ∤ a ∤ ∤ b ∤ c o s ⟨ a , b ⟩ vec{a} cdot vec{b}=sum_{i=1}^3{{a _i}{b_i}} =nmid a nmid nmid b nmid cos langle a,b rangle a ⋅ b = i = 1 ∑ 3 ​

    2024年02月11日
    浏览(35)
  • 【数理知识】求两个三维空间点的坐标矩阵之间,任意两两点之间的空间距离,matlab 实现

    假设有两个包含了三维空间点坐标的,三维向量集 A A A 和 B B B ,两集合中分别有 m m m 个和 n n n 个三维空间坐标点,可以用矩阵表示为 A = [ a 1 x a 2 x a 3 x ⋯ a m x a 1 y a 2 y a 3 y ⋯ a m y a 1 z a 2 z a 3 z ⋯ a m z ] 3 × m , B = [ b 1 x b 2 x b 3 x ⋯ b n x b 1 y b 2 y b 3 y ⋯ b n y b 1 z b 2 z b 3 z ⋯

    2024年02月11日
    浏览(35)
  • 双目视觉离线测量空间三维坐标带详细注释

    直接上代码: 代码中的示例图片和参数详见链接。

    2024年02月11日
    浏览(30)
  • 【线性代数-3Blue1Brown】- 5 三维空间的线性变换

    飞书原文档:Docs  

    2024年02月11日
    浏览(30)
  • ArcGIS Pro实践技术应用、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合

    GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的研究对象是整个地理空间,而地

    2024年02月09日
    浏览(37)
  • 三维重建_体素重建_空间雕刻法/体素着色法

    目录 1. 三角化和体素重建的区别 2. 空间雕刻法  空间雕刻法的一致性定义  空间雕刻法具体实现  基于八叉树的空间雕刻法具体实现​编辑  空间雕刻法效果展示  3. 体素着色法  体素着色法的缺点:不唯一性​编辑 体素着色法不唯一性解决措施​编辑  体素着色发实验

    2024年02月11日
    浏览(56)
  • 空间三维模型的编码结构光方法实现:基于EinScan-S软件

      本文介绍基于 EinScan-S 软件,实现 编码结构光 方法的空间三维模型重建的具体操作。 目录 1 相关原理 1.1 编码结构光成像原理 1.2 编码结构光编码方式 1.3 编码结构光与侧影轮廓方法比较 1.4 编码结构光方法流程 2 三维模型制作 2.1 防晒霜罐三维模型制作 2.1.1 前期准备工作

    2024年02月05日
    浏览(35)
  • 三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本 | 三维梁 | 3D梁 | 空间梁

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏: 《 有限元编程从入门到精通 》本专栏旨在提供 1.以 案例 的形式讲解各类有限元问题的程序实现,并提供所有案例 完整源码 ;2. 单元类型 包含:杆单元,梁单元,平面三角形单元,薄板单元

    2024年03月25日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包