一、什么叫"平面矫正"?
在 HALCON / PCL / 工业视觉 / 点云 里,所谓 平面矫正,本质只有一件事:
通过估计一个参考平面,把点云或图像坐标系旋转 / 平移,使该平面满足某个规范姿态
常见目标形式:
HALCON / PCL 做的不是"神秘算法",而是:RANSAC 平面 + 坐标变换
| 目标 | 数学表达 |
|---|---|
| 平面变成 XY 平面 | z=0 |
| 平面法向对齐 Z 轴 | n=(0,0,1) |
| 平面"摆正" | 去除倾斜 |
| 标定基准 | 统一世界坐标 |
二、统一数学模型(核心骨架)
1️⃣ 平面模型
无论 HALCON / PCL:

2️⃣ 平面矫正的数学目标

三、HALCON 中平面矫正算法原理
1️⃣ HALCON 的"官方思路"
HALCON 并不直接叫"平面矫正",而是拆成三步:
cpp
① 平面提取(RANSAC / MSAC)
② 平面参数 → 坐标变换
③ 点云 / 图像变换
2️⃣ 平面提取(第一性原理)
核心算子
segment_planes_object_model_3d
内部算法
-
MSAC(RANSAC 的改进)
-
目标函数:
-

3️⃣ 从平面到"矫正"的数学过程(关键)
(1) 得到平面法向
cpp
PlaneInfo = [nx, ny, nz, d]
(2) 构造旋转矩阵(核心思想)

(3) 平移(让平面落在 z=0)

4️⃣ HALCON 中的实现哲学
HALCON 帮你做了第 ① 步 ,
第 ②③ 步通常由:
-
rigid_trans_object_model_3d -
pose_to_hom_mat3d
完成。
📌 HALCON = 高度封装的"RANSAC + 刚体变换"
四、PCL 中平面矫正算法原理(更透明)
1️⃣ 平面分割(RANSAC)
pcl::SACSegmentation
数学模型:

PCL 的典型思路:
(1) 得到法向量
cpp
Eigen::Vector3f n(a,b,c);
(2) 目标法向
cpp
Eigen::Vector3f z(0,0,1);
(3) 构造旋转矩阵
cpp
Eigen::Quaternionf q;
q.setFromTwoVectors(n, z);
Eigen::Matrix3f R = q.toRotationMatrix();
📌 这一步 = Rodrigues 的数值稳定实现
3️⃣ 平移补偿
找任一平面点 ppp,变换后应满足:
z=0
平移:t = -R * p;
4️⃣ 应用刚体变换
pcl::transformPointCloud(cloud, cloud_out, T);
五、HALCON vs PCL 的本质区别(重点)
https://blog.csdn.net/weixin_39354845/article/details/134760348