点云中点法向量,点拟合的直线,点拟合的平面

news2025/1/13 7:27:45

点云中点法向量

计算步骤:

找到点pi相邻点集合S所有点Vi,然后去中心化,并构造协方差矩阵,公式如下:

二维点云该点曲率计算方法:

三维点云该点曲率计算方法:

\frac{\lambda _{1}}{\lambda _{1}+\lambda_{2}+\lambda_{3} }

最小特征值对应的特征向量就是点的法向量

Eigen::Vector2d ComputeNormal(std::vector<Eigen::Vector2d> &nearPoints)
{
    Eigen::Vector2d normal;

    //计算激光点法向量,NICP计算法向量的方法
    Eigen::Vector2d average;//周围点的几何中心
    average.setZero();//置0
    for(auto v : nearPoints)//遍历每个点
    {
        average += v / nearPoints.size();//求其周围点的几何中心
    }

    Eigen::Matrix2d covariance;//协方差矩阵
    covariance.setZero();//置0
    for(auto v : nearPoints)//遍历每个点
    {
        covariance += (v - average) * (v - average).transpose() / nearPoints.size();//求协方差矩阵
    }

    Eigen::EigenSolver<Eigen::Matrix2d> eigen_solver(covariance);//转化为对角线矩阵
    Eigen::Vector2d eigenValues = eigen_solver.pseudoEigenvalueMatrix().diagonal();//特征值,协方差所有特征值构成向量
    Eigen::Matrix2d eigenVectors = eigen_solver.pseudoEigenvectors();//特征向量,协方差所有特征向量构成矩阵
    normal = eigenValues(0) < eigenValues(1) ? eigenVectors.col(0) : eigenVectors.col(1);//计算法向量

    return normal;
}

点拟合的直线

相邻点集合S拟合成一条直线。

计算步骤:

计算出点集合协方差矩阵M(也就是上面的计算公式),特征向量为E,特征值为V,那么中一个特征值就会明显比其他两个大,最大特征值所对应特征向量就是直线的方向。(特征值:两小一大,大方向)

Eigen::Vector3d ComputeLineNormal(std::vector<Eigen::Vector3d> &nearPoints)
{
    //计算激光点直线法向量
    Eigen::Vector3d center;//周围点的几何中心
    center.setZero();//置0
    for(auto v : nearPoints)//遍历每个点
    {
        center += v / nearPoints.size();//求其周围点的几何中心
    }

    Eigen::Matrix3d covMat;//协方差矩阵
    covMat.setZero();//置0
    for(auto v : nearPoints)//遍历每个点
    {
        Eigen::Matrix<double, 3, 1> tmpZeroMean = v - center;
        covariance += tmpZeroMean * tmpZeroMean.transpose();//求协方差矩阵
    }

    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> saes(covMat);
    Eigen::Vector3d unit_direction = saes.eigenvectors().col(2); //最大特征值对应的特征向量->边缘线方向
    // 最大特征值大于次大特征值的3倍认为是线特征
    if (saes.eigenvalues()[2] > 3 * saes.eigenvalues()[1])
    {
        Eigen::Vector3d point_on_line = center;
        Eigen::Vector3d point_a, point_b;
        // 根据拟合出来的线特征方向,以平均点为中心构建两个虚拟点,代替一条直线
        point_a = 0.1 * unit_direction + point_on_line;
        point_b = -0.1 * unit_direction + point_on_line;
    }

    return unit_direction; //返回线的法向量
}

点拟合平面

如果点集合S在一块平面上,

计算步骤:

计算出点集合协方差矩阵M(也就是上面的计算公式),特征向量为E,特征值为V,那么其中一个特征值就会明显比其他两个小,最小特征值所对应特征向量就是平面法向量。(特征值:两大一小,小方向)

//假设传进来的nearPoints有五个点
void  ComputePlaneNormal(std::vector<Eigen::Vector3d> &nearPoints)
{
    //平面方程 Ax + By + Cz + 1 =0 平面法向量(A,B,C)[待求] 已知5个点求解3个未知数,构建超定方程AX = b求解平面法向量;
    Eigen::Matrix<double, 5, 3> matA0; //A = 5 * 3 系数矩阵方程
    Eigen::Matrix<double, 5, 1> matB0 = -1 * Eigen::Matrix<double, 5, 1>::Ones();
    
    for (int j = 0; j < 5; j++)
    {
        matA0(j, 0) = nearPoints[j][0];
        matA0(j, 1) = nearPoints[j][1];
        matA0(j, 2) = nearPoints[j][2];
    }
    Eigen::Vector3d norm = matA0.colPivHouseholderQr().solve(matB0);//平面法向量求解
    double negative_OA_dot_norm = 1 / norm.norm();
    norm.normalize(); //法向量单位化 B.normalize() = B / B.norm() B 是个向量

    // Here n(pa, pb, pc) is unit norm of plane
    bool planeValid = true;
    // 根据求出来的平面方程进行校验,看看是不是符合平面约束
    for (int j = 0; j < 5; j++)
    {
        // if OX * n > 0.2, then plane is not fit well
        //点到平面的距离公式: Ax + By + Cz + D = 0 的距离公式 = fabs(Ax0 + By0 + Cz0 + D) / sqrt(A^2 + B^2 + C^2) 
        //由于前面已经进行归一化,将系数除以分母,所以可以直接代点进去求距离
        if (fabs(norm(0) * nearPoints[j][0] +norm(1) * nearPoints[j][1] + norm(2) * nearPoints[j][2] + negative_OA_dot_norm) > 0.2)
	{
	    planeValid = false;
	    break;
	}
    }
}

参考:点云配准方法---ICP升级版本NICP(Normal ICP) - 古月居

 GitHub - HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于BP神经网络的房屋价值变换趋势预测matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 住宅价格是住宅市场的核心&#xff0c;住宅市场的变化关系到广大消费者的切身利益&#xff0c;商品房价格是升是降&#xff0c;销售是冷是旺&#xff0c;是社会关注的热点问题。因此&#xff0c;…

Mybatis-Plus 入门

文章目录0. 前言1. 相关概念1.1 名称介绍1.2 官网特性介绍2. 快速入门2.1 准备工作2.2.1 准备表2.2.2 创建工程2.2 入门测试2.2.1 编写实体类2.2.2 编写Mapper2.2.3 编写测试类3. CRUD3.1 条件构造器3.1.1 AbstractWrapper&#xff08;1&#xff09; 基本比较操作&#xff08;2…

想做数码管显示,单片机IO口资源不够?看看WTV890语音芯片能做些啥

在开发许多产品时许多工程师都会遇到以下问题&#xff0c;如&#xff1a;想驱动4位或10位的LED数码管显示&#xff0c;但是单片机的IO口不够用&#xff1b;要么更换IO口资源更多的MCU来控制&#xff0c;要么更换脚位丰富的单片机&#xff0c;这无疑在MCU上&#xff0c;加了1元左…

在Linux中使用at和crontab命令在指定时间计划任务服务程序

经验丰富的系统运维工程师可以使得Linux在无需人为介入的情况下&#xff0c;在指定的时间段自动启用或停止某些服务或命令&#xff0c;从而实现运维的自动化。尽管我们现在已经有了功能彪悍的脚本程序来执行一些批处理工作&#xff0c;但是&#xff0c;如果仍然需要在每天凌晨两…

2023年电气,电子与信息工程国际会议(ISEEIE 2023)

2023年电气&#xff0c;电子与信息工程国际会议&#xff08;ISEEIE 2023&#xff09; 重要信息 会议网址&#xff1a;www.iseeie.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周…

Mac如何做才能彻底清理垃圾

Mac磁盘空间又爆满了&#xff1f;系统运行又卡了&#xff1f;你的Mac需要清理内存缓存垃圾啦&#xff01;本文教会你如何彻底清除Mac垃圾文件&#xff0c;释放存储空间。 现在&#xff0c;Mac电脑最顶配的硬盘可达2TB。这么大的容量&#xff0c;应该够用了吧&#xff1f;可真正…

windowsserver2016安装

vmware安装windowsserver2016: 开始安装OpcServer服务器端&#xff1a; DOM配置过程&#xff1a; 1.设置OpcServer和OpcClient相同的administrator账号和密码 administrator、wong123 2.关闭OpcServer和OpcClient的防火墙 3.开启OpcServer和OpcClient远程桌面访问 4.OpcServe…

玩以太坊链上项目的必备技能(OOP-合约继承-Solidity之旅九)

继承 我们今天不讲别的&#xff0c;就只讲合约继承相关的内容。&#xff08;您是不是感觉这话挺眼熟的&#xff0c;没错&#xff0c;您确实看过&#xff0c;前一篇开头便是今天我们不讲三国&#xff0c;来讲讲 流程控制&#xff0c;您会觉得我上头了还是怎么&#xff01;&…

Java-数据库范式与表关系

数据库范式 数据库范式简介 什么是范式&#xff08;NF NormalForm&#xff09; ● 范式是符合某一种设计要求的总结 在数据库中表的设计&#xff0c;必须保证其合理性 ● 数据库表的设计关系整个系统的架构&#xff0c;关系到后续的开发效率和运行效率 如何设计合理的数据库…

【leetcode】二叉树的最近公共祖先

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…

在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【数据挖掘机器学习】

文章目录一.需求分析二.使用局部回归&#xff08;Loess&#xff09;曲线&#xff08;增加一条光滑曲线到散布图&#xff09;方法处理数据三.使用分箱、回归、聚类方法 检查离群点及光滑数据&#xff1b;一.需求分析 本文主题&#xff1a;使用局部回归&#xff08;Loess&#x…

Jmeter(十九):nmon性能系统监控工具

一、Nmon介绍 Nmon得名于 Nigel 的监控器&#xff0c;是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的&#xff0c;使用 Nmon 可以很轻松的监控系统的CPU、内存、网络、硬盘、文件系统、NFS、高耗进程、资源和 IBM Power 系统的微分区的信息 Nmon是一款计算机性能系…

【JavaEE】HTTP + HTTPS(Part2 )

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【HTTP响应详解】1. 认识状态码2.认识响应“报头”header3.认识响应“正文”body【通过 Java socket 构造 HTTP 请求】三、HTTPS四、Tomcat&#xff1a;http服务器THINK一个人最大的痛苦来源于对自己无能的愤怒。 【…

Pycharm SQL 警告:SQL dialect is not configured.

Pycharm SQL 警告&#xff1a;SQL dialect is not configured. 文章目录Pycharm SQL 警告&#xff1a;SQL dialect is not configured.Unable to resolve symbol XXX在我们编写python代码的时候&#xff0c;不免会在代码里面写入自己写的sql语句&#xff0c;因为很少有orm框架能…

JVM Java内存模型(JMM)

很多人将Java内存结构与Java内存模型傻傻分不清&#xff0c;Java内存模型是Java memory model&#xff08;JMM&#xff09;的意思。简单地说&#xff0c;JMM定义了一套在多线程的环境下读写共享数据&#xff08;比如成员变量、数组&#xff09;时&#xff0c;对数据的可见性、有…

浪潮开务数据库陈磊:布局数字能源,创新助力 “双碳”

​当前&#xff0c;碳中和、碳达峰无疑是国际社会最关注的热点之一。2021 年两会上&#xff0c;我国提出&#xff1a;二氧化碳排放力争于 2030 年前达到峰值&#xff0c;努力争取 2060 年前实现碳中和。“双碳” 目标的提出将推动产业转型升级&#xff0c;提高经济增长质量&…

【LeetCode题目详解】(二)206.反转链表、876.链表的中间结点

目录 一、力扣第206题&#xff1a;反转链表 1.思路一 2.思路二 二、力扣第876题&#xff1a;链表的中间结点 1.思路一 2.思路二 总结 一、力扣第206题&#xff1a;反转链表 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;Leetcode&#xff09; 题目描述&#xff1…

gitee学习笔记(使用命令行上传、拉取资料)

1、创建一个仓库(比如命名为firstgit) 2、在文件夹中准备好要上传的资料 3、单击鼠标右键&#xff0c;打开Git Bash Here 进行命令行操作&#xff08;当然&#xff0c;前提是需要安装git客户端&#xff0c;可去官网安装&#xff09; 4、上传文件 ①git init //文件初始…

【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题

背景 做了一个和navicat一样的工具&#xff0c;web版工具&#xff0c;然后数据库链接信息都是存在一个主数据库表的里&#xff0c;所以这里涉及到了动态切换数据源&#xff0c;以及一些事务等。今天说下多数据源切换时&#xff0c;事务失效。 目录 一、常见的事务失效 Transac…

大数据必学Java基础(一百一十二):开发案例之登录验证

文章目录 开发案例之登录验证 一、准备实体类 二、准备一些页面和静态资源