点云拟合平面原理和实现(Halcon)

news/2024/11/23 4:10:48/

最近学习了一下拟合平面的原理,看了这篇文章最小二乘拟合平面(C++版) - 知乎

讲到了以下几种方法,我这里在halcon中对其一一实现。

一、算法原理

1,直接求解法

2.使用拉格朗日乘子法

3 SVD分解法  

二、Halcon实现

1.各方法对比

在halcon中其实有对应的算子直接实现拟合平面Ax+By+C=D

如fit_primitives_object_model_3d 

我这里取了一张点云图,对其中一小块点云进行平面拟合测试

取红色圈内一部分数据测试

直接使用halcon算子 fit_primitives_object_model_3d得到的结果

[0.376856, -0.602116, -0.703873, -0.553981]

使用拉格朗日乘子的那个方法得到的结果

[0.376856, -0.602116, -0.703873, -0.553981]

第一个直接求解法得到的结果

[0.376656, -0.601768, -0.704277, -0.554283]

用SVD方法求解的结果

[-0.376856, 0.602116, 0.703873, 0.553981]

结果都一样,除了那个直接求解法的,没有做去质心处理,可能有点细微的差别

2.halcon代码

read_image (XYZ, '3d_machine_vision/segmentation/3d_primitives_xyz_01.tif')access_channel (XYZ, X, 1)
access_channel (XYZ, Y, 2)
access_channel (XYZ, Z, 3)gen_ellipse (ROI_0, 84.5473, 95.7705, rad(-35.9506), 10.9232, 8.60448)
reduce_domain (Z, ROI_0, ImageReduced)
xyz_to_object_model_3d (X, Y, ImageReduced, ObjectModel3D)*直接使用halcon拟合平面算子处理
fit_primitives_object_model_3d (ObjectModel3D, 'primitive_type', 'plane', ObjectModel3DOut)
get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', Result1)
get_object_model_3d_params (ObjectModel3DOut, 'primitive_rms', GenParamValue1)*获取截取的3d模型x、y、z的坐标值
get_object_model_3d_params (ObjectModel3D, 'point_coord_x', pX)
get_object_model_3d_params (ObjectModel3D, 'point_coord_y', pY)
get_object_model_3d_params (ObjectModel3D, 'point_coord_z', pZ)*测试用拉格朗日乘子法
Num:=|pX|*求均值
XM:=mean(pX)
YM:=mean(pY)
ZM:=mean(pZ)*去质心
DX:=pX-XM
DY:=pY-YM
DZ:=pZ-ZM*求矩阵各个位置的值
MA11 := sum(DX * DX)
MA22 := sum(DY * DY)
MA33 := sum(DZ * DZ)
MA12 := sum(DX * DY)
MA13 := sum(DX * DZ)
MA23 := sum(DY * DZ)
create_matrix (3, 3, [MA11,MA12,MA13,MA12,MA22,MA23,MA13,MA23,MA33], MatrixID)*实对称矩阵,求特征值和特征向量
eigenvalues_symmetric_matrix (MatrixID, 'true', EigenvaluesID, EigenvectorsID)*特征值按小到大排列,所以平面法向量是第一列特征向量
get_value_matrix (EigenvectorsID, 0, 0, NX)
get_value_matrix (EigenvectorsID, 1, 0, NY)
get_value_matrix (EigenvectorsID, 2, 0, NZ)*算C  平面方程NX*X+NY*Y+NZ*Z=C
C := NX * XM + NY * YM + NZ * ZM
Result2:=[NX,NY,NZ,C]*对应使用直接求解法
*算矩阵各个位置的值
MB11:=sum(pX*pX)
MB12:=sum(pX*pY)
MB13:=sum(pX)
MB22:=sum(pY*pY)
MB23:=sum(pY)
MB33:=|pX|
MC1:=sum(pX*pZ)
MC2:=sum(pY*pZ)
MC3:=sum(pZ)create_matrix (3, 3, [MB11,MB12,MB13,MB12,MB22,MB23,MB13,MB23,MB33], MB)
create_matrix (3, 1, [MC1,MC2,MC3], MC)
solve_matrix (MB, 'general', 0, MC, MatrixResultID)
get_full_matrix (MatrixResultID, Values)
*要求a^2+b^2+c^2=1 求解真正的a、c
dd:=Values[0]*Values[0]+Values[1]*Values[1]+1
a:=Values[0]/sqrt(dd)
b:=Values[1]/sqrt(dd)
c:=-1/sqrt(dd)
*因为这里的平面方程为a*x+b*y+c*z=d 与文章中方程A*x+B*y+C*z+D=0中d相差个负号,所以
d:=-Values[2]/sqrt(dd)
Result3:=[a,b,c,d]*SVD分解法  
create_matrix (3, Num, [DX,DY,DZ], A)
transpose_matrix_mod (A)
svd_matrix (A, 'full', 'both', U, S, V)get_full_matrix (V, VValues)
get_value_matrix (V, 0, 2, Value1)
get_value_matrix (V, 1, 2, Value2)
get_value_matrix (V, 2, 2, Value3)Value4:=Value1*XM+Value2*YM+Value3*ZM
Result4:=[Value1,Value2,Value3,Value4]

那个求各个位置的值,可以直接用矩阵相乘好了,简写成

*求特征向量法
create_matrix(3,Num,[DX,DY,DZ],B)
mult_matrix (B, B, 'ABT', MatrixMultID)
eigenvalues_symmetric_matrix (MatrixMultID, 'true', EigenvaluesID1, EigenvectorsID1)
get_full_matrix (EigenvectorsID1, Values3)
aa:=Values3[0]
bb:=Values3[3]
cc:=Values3[6]
dd:=aa*XM+bb*YM+cc*ZM
Result5:=[aa,bb,cc,dd]


http://www.ppmy.cn/news/89398.html

相关文章

如何在架构活动中持续创造价值

架构活动的四个核心角色,分别是决策者、赞助者、执行者和架构师。架构师的作用贯穿架构活动的整个过程,是架构活动的设计者、规划者和执行保障者。 一般来说,架构活动有八个大节点,依次是环境搭建、目标确认、可行性探索、规划确…

Android Bluetooth杂记

本文仅供个人记录一些日常笔记,仅供参考! 一、打开蓝牙LOG 将/etc/bluetooth/bt_stack.conf中的打印级别改成5,然后使用 logcat -v time 抓取相关 log,下面是bt_stack.conf的内容: # Enable BtSnoop logging function # valid value : tru…

SpringBoot ( 三 ) 转页

2.4.转页 2.4.1.内部转页 forward 2.4.1.1.转页配置 在 配置文件 resources > application.properties 中可以找到转页的配置信息, 这些是SpringBoot的默认配置, 是可以省略不写在配置文件中的 2.4.1.2.准备页面 在 resources 文件夹下 创建新文件夹 templates , 这个文…

什么是网络编程

目录 一、什么是网络编程? 二、协议 1.用户数据报协议(User Datagram Protocol) 2.TCP协议 TCP三次握手过程 三、实例 1.UDP通信程序 实现步骤 TCP接收数据 四、TCP协议和UDP协议的区别和联系 一、什么是网络编程? 1.在网络通信协议下&#xf…

微信H5跳转小程序api使用和场景适用情况

1: h5 在 小程序的webview 内 使用 wx.miniProgram.navigateTo 使用说明:web-view | 微信开放文档 2: H5在微信公众号 使用:wx-open-launch-weapp 使用说明:目录 | 微信开放文档 限制:用户需点击 静态调用, 开放对…

骑行,为日益冷漠的人际关系加点温度

随着社会的发展和人们生活水平的提高,越来越多的年轻人、老年人和中年人开始关注健康和运动。而骑行作为一种健康、环保、经济实惠的运动方式,受到越来越多人的喜爱。本文将从社会面探讨这些话题对于不同人群的影响。 首先,骑行对身体有着多方…

项目随机问题笔记

一、前端项目启动的命令 启动项目依赖:npm install 安装cross-env模块:npm i cross-env --save-dev 启动报错时试试这个 npm install node-sass (安装sass) 启动项目命令1 npm run dev 启动项目命令2 npm run start 启动项目命令3 npm start 二、前…

网络安全工程师能拿高薪的秘密!

网络安全是一门具有很强实践性的学科,但是网络安全传统过程对实践能力培养环节比较薄弱,缺少适应新需求的实践与创新平台。所以,很多网络安全专业的学生学习的基本都是理论知识,而最重要的实战能力薄弱。仅仅只会一点基础的专业知…