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 (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模型显示结果如下:

注意: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 (IsEOF==0)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)
结果如下:

Halcon|读取3D相机点云数据相关推荐

  1. 多帧点云数据拼接合并_自动驾驶:Lidar 3D传感器点云数据和2D图像数据的融合标注...

    自动驾驶汽车的发展已经见证了硬件传感器记录感官数据的容量和准确度的发展.传感器的数量增加了,新一代传感器正在记录更高的分辨率和更准确的测量结果. 在本文中,我们将探讨传感器融合如何在涉及环环相扣的数据 ...

  2. 解析las文件_Java读取解析激光点云数据(Las/Laz)

    激光点云数据格式Las/Laz目前网上流行的读取库为c++版本的LibLas,java版本的读取解析工具目前还没有找到,但是还好有大神已经为java程序员打了LibLas的JNI版本(https:// ...

  3. Halcon三维模型预处理(2):点云数据去噪+连通域分割

    点云数据是庞大的点集合,点云模型去噪就是删除多余的点集. 点云去噪的方式有两种: 1.通过在x,y,z的方向去除固定范围的点云数据,提取想要的点云ROI 2.通过选取连通域根据点云特征,筛选点云. 一 ...

  4. 知微传感Dkam系列3D相机SDK例程篇:点云滤波

    3D相机点云滤波 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行业发展及交流 ...

  5. 3D相机的数据处理方式

    在上一篇中,我们介绍了什么是3D相机.但是对于初次接触3D相机的同学,可能首先面临的问题是如何处理3D相机得到的数据.3D相机的数据分为两种方式:三维点云数据方式,二维数据方式.其中,三维数据保存的格 ...

  6. 景联文科技:争创中国自动驾驶点云数据标注第一服务商

    点云数据是由激光雷达等3D扫描设备获取空间若干点的信息,一般包括XYZ位置信息.RGB颜色信息等,是指在一个三维坐标系统中的一组向量的集合,即空间中代表3D形状或对象的数据点集合. 3D点云标注是自动 ...

  7. 基于FME实现点云数据的过滤去噪和生成表面模型

    作者:LLT 近年来随着三维激光扫描技术的不断发展与更新,点云数据也越来越多地应用于各个领域.FME作为一款数据转换和变换软件,在点云处理方面也有许多独到之处.下面就给大家分享一些点云数据的处理技巧. ...

  8. 点云数据Halcon生成3D,计算平面度,且可以计算特定区域平面度(纯C#)

    一.平面度算法思路 通过离散点拟合平面,也就是说,要找到一个平面z=ax+by+c,使这平面到各个点的"距离"最近,根据最小二乘法,,也就是说我们要求得一组a,b,c,使得对于已有 ...

  9. 训练自己的点云数据进行3D目标检测

    目录 前言 一.准备工作 1.pcdet整体架构 2.pcdet数据流 3.kitti_dataset.py理解 二.自定义数据集类的编写(参考kitti_dataset.py进行修改) 三.修改ev ...

最新文章

  1. python使用matplotlib可视化阶梯图、使用step函数可视化阶梯图、可视化时间序列数据的波动周期和规律
  2. MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别?
  3. 城市需要建什么样的能源数据中心?
  4. XSuperTooltip - Office 2007 Super Tooltip class
  5. 过滤器匹配符包含单词_Hamcrest包含匹配器
  6. php教程哪个软件好,写php用哪款软件好?解决方法
  7. mysql分组随机取数据_MySql分组后随机获取每组一条数据的操作
  8. c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...
  9. Win10之打印机扫描为pdf格式
  10. nsga2 matlab,NSGA2算法特征选择MATLAB实现(多目标)
  11. Scrapy抓取起点中文网排行榜
  12. ASIC设计流程简介
  13. 杭州女程序员自述:疫情之下被迫离职,仲裁说理被公司索赔百万
  14. token的颁发、保存与携带
  15. lib60870-IEC 60870-5-101 / 104 C源代码库用户指南-版本2.3.0--第一部分
  16. MySQL数据查询之多表查询
  17. 交换机配置SNMP团体字
  18. FTP暴力破解-Hydra
  19. android应用加载过程中的loading动画
  20. ssh 密钥生成及免密错误记录

热门文章

  1. cpu卡操作协议iso14443协议
  2. TreeView 实现单选与多选!
  3. Ajax — 大事件项目(第三天)
  4. python-json
  5. 用公众号获取 任意公众号文章列表 软件还是免费
  6. php中rsa加密及解密和签名及验签
  7. 注意扩展方法的返回值类型
  8. myeclipse 8.5最新注册码(过期时间到2016年)
  9. java调用oracle 存储过程 以及游标使用
  10. 总结了下自己的几个典型行为