asp网站建设技术方案,广东广州自己建网站公司,足球网页制作模板,怎样自创广告网站Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了“如何读取”的问题。一般的3D工业相机储存数据的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。 txt格式 读取txt文件生成3D模型一般需要分析txt文件… Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用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 (IsEOF0) #将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模型显示结果如下注意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模型其中读取的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模型并进行显示。
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 (IsEOF0)tuple_split (OutLine, ,, Substrings)tuple_number (Substrings, Number)X :[X,Number[0]]Y :[Y,Number[1]]Z :[Z,Number[2]] #读取XYZfread_line (FileHandle, OutLine, IsEOF)
endwhile
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3D) #生成3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #显示结果
结果如下ply格式
ply是Halcon可识别的3D模型储存格式可以直接打开。
read_object_model_3d (data.ply, m, [], [], ObjectModel3D, Status)
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut)
结果如下