开启左侧

Halcon中的3D技术

[复制链接]
Princess 发表于 2019-10-8 14:50:37 | 显示全部楼层 |阅读模式
对于检测一些产品的3d信息,我们通过3d相机能获取其点云数据或一张带有高度信息的图像。
这边我们用SmartRay相机,获取到一张16位的png图像。实际上就是一张高度信息图。
这边X、Y缩放比例为0.019,Z方向为0.0016,意思就是你xyz乘这系数就是相对距离。
20190704100531352.png
在那个相机软件中能看到如上的3d图。
我们获取到的是一张16位的PNG图,如下
20190704100641664.png
Halcon中建立一个3d模型,需要3张图像,每张图的灰度值分别代表X、Y、Z。
现在我们有的是上面这张Z方向的还没缩放的图。转乘real的,缩放就能得到Z。X、Y图自己创建就行。这边讲原点设在图像左上角。
halcon代码:
  1. convert_image_type (Zmap112653, ImageConverted, 'real')
  2. get_image_size (ImageConverted, Width, Height)
  3. gen_image_surface_first_order (ImageSurface, 'real', 1, 0, 0, 0, 0, Width, Height)
  4. gen_image_surface_first_order (ImageSurface1, 'real', 0, 1, 0, 0, 0, Width, Height)
  5. scale_image (ImageSurface, X, 0.019, 0)
  6. scale_image (ImageSurface1, Y, 0.019, 0)
  7. scale_image (ImageConverted, Z, 0.0016, 0)
  8. compose3 (X, Y, Z, MultiChannelImage)
  9. xyz_to_object_model_3d (X, Y, Z, ObjectModel3D)
复制代码

好了,我们就得到这个3d模型了。
下面举个应用的例子:测量两平面的夹角
20190704101403273.png
如上图,我们要测量我画的两块红框位置,它们两平面的夹角。在3D模型中也能看出,这个差不多90度的样子。
我们需要分别拟合这两块平面,然后得到其单位法向量,向量点乘得到这个角的cos,就知道夹角了。
当然拟合平面是注意去躁,这个成像上面有很多丢失点,这边在Z图上一个阈值分割就能把它们去掉,得到有效的region来拟合平面。
halcon代码:
我们得到了那个有效的红色框region(排除了其中的躁点区域)RegionIntersection
  1. reduce_domain (X, RegionIntersection, ImageReduced3)
  2. xyz_to_object_model_3d (ImageReduced3, Y, Z, ObjectModel3D1)
  3. fit_primitives_object_model_3d (ObjectModel3D1, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)
  4. get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', ParamValue)
  5. 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喽。
照着这么做,把另外一个平面搞出来,就能求两平面的夹角了。

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

原文链接:https://blog.csdn.net/Isaac320/article/details/94596144
fei99214651 发表于 2019-10-9 22:50:38 | 显示全部楼层
没看懂怎么做的,可以具体写一下?怎么获得想要的两个平面?我想计算两个平面的距离如何计算?
诗酒乐陶陶 发表于 2020-10-27 17:16:36 | 显示全部楼层
Mark一下,原图吗,Halcon直接导入你这个png文件可以获得这个z的值吗
mrhan0707 发表于 2021-1-19 09:52:30 | 显示全部楼层
请问向量之间的运算相关算子在哪里找呢,没找到
bczy 发表于 2021-1-24 18:28:19 | 显示全部楼层
赞扬大神
zhoumiao 发表于 2021-2-2 16:04:52 | 显示全部楼层
不错,受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表