3D相机定位抓取介绍

955 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路.

本文从实际的案例触发介绍3D定位抓取的介绍

1.目前市面上的3D相机大体上分为一体式和分体式;

一体式的3D相机是吧相机和镜头组装在了一起,相机的事业和检测精度已经固定,想要换视野就要换相机。代表的有国产的没卡曼德。

分体式的3D相机则是可以随意的各部分华北镜头来适配合适的视野,使用更加便捷,代表的有Sick的ranger3相机。

本次介绍以Sick的分体式相机为例

上面的是普通的3D相机的安装方式,下面的是分体的安装方式。 image.png

image.png

这张图可能更加的直观

image.png

指导了相机的构成之后,我们需要取图; 如下是3D相机取出的图像:

1.png

2.png

我们通过halcon进行模板的创建

dev_close_window()
ScanningRuler_ReadBuffer (ImageCirX, ImageCirY, ImageCirZ, Intensity,768,512,'6/Image5/2T13C.dat')
* gen_rectangle1 (Rectangle, 140, 200, 290, 430)
* gen_rectangle1 (Rectangle1, 220, 140, 510, 360)
* create_shape_model (ImageCirZ, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*ScanningRuler_ReadBuffer (ImageCirX, ImageCirY, ImageCirZ, Intensity,768,512,'C:/Users/92576/Desktop/2.dat')
 get_image_size (ImageCirZ, Width, Height)
 dev_open_window (0, 0, Width, Height*1, 'black', WindowHandle)
dev_display (ImageCirZ)
* median_image (ImageCirX, ImageMedian, 'circle', 1, 'mirrored')
* gen_rectangle1 (Region, 106, 311, 315, 521)

draw_region (Region, WindowHandle)
 reduce_domain(ImageCirZ, Region, ImageCirZ)
threshold (ImageCirZ, Region1, 344, 364)
connection (Region1, Connected1)
reduce_domain (ImageCirY, Connected1, ImageCirY)
reduce_domain (ImageCirX, Connected1, ImageCirX)
reduce_domain (ImageCirZ, Connected1, ImageCirZ)
*将3D点从图像转换为3D对象模型
xyz_to_object_model_3d (ImageCirX, ImageCirY, ImageCirZ, ObjectModel3D1)

*示例一个3D对象模型
sample_object_model_3d (ObjectModel3D1, 'accurate', 0.001, [], [], ObjectModel3DAffineTrans1Sample)

*计算三维物体模型的三维曲面法线
surface_normals_object_model_3d(ObjectModel3DAffineTrans1Sample,'mls', [], [], ObjectModel3DAffineTrans1N)

Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
Message := 'Surface model  Right'

*交互式显示三维对象模型
visualize_object_model_3d (WindowHandle, ObjectModel3D1, [], [], [], [], Message, [], Instructions, PoseOut)

*创建执行基于表面的匹配所需的数据结构
create_surface_model (ObjectModel3DAffineTrans1N, 0.02, [], [], SFM)

*将表面模型写入文件
write_surface_model (SFM, 'C:/Users/92576/Desktop/14.sfm')

*将3D对象模型写入文件
write_object_model_3d (ObjectModel3D1, 'om3', 'Desktop/14.om3', [], [])

这个因为C#的源代码太多了,我这里就发了halcon的.

image.png 太多了.

我放片段了,大家可以参考下.