首页 > 其他分享 >[Open3d系列]--点云曲线拟合

[Open3d系列]--点云曲线拟合

时间:2024-03-11 15:34:32浏览次数:27  
标签:曲线拟合 ax2 ax1 fit -- 点云 set np

Open3d: 点云曲线拟合

因为项目需要分析点云数据, 此文总结其中拟合点云的部分。

拟合

首先定一个曲线方程:

def func(x, a, b, c):
    return a * x**2 + b * x + c

然后将点云数据结构转换为numpy数组:

points = np.asarray(pcd.points)

读取点数组中,x轴、y轴的数组:

xy_points = points[:, :2]
x = xy_points[:,x_axis_idx]
y = xy_points[:,y_axis_idx]

调用scipy.optimize中的curve_fit进行点拟合, 得到各项系数:

popt, pcov = curve_fit(func,x, y)

以上结果系数在返回值popt中, 为一个元组

为了评估其拟合的好坏, 此处计算了残差, 然后分析其分布情况:

residuals = y - func(x, *popt)

# 通过标准差, 判断其离散程度
np.sqrt(np.sum(residuals**2)/x.shape[0]) < std_threshold

可视化

import matplotlib.pyplot as plt
import matplotlib
# 保证中文显示正常
matplotlib.rcParams['axes.unicode_minus'] = False
matplotlib.rcParams['font.family'] = 'SimHei'

x_fit = np.linspace(np.min(x), np.max(x), x.shape[0])
y_fit = func(x_fit, a_fit, b_fit, c_fit)
# 创建两个子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
ax1.scatter(x,y, color='blue', label='Point Cloud')
ax1.plot(x_fit,y_fit, color='red', linewidth=2, label='Fitted Curve')
ax1.legend()
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_title(f"曲线拟合(Fitted Curve)\n$y={a_fit:.3f}*x^2+{b_fit:.3f}*x+{c_fit:.3f}$")

# 绘制残差图
ax2.scatter(x, residuals)
ax2.axhline(y=0, color='r', linestyle='--')
ax2.set_xlabel('X')
ax2.set_ylabel('Residuals')
ax2.set_title('残差(Residuals)')

# 计算R-squared
mean_y = np.mean(y)
ss_total = np.sum((y - mean_y) ** 2)
ss_residual = np.sum(residuals ** 2)
r_squared = 1 - (ss_residual / ss_total)

# 值越大拟合效果越好
ax2.text(0.02, 0.95, f"R平方:{r_squared:.3f},残差的标准差:{np.sqrt(np.sum(residuals**2)/x.shape[0]):.3f}", transform=ax2.transAxes, fontsize=14,verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

# 0.06为观测阈值
fig.suptitle("点云拟合分析", fontsize=20) 
plt.tight_layout()
plt.show()

最终效果:
点云拟合分析

标签:曲线拟合,ax2,ax1,fit,--,点云,set,np
From: https://www.cnblogs.com/quenwaz/p/18066172

相关文章

  • 3-10
    今天完成了第一次数据筛查作业用idea清洗数据,用python完成分析#-*-coding:utf-8-*-importpandasaspdimportmatplotlib.pyplotasplt#从CSV文件中读取数据data=pd.read_csv('zongbiao.csv',encoding='utf-8')#设置中文字体plt.rcParams['font.sans-serif']=['......
  • shell 给字符串双引号,并去除多余的空格
    用到的命令:echo输出字符串tr常用于处理字符串间隔,例如将空格分割替换为逗号分割;删除多个连续的空格等等sed也是用于字符串处理。如字符串替换,也可做字符串删除awk也用于字符串处理。如将字符串按照空格等分隔符,分成好几列,按需输出某一列的值;字符计数,统计次数;复杂的字符串......
  • Windows Server 2012R2 丢失api-ms-win-crt-runtime-l1-1-0.dll
    在网上搜索了很久,没有现成的帖子可以解决。安装补丁不是提示“一个或多个问题导致了安装失败”就是此更新不适用于你的计算机。最终在微软官网读到补丁安装要遵守一个顺序,在此特地把解决过程分享出来,希望能帮助到苦于搜索的人报错信息 无法启动此程序,因为计算机中丢失api-ms......
  • 英码嵌入式联合昇腾推出EA200I AI智能计算模组:国产化程度高,支持产品全面定制!
    此前,华为昇腾的Atlas200IDKA2开发者套件凭借其高性能、硬件接口丰富、参考代码和算法模型丰富、工具全流程覆盖、方便用户快速验证等特点在行业内极为火热。英码嵌入式致力于嵌入式计算与人工智能硬件行业,拥有多年深厚的技术沉淀和技术服务经验,2024年,英码嵌入式将携手华为昇腾......
  • 云计算 - 内容分发网络CDN技术与应用全解
    在这篇全面解析CDN的技术文章中,我们深入探讨了CDN的基础概念、核心架构、多样化产品和在不同行业中的应用案例。文章揭示了CDN技术如何优化内容分发,提升用户体验,并展望了CDN面临的挑战和未来发展趋势。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有......
  • sqlalchemy高级查询操作
    连接数据库准备fromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportscoped_sessionfrommodelsimportUsers,Person,Hobby,Boy,Girlfromsqlalchemy.sqlimporttextengine=create_engine("mysql+pymysql://roo......
  • 慢慢学doris之【窗口函数】
    窗口函数也叫分析函数,可以用于自定义额外的查询字段,用于分析查询出来的数据。 举例说明,比如说现在有一个资讯浏览量的查询结果 其中sum_counts字段是根据日期分组然后累加的点击量,一般情况下,查询到这里也就差不多了。但是使用窗口函数还可以进一步分析得到的数据。比如,使用......
  • 如何在Qt的 paintEvent之外进行绘制
    QPainter默认只能在paintEvent中进行绘制这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制 为了实现这个目的,可以采用以下方法:继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap最后在重载的paintEvent中将QPixmap复制显示:#prag......
  • 前端发展趋势与 ViewDesign 的崛起
    前端发展的新时代近年来,随着Web技术的不断发展,前端已经不再是简单的展示层,而是日益成为复杂的应用程序。传统的前端开发模式已经无法满足现代Web应用的需求,因此出现了一系列新的前端框架和工具。其中,Vue.js因其轻量级、高性能和易于上手等优势,成为了前端开发领域中的......
  • P5905 【模板】全源最短路(Johnson)
    原题链接题解发誓以后除了stl内置,其他时候结构体绝对不内置比较函数code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;llin_q[3005]={0};llh[3005]={0};llvis[3005]={0};lldis[3003]={0};constllinf=1e9;struct{llto,val,head;}ed......