Halcon中的3D技术

对于检测一些产品的3d信息,我们通过3d相机能获取其点云数据或一张带有高度信息的图像。

这边我们用SmartRay相机,获取到一张16位的png图像。实际上就是一张高度信息图。

这边X、Y缩放比例为0.019,Z方向为0.0016,意思就是你xyz乘这系数就是相对距离。

在那个相机软件中能看到如上的3d图。

我们获取到的是一张16位的PNG图,如下

Halcon中建立一个3d模型,需要3张图像,每张图的灰度值分别代表X、Y、Z。

现在我们有的是上面这张Z方向的还没缩放的图。转乘real的,缩放就能得到Z。X、Y图自己创建就行。这边讲原点设在图像左上角。

halcon代码:

convert_image_type (Zmap112653, ImageConverted, 'real')
get_image_size (ImageConverted, Width, Height)
gen_image_surface_first_order (ImageSurface, 'real', 1, 0, 0, 0, 0, Width, Height)
gen_image_surface_first_order (ImageSurface1, 'real', 0, 1, 0, 0, 0, Width, Height)
scale_image (ImageSurface, X, 0.019, 0)
scale_image (ImageSurface1, Y, 0.019, 0)
scale_image (ImageConverted, Z, 0.0016, 0)
compose3 (X, Y, Z, MultiChannelImage)
xyz_to_object_model_3d (X, Y, Z, ObjectModel3D)

好了,我们就得到这个3d模型了。

下面举个应用的例子:测量两平面的夹角

如上图,我们要测量我画的两块红框位置,它们两平面的夹角。在3D模型中也能看出,这个差不多90度的样子。

我们需要分别拟合这两块平面,然后得到其单位法向量,向量点乘得到这个角的cos,就知道夹角了。

当然拟合平面是注意去躁,这个成像上面有很多丢失点,这边在Z图上一个阈值分割就能把它们去掉,得到有效的region来拟合平面。

halcon代码:

我们得到了那个有效的红色框region(排除了其中的躁点区域)RegionIntersection

reduce_domain (X, RegionIntersection, ImageReduced3)
xyz_to_object_model_3d (ImageReduced3, Y, Z, ObjectModel3D1)
fit_primitives_object_model_3d (ObjectModel3D1, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)
get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', ParamValue)
get_object_model_3d_params (ObjectModel3DOut, 'primitive_rms', ParamValue4)

解释下这段代码:

reduce了X,然后生成一个3D模型ObjectModel3D1,这样这个3D模型就只有那个用来拟合的平面部分,

fit_primitives_object_model_3d 这个算子用来拟合的,这边填入了一些参数拟合类型:plane,算法:最小二乘法。然后我们

得到一个模型:ObjectModel3DOut。这是那个拟合出来的3D平面模型。

然后我们通过get_object_model_3d_params,从拟合的模型中获取信息

这个primitive_parameter获取这平面的单位法向量和这个平面距离原点的距离,4个参数。[x,y,z,D]

primitive_rms就是rms喽。

照着这么做,把另外一个平面搞出来,就能求两平面的夹角了。

 

至于其他应用,如找两平面的交线,点到平面的距离,就是一些向量运算。

 

### Halcon 点云处理实战案例 #### 使用Halton进行3D点云数据读取与显示 为了有效展示如何利用Halcon处理三维点云,在实际操作中,通常会先加载点云文件。下面是一个简单的例子来说明这一过程: ```cpp // 加载点云数据并创建窗口用于可视化 read_points_3d_model ("pointcloud.ply", Points3D); dev_open_window (0, 0, 800, 600, 'white', WindowHandle) disp_points_3d (Points3D, WindowHandle) ``` 这段代码展示了怎样从PLY格式的文件中导入点云模型,并将其渲染出来以便观察[^2]。 #### 基于特征提取的目标识别 在工业检测领域内,基于点云的目标物体自动识别是一项重要任务。通过计算几何特性(比如曲率)、颜色直方图或者其他描述符来进行匹配工作能够实现高效而精准的结果判定。这里给出一段简化版的例子用来解释这个概念: ```cpp // 计算局部表面属性作为形状描述子 points_3d_to_xyz (Points3D, X, Y, Z) shape_signature (X, Y, Z, Signature) // 对签名向量执行聚类分析找出潜在对象实例 cluster_points_by_shape_signatures (Signature, ClusteredObjects) ``` 此部分程序片段实现了对输入点集构建其对应的形态学指纹库,并以此为基础完成分类作业[^3]。 #### 结合机器学习方法改进分割质量 针对复杂背景下的多类别物品区分难题,可以引入监督式训练机制辅助传统阈值法或区域增长策略提高准确性。具体做法是在预处理阶段标注好样本集合之后交给支持向量机(SVM)或其他类型的预测器去学习规律模式;最终再应用于未知测试集中得到优化后的边界划分方案。 ```cpp // 准备带标签的数据集供后续建模使用 gen_sample_class_svm ('train', SampleImage, ClassID, SVMHandle) // 应用已训练好的SVM模型做决策判断 classify_class_svm (TestImage, SVMHandle, ResultClass) ``` 上述脚本介绍了如何准备训练素材以及调用预先建立的学习引擎做出推断的过程[^4]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值