pclpy 最小二乘法拟合平面

pclpy 最小二乘法拟合平面

      • 一、算法原理
      • 二、代码
      • 三、结果
          • 1.左边原点云、右边最小二乘法拟合平面后点云投影
      • 四、相关数据

一、算法原理

平面方程的一般表达式为:
A x + B y + C z + D = 0 ( C ≠ 0 ) Ax + By + Cz + D = 0 \quad (C\neq0) Ax+By+Cz+D=0(C=0)
即:
Z = − A C x − B C y − D C Z = -\frac{A}{C}x-\frac{B}{C}y-\frac{D}{C} Z=CAxCByCD
记:
a 0 = − A C , a 1 = − B C , a 2 = − D C a_0 = -\frac{A}{C}, a_1 =-\frac{B}{C}, a_2=-\frac{D}{C} a0=CA,a1=CB,a2=CD
所以:
Z = a 0 x + a 1 y + a 2 Z = a_0x + a_1y + a_2 Z=a0x+a1y+a2
要用该 n 个点拟合平面方程,即使:
∑ n = 1 N ( a 0 x + a 1 y + a 2 ) 2 − > m i n \sum_{n=1}^{N}{(a_0x + a_1y + a_2)^2}->min n=1N(a0x+a1y+a2)2>min
要使S最小,对a,b,c求偏导

在这里插入图片描述

改写成矩阵的形式为:

在这里插入图片描述

二、代码

from pclpy import pcl
import numpy as npdef CloudShow(cloud1, cloud2):"""Args:在一个窗口可视化多个点云cloud1: 点云数据1cloud2: 点云数据2"""viewer = pcl.visualization.PCLVisualizer("viewer")  # 建立可刷窗口对象 窗口名 viewerv0 = 1  # 设置标签名(0, 1标记第一个窗口)viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v0)  # 创建一个可视化的窗口viewer.setBackgroundColor(0.0, 0.0, 0.0, v0)  # 设置窗口背景为黑色single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud1, 255.0, 0, 0.0)  # 将点云设置为红色viewer.addPointCloud(cloud1,  # 要添加到窗口的点云数据。single_color,  # 指定点云的颜色"sample cloud1",  # 添加的点云命名v0)  # 点云添加到的视图v1 = 2  # 设置标签名(2代表第二个窗口)viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v1)  # 创建一个可视化的窗口viewer.setBackgroundColor(255.0, 255.0, 255.0, v1)  # 设置窗口背景为白色single_color = pcl.visualization.PointCloudColorHandlerCustom.PointXYZ(cloud2, 0.0, 255.0, 0.0)  # 将点云设置为绿色viewer.addPointCloud(cloud2,  # 要添加到窗口的点云数据。single_color,  # 指定点云的颜色"sample cloud2",  # 添加的点云命名v1)  # 点云添加到的视图# 设置点云窗口(可移除对点云可视化没有影响)viewer.setPointCloudRenderingProperties(0,  # 设置点云点的大小1,  # 点云像素"sample cloud1",  # 识别特定点云v0)  # 在那个窗口可视化viewer.setPointCloudRenderingProperties(0,  # 设置点云点的大小1,  # 点云像素"sample cloud2",  # 识别特定点云v1)  # 在那个窗口可视化# viewer.addCoordinateSystem(1.0)  # 设置坐标轴 坐标轴的长度为1.0# 窗口建立while not viewer.wasStopped():viewer.spinOnce(10)def plane(cloud, normal_vector):coeffs = pcl.ModelCoefficients()  # 创建了一个模型系数对象coeffs.values.append(normal_vector[0])  # a = 0.0coeffs.values.append(normal_vector[1])  # b = 0.0coeffs.values.append(normal_vector[2])  # c = 1.0coeffs.values.append(normal_vector[3])  # d = 0.0# 创建滤波器proj = pcl.filters.ProjectInliers.PointXYZ()  # 过滤器对象 proj,用于将点云投影到一个模型上。proj.setModelType(0)  # 模型类型被设为 0,代表使用平面模型。proj.setInputCloud(cloud)  # 将cloud点云数据进行处理proj.setModelCoefficients(coeffs)  # 处理参数coeffscloud_projected = pcl.PointCloud.PointXYZ()  # 建立保存点云proj.filter(cloud_projected)  # 将投影结果保存return cloud_projectedif __name__ == '__main__':cloud1 = pcl.PointCloud.PointXYZ()reader = pcl.io.PCDReader()  # 设置读取对象reader.read('res/bunny.pcd', cloud1)  # 读取点云保存在cloud中# 调用函数,生成离散点x, y, z = cloud1.x, cloud1.y, cloud1.zN =  cloud1.size()# ------------------------构建系数矩阵-----------------------------A = np.array([[sum(x ** 2), sum(x * y), sum(x)],[sum(x * y), sum(y ** 2), sum(y)],[sum(x), sum(y), N]])B = np.array([[sum(x * z), sum(y * z), sum(z)]])# 求解X = np.linalg.solve(A, B.T)print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f' % (X[0], X[1], X[2]))a, b, c, d = X[0], X[1], -1, X[2]plane_cloud = plane(cloud1, [a, b, c, d])  # 获得投影后的点云数据# ------------------ 可视化点云 -----------------CloudShow(cloud1, plane_cloud) 

三、结果

1.左边原点云、右边最小二乘法拟合平面后点云投影

在这里插入图片描述

四、相关数据

最小二乘法拟合参考链接:最小二乘拟合平面(python/C++版) - 知乎 (zhihu.com)

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

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

相关文章

【JSON详细讲解】

JSON讲解 1. 介绍2. JSON的基本规则3. JSON中的数据类型4. JSON的基本结构5. 在不同的语言中使用JSON 1. 介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是基于JavaScript的一个子集,但它是独立于语言的&a…

矢量扩散模型初探

import paddle from matplotlib import pyplot as plt import numpy as np from tqdm import tqdm# 从零开始构建一个简单的扩散模型 # 首先是扩散过程 # loss=label-net(sqrt(alpha_prod[t])*x0+sqrt(1-alpha_prod[t])*label) # label =正太分布采样 # alpha 是 一个斜边为1 的…

Java中使用链表实现的数据结构

在Java中,链表实现主要体现在以下几种数据结构中: 1. LinkedList LinkedList类实现了List接口和Deque接口,提供了双向链表的实现。它允许null元素,提供了列表的顺序访问以及在列表的头部和尾部进行高效的插入和移除操作。Linked…

Spring Boot对接RocketMQ示例

部署服务 参考RocketMq入门介绍 示例 引入maven依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version></dependency>完整依赖如下&am…

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…

Rust升级慢,使用国内镜像进行加速

背景 rustup 是 Rust 官方的跨平台 Rust 安装工具&#xff0c;国内用户使用rustup update的时候&#xff0c;网速非常慢&#xff0c;可以使用国内的阿里云镜像源来进行加速 0x01 配置方法 1. Linux与Mac OS用户配置环境变量 修改~/.bash_profile文件添加如下内容&#xff1…

微信小程序 --- 小程序基础知识

小程序基础知识 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题…

力扣链表篇

以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链…

敏捷开发最佳实践:价值维度实践案例之ABTest中台化

22年敏捷白皮书调研发现&#xff0c;仅有14%的企业部分实现价值管理闭环&#xff0c;8%的企业能够做到企业战略和业务目标与价值管理紧密结合。这一现象说明了大部分中国企业还不能在敏捷实践中实现需求价值的体系化及多维度价值度量&#xff0c;因此推广优秀的敏捷实践至关重要…

AutoGen Studio助力打造私人GPTs

微软最近在开源项目里的确挺能整活儿啊! 这次我介绍的是AutoGen Studio,我认为这个项目把AutoGen可用性又拔高了一个层次的项目 项目给自己的定义是交互式的多Agent workflow 项目地址:autogen/samples/apps/autogen-studio at main microsoft/autogen (github.com) 首先我…

电商数据分析9——通过数据分析提升电商平台客户服务体验

目录 写在开头1. 客户服务体验的重要性1.1 客户满意度与忠诚度1.2 客户反馈的价值2. 数据分析在客户服务中的应用2.1 客户服务请求分析2.2 客户满意度调查分析2.3 服务流程优化3. 客户服务提升的成功案例3.1 案例分析:快速响应机制3.1.1 背景介绍3.1.2 问题定义3.1.3 数据来源…

【蓝牙协议栈】【AVRCP】蓝牙音视频远程控制协议

1. AVRCP概念 AVRCP(Audio/Video Remote Control Profile):音视频远程控制协议定义了蓝牙设备和 audio/video控制功能通信的特点和过程,另用于远程控制音视频设备,底层传输基于 AVCTP(音视频控制传输协议)。 ➢该 Profile定义了AV/C数字命令控制集。命令和信息通过 AVCT…

微信小程序02: 使用微信快速验证组件code获取手机号

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 微信小程序获取手机号2.1 业务场景(使用与充值)2.2 准备工作2.3 具体代码使用与注释如下2.3.1 代码解释(一)[无需复制]2.3.2 代码解释(二)[无需复制] 2.4 最后一步 获取手机号信息2.4.1 两行代…

MYSQL--(1.存储引擎 *2.事务*)

一 存储引擎: 1.介绍 1>在数据库管理系统当中通过使用数据引擎来实现数据的增删改,查询 2>不同的存储引擎提供的有不同的存储机制,索引技巧等功能 MYSQL的核心,就是存储引擎 3>同样的,用户也可以根据自己的需要进行选择,更改自己需要…

【Linux】部署前后端分离项目---(Nginx自启,负载均衡)

目录 前言 一 Nginx&#xff08;自启动&#xff09; 2.1 Nginx的安装 2.2 设置自启动Nginx 二 Nginx负载均衡tomcat 2.1 准备两个tomcat 2.1.1 复制tomcat 2.1.2 修改server.xml文件 2.1.3 开放端口 2.2 Nginx配置 2.2.1 修改nginx.conf文件 2.2.2 重启Nginx服务 2…

力扣● 343. 整数拆分 ● 96.不同的二叉搜索树

● 343. 整数拆分 想不到&#xff0c;要勇于看题解。 关键在于理解递推公式。 1、DP数组及其下标的含义&#xff1a;dp[i]是分解i这个数得到的最大的乘积。 2、DP数组如何初始化&#xff1a;dp[0]和dp[1]都没意义&#xff0c;所以直接不赋值&#xff0c;初始化dp[2]1即可。…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…

任务书参考答案-模块3-理论题

理论技能与职业素养(100分) “信息安全管理与评估”理论技能 一、 单选题 (每题2分,共35题,共70分) 1、应急事件响应和恢复措施的目标是( B )。 A、保证信息安全 B、最小化事件的影响 C、找出事件的责任人 D、加强组织内部的监管 2、下列数据类型不属于静态数据提取的…

计算机设计大赛 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

Mybatis中 <where> </where> 标签

mybatis的动态sql非常强大。 其中 标签 在不满足 where子句后面的筛选条件时&#xff0c;会去掉 where 子句。 例&#xff1a; <select id"findList" resultMap"userMap" parameterType"UserDto">select*FROMusers<where><if …