Halcon 读取3D相机点云数据

Everything I Need 《海王》

 

 

 

机器视觉 Halcon 3D联合开发教程

 

 

 

最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了“如何读取”的问题。一般的3D工业相机储存数据的格式有txt格式、tif格式、ply格式、ptx格式、bin格式、obj格式等。

 

txt格式

读取.txt文件生成3D模型一般需要分析.txt文件的储存格式,下图是我使用的工业相机储存的部分txt数据:

Halcon 读取3D相机点云数据_第1张图片

 

经过分析,前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模型

 

代码中的IsEOF参数为循环的判断变量,当文件未到末尾时,IsEOF为0;当文件到达末尾时,IsEOF为1。
3D模型显示结果如下:

Halcon 读取3D相机点云数据_第2张图片

 

注意:1、通过元组生成3D模型时,采用gen_object_model_3d_from_points算子;2、一些3D相机的txt文件的数据之间采用@相连,此时应使用@对字符串进行分割。

 

tif格式

tif图片格式是工业相机损失较小的图片格式。一般3D相机会将不同的数据保存在不同的tif图片中。下图是我使用的工业相机储存的tif文件:

Halcon 读取3D相机点云数据_第3张图片

 

其中,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模型

Halcon 读取3D相机点云数据_第4张图片

 

其中,读取的PointcloudX PointcloudY PointcloudZ等图片也可以先做Blob分析之后再合成3D模型。此时,若PointcloudX PointcloudY PointcloudZ的大小不一致,代码:


xyz_to_object_model_3d (PointcloudX, PointcloudY, PointcloudZ, ObjectModel3D) 

生成的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三通道

同样,可以对其中任意一张图像做Blob分析等操作,也可采用:


xyz_to_object_model_3d (X, Y, Z, ObjectModel3D) 
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) 

生成3D模型并进行显示。

ply格式

ptx格式

obj格式

bin格式

以上格式等有空了......

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Halcon编程从入门到精通,点云)