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

news2024/11/28 22:33:07

最近学习了一下拟合平面的原理,看了这篇文章最小二乘拟合平面(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.coloradmin.cn/o/572682.html

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

相关文章

Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

什么是对象和类 什么是 Python 类、类对象、实例对象 类变量、实例变量/类属性、实例属性 前言 只是叫法不一样 实例属性 实例变量 类属性 类变量 个人认为叫属性更恰当 类属性和实例属性区别 类属性,所有实例对象共享该属性实例属性,属于某一…

win10系统如何设置虚拟回环

在日常生活中,人们(特别是IT行业者)通常需要在一台机上进行软件测试,而同一台计算上通常只能使用一个地址,而在需要同时使用两个地址进行测试的时候就显得捉襟见肘。此方法通过配置window10自带的环回适配器,达到上述目的。 win1…

如何用chatgpt写作论文 GPT写毕业论文的技巧

如何用chatgpt写作论文 GPT写论文的技巧 经常被问到为什么万事知天下小程序不能写论文。也不是不能写,只是GPT3.5的上下文只有4K,一般论文要写上万字,所以不可能你直接输入一个论文标题就直出结果的。 不过手工分一下步骤就可以了。先让写…

适用于中小企业的5种采购策略

与大企业不同,在采购管理方面,中小企业往往不得不在更有限的资源范围内运作,并且没有同等水平的经验丰富的采购专业人员或先进的采购技术。这会使优化采购流程并实现与大型企业相同水平的成本节约和风险管理变得更具挑战性。但是,…

docker idea直接部署到腾讯云镜像服务

首先创建一个Dockerfile 编写Dockerfile的信息 FROM java:8 MAINTAINER clarkshixxx.com RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai >/etc/timezone ENV ACTIVE"pre" ENV loggingpath"/zhibo/logs"…

【Flutter 工程】005-代码分离实践:flutter_hooks functional_widget

【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget 文章目录 【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget一、概述1、Flutter “嵌套地狱”2、代码分离实践 二、实践1、安装 flutter_hooks & f…

油猴脚本尝试

现在是这样的,我这边有个运维系统,里面有个日志,我们经常要复制,然后我们复制的时候需要打开内容,然后去选中复制。 类似于这种,我觉得这个时候,去选中复制就很麻烦,右边这里不是有…

ChatGPT四大基本使用场景分析

ChatGPT是一种基于深度神经网络的自然语言生成模型,它能够通过大量的数据训练和学习,以模拟人类的自然语言交互方式来理解和回答用户提出的问题。作为一种全新的人工智能技术,ChatGPT具有高度的灵活性和可扩展性,可以不断地优化、…

Redis BigKey问题

1.广告平台,海量数据查询固定前缀的key 不要使用keys , 使用 scan 命令 scan 0 match "user:" 10 2.Memory usage命令用过吗 memory usage key [semples count] :计算每个键值对的字节数 3.bigKey 问题,多大算bigKey,如何发现?如何处理?如…

【Linux】打开Linux大门,踏入Linux世界(环境搭建再加一群Linux基本指令就OK啦~)

🧑‍🎓个人主页:简 料 🏆所属专栏:Linux系统编程与网络编程 🏆个人社区:越努力越幸运社区 🏆简 介:简料简料,简单有料~在校大学生一枚&#x…

论文分享 | 视野约束下多机器人系统的最小持久图生成与编队控制

阿木推出的Prometheus项目校园赞助活动,再次迎来开发者参与! 北京理工大学自动化学院赵欣悦同学,在Prometheus开源仿真架构的基础上进行了二次开发,且使用P450进行了真机实验并发表了相关论文,其论文《视野约束下多机…

前端开发如何速成java,使用java开发网络接口

引言 我是干前端的,闲来没事,也想学学java,下面我会根据我学习java的经历来整理出java的速成之路。 学习路线 按照数字的顺序学下去就行了 1.学习java基础教程:主要听 class和集合这两部分吧,这两个部分非常重要&am…

ASEMI代理韩景元可控硅C106M参数,C106M封装,C106M尺寸

编辑-Z 韩景元可控硅C106M参数: 型号:C106M 断态重复峰值电压VDRM:600V 通态电流IT(RMS):4A 通态浪涌电流ITSM:30A 平均栅极功耗PG(AV):0.2W 峰值门功率耗散PGM:1W 工作接点温度Tj&…

【LeetCode】《LeetCode 101》第九章:巧解数学问题

文章目录 9.1 公倍数与公因数9.2 质数204.计数质数(中等) 9.3 数字处理504. 七进制数(简单)172. 阶乘后的零(中等)415. 字符串相加(简单)326. 3 的幂(简单) 9…

mysql语句最大执行时间问题解决,无需改mysql配置

下面是我排错的一个过程: 1、我是ado.net执行一个查询语句报了个错: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 译:超时已过期。操作完成前经过的超时时间&a…

【Netty】 工作原理详解(十一)

文章目录 前言一、Netty 模型二、代码示例2.1、引入Maven依赖2.2、服务端的管道处理器2.3、服务端主程序2.4、客户端管道处理器2.5、客户端主程序2.6、测试运行 总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二&…

借军工经验开拓消费市场,三星显示收购eMagin浅析

前不久三星显示(Samsung Display)宣布,拟支付2.18亿美元收购微显示方案商eMagin全部普通股,收购完成后eMagin将并入三星显示,以加速XR显示业务发展。 据青亭网了解,eMagin成立于1996年,该公司多…

《Spring Guides系列学习》guide11 - guide15

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

JVM调优实战

1、当项目运行一段时间以后,产生了OOM的问题,我们该如何排查问题呢? 用top命令,看看是哪个进程CPU占用率高,获取它的进程ID,再根据具体的进程id,执行 top -HP 进程id号 命令,看看哪个线程的CP…

复制架构,Redis Sentinel分析

存储高可用,一般采用复制架构,复制架构,需要关注故障架构和状态决策2个要点 复制架构通用关注点 数据复制 复制格式 格式优点缺点举例命令数据量小可能存在数据不一致Mysql 的statement同步方式,按commit顺序同步,…