求取平面参数

news2024/11/24 19:37:02

平面方程AX+BY+CZ+D=0

变换一下-> A/DX + B/DY+C/DZ= -1

该方程满足Ax=b 

其中A\begin{bmatrix} x\\ y\\ z \end{bmatrix}, x\begin{bmatrix} \frac{A}{D}\\ \frac{B}{D}\\ \frac{C}{D} \end{bmatrix},b为-1单位阵

求解代码如下:

/* comment
plane equation: Ax + By + Cz + D = 0
convert to: A/D*x + B/D*y + C/D*z = -1
solve: A0*x0 = b0
where A0_i = [x_i, y_i, z_i], x0 = [A/D, B/D, C/D]^T, b0 = [-1, ..., -1]^T
normvec:  normalized x0
*/
template<typename T>
bool esti_normvector(Matrix<T, 3, 1> &normvec, const PointVector &point, const T &threshold, const int &point_num)
{
    MatrixXf A(point_num, 3);
    MatrixXf b(point_num, 1);
    b.setOnes();
    b *= -1.0f;

    for (int j = 0; j < point_num; j++)
    {
        A(j,0) = point[j].x;
        A(j,1) = point[j].y;
        A(j,2) = point[j].z;
    }
    normvec = A.colPivHouseholderQr().solve(b);
    
    for (int j = 0; j < point_num; j++)
    {
        if (fabs(normvec(0) * point[j].x + normvec(1) * point[j].y + normvec(2) * point[j].z + 1.0f) > threshold)
        {
            return false;
        }
    }

    normvec.normalize();
    return true;
}

template<typename T>
bool esti_plane(Matrix<T, 4, 1> &pca_result, const PointVector &point, const T &threshold)
{
    Matrix<T, NUM_MATCH_POINTS, 3> A;
    Matrix<T, NUM_MATCH_POINTS, 1> b;
    b.setOnes();
    b *= -1.0f;

    for (int j = 0; j < NUM_MATCH_POINTS; j++)
    {
        A(j,0) = point[j].x;
        A(j,1) = point[j].y;
        A(j,2) = point[j].z;
    }

    Matrix<T, 3, 1> normvec = A.colPivHouseholderQr().solve(b);

    T n = normvec.norm();
    pca_result(0) = normvec(0) / n;
    pca_result(1) = normvec(1) / n;
    pca_result(2) = normvec(2) / n;
    pca_result(3) = 1.0 / n;

    for (int j = 0; j < NUM_MATCH_POINTS; j++)
    {
        if (fabs(pca_result(0) * point[j].x + pca_result(1) * point[j].y + pca_result(2) * point[j].z + pca_result(3)) > threshold)
        {
            return false;
        }
    }

    // for (int j = 0; j < NUM_MATCH_POINTS; j++)
    // {
    //     if (fabs(normvec(0) * point[j].x + normvec(1) * point[j].y + normvec(2) * point[j].z + 1.0f) > threshold)
    //     {
    //         return false;
    //     }
    // }

    // T n = normvec.norm();
    // pca_result(0) = normvec(0) / n;
    // pca_result(1) = normvec(1) / n;
    // pca_result(2) = normvec(2) / n;
    // pca_result(3) = 1.0 / n; 
    return true;
}

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

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

相关文章

逆向汇编与反汇编——基本数据类型

-1&#xff1a;0xFFFFFFFF 为什么内存使用补码来存储数据&#xff1f; 》因为CPU的设计只有加法器&#xff0c;没有减法&#xff0c;需要使用补码来实现减法 大端&#xff1a;数值的高位放到内存的低字节 小端模式验证&#xff1a;78 78 浮点型&#xff1a;单精度float和双精…

创建类构造器

类的创建 构造器 作用&#xff1a;给类赋值 类实际可分为&#xff1a;构造器属性方法 构造器的重载 重载&#xff1a;方法名相同&#xff0c;参数类型不同 一定要有空构造器&#xff01;&#xff01;&#xff01; TIP&#xff1a;this.指代当前创建对象

数据结构与算法系列之希尔排序

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选…

Python读写mat文件(使用scipy.io)

在matlab中&#xff0c;数据可保存为mat文件&#xff0c;使用save和load命令可进行读写操作。而在Python中&#xff0c;也可以对mat文件进行读写。 一、由matlab向Python传数据&#xff08;Python读取mat文件&#xff09; 第一步&#xff1a;使用matlab创建变量并保存至mat文…

某程序员——我应届毕业,年薪23万...

马士兵教育线下训练营第1期 已经圆满结束啦~ 不了解训练营的伙伴 有的在观望、有的在好奇 训练营真的能学到东西吗&#xff1f; 出去了之后能找到工作吗&#xff1f; 不如看看那些参加过的人是怎么说的 或许&#xff0c;你会对我们、对训练营 会有更深入的了解...... 0…

计算机视觉:转置卷积

转置卷积 文章目录 转置卷积基本操作填充、步幅和多通道性质 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是卷积神经网络&#xff08;CNN&#xff09;中的一种操作&#xff0c;它可以将…

排他网关-部署流程定义

类&#xff1a;com.roy.ActivitiGatewayExclusive /*** 部署流程定义*/Testpublic void testDeployment(){ // 1、创建ProcessEngineProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); // 2、得到RepositoryService实例RepositoryService…

剑指offer刷题笔记--题目11-20

1-旋转数组的最小数字&#xff08;11&#xff09; 主要思路&#xff1a; 一次旋转将最后一个元素移动最前面&#xff0c;由于数组最开始是升序的&#xff0c;因此数组的大部分元素都应该保持升序的状态&#xff08;n1<n2<...<n3>n4<n5<...<n6&#xff09;…

JAVA练习小游戏——贪吃蛇小游戏 PLUS版

目录 基础版本 新增内容 1.添加START开始界面 2.新增背景音乐 3.添加SCORE计分 4.新增游戏机制 代码实现 实机演示 基础版本 JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客https://blog.csdn.net/timberman666/article/details/131046742?spm1001.201…

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…

如何从平面图或蓝图为 ROS 创建地图

如何从平面图或蓝图为 ROS 创建地图 在本教程中&#xff0c;我将向您展示如何从平面图或蓝图为 RViz&#xff08;ROS 的 3D 可视化程序&#xff09;创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。 我们经常使用机器人的激光雷达来构建地图。这很好&am…

【openeuler】Yocto embedded sig例会 (2023-01-12)

Yocto & embedded sig例会 (2023-01-12)_哔哩哔哩_bilibili

群智能算法-模拟退火

一.基本理念 模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成。 加温过程&#xff1a;我…

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码&#xff0c;输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言&#xff1a;声音事件检测与定位&#xff08;SELD&#xff09;作为DCASE挑战赛的子任务&#xff0c;从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型&#xff0c;过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件&#xff0c;我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了&#xff0c;所以通常会对所抓的空口包进行过滤然后分析。 写个例子&#xff1a; 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期&#xff0c;历经领域驱动设计、微服务架构等阶段&#xff0c;软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中&#xff0c;存在可缩减的设计与开发成本&#xff0c;曾经看似不可…