Halcon|讀取3D相機點雲數據

原文鏈接:https://blog.csdn.net/qq_41738631/article/details/86530390

最近發現很多小夥伴在使用Halcon處理3D工業相機掃描結果的時候遇到了“如何讀取”的問題。一般的3D工業相機儲存數據的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。
txt格式
讀取txt文件生成3D模型一般需要分析txt文件的儲存格式,下圖是我使用的工業相機儲存的部分txt數據:

經過分析,前3列爲X、Y、Z座標,第4列到第6列爲每一點的法線座標nX、nY、nZ,第7列到第9列爲灰度值。因此我們採用以下代碼重構3D模型:
open_file ('data.txt', 'input', XYZ) #打開文件
X :=[]
Y :=[]
Z :=[]
nX :=[]
nY :=[]
nZ :=[]
Gray :=[]
fread_line (XYZ, OutLine, IsEOF) #讀文件中一行的字符串
tuple_split (OutLine, ' ', Substrings) #根據空格分割一行的字符串
while (IsEOF==0) #將X Y Z nX nY nZ Gray分別存儲在不同的元組中
    X :=[X,Substrings[0]]
    Y :=[Y,Substrings[1]]
    Z :=[Z,Substrings[2]]
    nX :=[nX,Substrings[3]]
    nY :=[nY,Substrings[4]]
    nZ :=[nY,Substrings[5]]
    Gray :=[Gray,Substrings[6]]
    fread_line (XYZ, OutLine, IsEOF)
    tuple_split (OutLine, ' ', Substrings)
endwhile
close_file (XYZ) #關閉文件
tuple_number (X, NumberX) 
tuple_number (Y, NumberY) 
tuple_number (Z, NumberZ)  #將字符串轉化爲數字
gen_object_model_3d_from_points (NumberX, NumberY, NumberZ, ObjectModel3D) #構建3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示3D模型
123456789101112131415161718192021222324252627
代碼中的IsEOF參數爲循環的判斷變量,當文件未到末尾時,IsEOF爲0;當文件到達末尾時,IsEOF爲1。
3D模型顯示結果如下:

注意:1、通過元組生成3D模型時,採用gen_object_model_3d_from_points算子;2、一些3D相機的txt文件的數據之間採用@相連,此時應使用@對字符串進行分割。
tif格式
tif圖片格式是工業相機損失較小的圖片格式。一般3D相機會將不同的數據保存在不同的tif圖片中。下圖是我使用的工業相機儲存的tif文件:

其中,PointCloud_X PointCloud_Y PointCloud_Z爲將點雲的XYZ座標作爲灰度值生成的圖片,NormalMap_X NormalMap_Y NormalMap_Z爲將點雲的XYZ法線座標作爲灰度值生成的圖片,Texture爲一般的灰度圖片。可使用以下代碼重構3D模型:
read_image (PointcloudX, '0-400_IMG_PointCloud_X.tif') 
read_image (PointcloudY, '0-400_IMG_PointCloud_Y.tif')
read_image (PointcloudZ, '0-400_IMG_PointCloud_Z.tif') #分別讀取XYZ座標
xyz_to_object_model_3d (PointcloudX, PointcloudY, PointcloudZ, ObjectModel3D) #生成3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示3D模型
12345

其中,讀取的PointcloudX PointcloudY PointcloudZ等圖片也可以先做Blob分析之後再合成3D模型。此時,若PointcloudX PointcloudY PointcloudZ的大小不一致,代碼:
xyz_to_object_model_3d (PointcloudX, PointcloudY, PointcloudZ, ObjectModel3D) 
1
生成的3D模型將以PointcloudX爲準。
注意:與算子gen_object_model_3d_from_points作對比,當通過圖片生成3D模型時,採用xyz_to_object_model_3d算子。
Halcon直接讀取
我購買的工業相機可以直接採用以下代碼實時抓取數據,可以作爲其他工業相機實施抓取數據的參考。
open_framegrabber ('PhoXi', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', '2018-08-034-LC3', -1, -1, AcqHandle) #打開相機
get_framegrabber_param (AcqHandle, 'revision', Revision) #得到相機參數
GrabDataItems:=['PointCloud', 'Texture', 'NormalMap', 'ConfidenceMap']
set_framegrabber_param (AcqHandle, 'grab_data_items', GrabDataItems) #設置相機參數
grab_data (ImageData, Region, Contours, AcqHandle, Data) #抓取數據
select_obj (ImageData, XYZ, 1) #選擇3維數據XYZ(點雲座標)
select_obj (ImageData, Texture, 2) #選擇1維度數據Texture
select_obj (ImageData, Normals, 3) #選擇3維數據Normals(法線)
select_obj (ImageData, Confidence, 4) #選擇1維數據Confidence
decompose3 (XYZ, XImage, YImage, ZImage) #將XYZ分解爲X Y Z三通道
decompose3(Normals, nX, nY, nZ)  #將Normals分解爲nX nY nZ三通道
1234567891011
同樣,可以對其中任意一張圖像做Blob分析等操作,也可採用:
xyz_to_object_model_3d (X, Y, Z, ObjectModel3D) 
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) 
12
生成3D模型並進行顯示。
CSV格式
CSV格式(Comma-Separated Values)直譯爲逗號分隔值(也稱字符分隔值,因爲分隔字符也可以不是逗號),是一種以逗號作爲分隔符,對數據進行直接記錄的文件。
讀取csv文件生成3D模型一般需要分析csv文件的儲存格式。我們先創建一個csv文件。如下圖所示,直接創建txt文件,每一行保存一個點雲座標,不同座標之間採用“,”作爲分隔符,另存爲csv文件即可。

open_file ('data.csv', 'input', FileHandle) #打開文件
X :=[]
Y :=[]
Z :=[]
fread_line (FileHandle, OutLine, IsEOF)
while (IsEOF==0)
    tuple_split (OutLine, ',', Substrings)
    tuple_number (Substrings, Number)
    X :=[X,Number[0]]
    Y :=[Y,Number[1]]
    Z :=[Z,Number[2]] #讀取XYZ
    fread_line (FileHandle, OutLine, IsEOF)
endwhile
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3D) #生成3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示結果
123456789101112131415
結果如下:

ply格式
ply是Halcon可識別的3D模型儲存格式,可以直接打開。
read_object_model_3d ('data.ply', 'm', [], [], ObjectModel3D, Status)
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut)
12
結果如下:

ptx格式
obj格式
bin格式
以上格式等有空了繼續更吧!
祝大家學習愉快!
嘻嘻~~
--------------------- 
版權聲明:本文爲CSDN博主「志遠呀」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41738631/article/details/86530390

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章