一、前言
深度圖向點云圖進行轉換是進行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,三角化是三維重建的經典算法,根據平面內三位點的拓撲連接關系獲得一個三角網格曲面模型。