一、前言
深度图向点云图进行转换是进行3D检测项目时会遇到的问题,halcon里也有针对此问题的相关例程,下面对此例程进行分析。通过学习此例程,我们可以掌握如何将一张深度图像和一张正常二维图像转换为3D点云。
二、分析
* 初始化界面
dev_update_off ()
dev_close_window ()
*
* 读取Z图,即为深度图
read_image (Z, 'mreut_dgm_2.0.tif')
get_image_size (Z, Width, Height)
*
* 读取灰度图,将其灰度值作为属性添加到3D模型中。
read_image (AerialImage, 'mreut4_3.png')
*
* 用灰度图生成标签图像,采用的方法很简单,只做展示用。
* 自适应的阈值处理方法,将图像分为3个对象,用红蓝绿三种颜色表示。参数4表示高斯平滑的核的大小。如下图所示。
auto_threshold (AerialImage, Regions, 4)
*将分割后的区域生成标签图像。
* region_to_label根据分割区域的索引(1…n)将输入区域转换成标签图像,即,第一区域被绘成灰度值1,第二区域被绘成灰度值2。
region_to_label (Regions, LabelImage, 'byte', Width, Height)
*
* 将灰度图和标签图像合并为1个2通道复合图像。
compose2 (AerialImage, LabelImage, MultiChannelAttribImage)
*
* 在常规网格中创建包含X和Y坐标的灰度渐变图像。
GroundResolution := 2.0
* 用一阶方程来生成平面(输出图像,类型,垂直方向的参数,水平方向的参数,0阶参数,参考点的行坐标,列坐标,图像的宽高)。
* ImageSurface(r,c) = Alpha(r - Row) +Beta(c - Column) +Gamma
gen_image_surface_first_order (X, 'real', 0, GroundResolution, 0, 0, 0, Width, Height)
gen_image_surface_first_order (Y, 'real', -GroundResolution, 0, 0, 0, 0, Width, Height)
*
* 创建3D模型
* 属性名
AttribName := ['&gray','&terrain']
* 该算子将包含3D点的X、Y和Z坐标的图像三元组转换为3D对象模型。
* 从上面的程序可以看出,XY图像为与Z图同样大小的灰度渐变图像,MultiChannelAttribImage为两通道的属性图像,包含灰度图像和分割后的标签图像。
* 其中MultiChannelAttribImage的图像通道必须和AttribName的维度大小相同。
* 此时生成的为点云,下面用三角法生成三维图像。
xyz_attrib_to_object_model_3d (X, Y, Z, MultiChannelAttribImage, AttribName, ObjectModel3D)
*
* Display results
* 设置窗口1的属性,显示“地形类型”
dev_open_window (Height / 2, 0, Width / 2, Height / 2, 'black', WindowHandle1)
dev_set_part (0, 0, Height - 1, Width - 1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
dev_set_color (['red','green','blue'])
dev_set_draw ('fill')
dev_display (Regions)
disp_message (WindowHandle1, 'Terrain types', 'window', 12, 12, 'black', 'true')
* 设置窗口2的属性,显示“鸟瞰图”
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle2)
set_display_font (WindowHandle2, 16, 'mono', 'true', 'false')
dev_display (AerialImage)
disp_message (WindowHandle2, 'Aerial image', 'window', 12, 12, 'black', 'true')
* 设置窗口3的属性,显示“Z图”
dev_open_window (0, Width / 2 + 8, Width, Height, 'gray', WindowHandle3)
set_display_font (WindowHandle3, 16, 'mono', 'true', 'false')
dev_display (Z)
disp_message (WindowHandle3, 'Digital surface model', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle3, 'black', 'true')
stop ()
*
* 对对象模型进行快速的三角测量,以便更好地进行可视化。
* 该算子通过三角法将点云重建为三维模型。
prepare_object_model_3d (ObjectModel3D, 'segmentation', 'true', [], [])
* 交互式地可视化3d对象模型
* 创建3D模型的位姿(平移量,旋转量,平移旋转的顺序,旋转值的意义,视图转换,位姿)
create_pose (-620, -85, 17000, 135, 2, 10, 'Rp+T', 'gba', 'point', Pose)
Instructions := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
*显示3D模型
visualize_object_model_3d (WindowHandle3, ObjectModel3D, [], Pose, ['color_attrib','color_attrib_start','color_attrib_end'], ['&gray',0,255], ['Created 3D model','Attribute used for visualization: \'&gray\''], [], Instructions, PoseOut)
visualize_object_model_3d (WindowHandle3, ObjectModel3D, [], PoseOut, ['color_attrib','lut'], ['&terrain','color1'], ['Created 3D model','Attribute used for visualization: \'&terrain\''], [], Instructions, PoseOut)
disp_end_of_program_message (WindowHandle3, 'black', 'true')
总结
通过此例程,可以初步了解3D转换的具体步骤。
- 根据灰度图,创建多通道的复合图像。
- 创建灰度渐变图像,X和Y
- 使用算子xyz_attrib_to_object_model_3d生成点云图。
- 三角化网格 prepare_object_model_3d (ObjectModel3D, ‘segmentation’, ‘true’, [], [])。
- 显示3D模型visualize_object_model_3d。
总结下,虽然读完了整个例程,但还是有几个疑问。 - 为什么一定要要创建灰度渐变图像,灰度值的朝向有什么意义。
- 三角化方法的原理还不太清楚
再更:1,问题一搞清楚了,灰度渐变图像代表图像在X,Y平面的尺度。
2,三角化是三维重建的经典算法,根据平面内三位点的拓扑连接关系获得一个三角网格曲面模型。