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

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

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

3D点云插值 python 3d点云技术_3D相机

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

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

3D点云插值 python 3d点云技术_3D点云插值 python_02

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点云插值 python 3d点云技术_拟合平面_03

如上图,我们要测量我画的两块红框位置,它们两平面的夹角。在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喽。

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

 

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