1.安装pcl库
因为线激光获取的是3D点云信息,所以安装pcl(一个大型的开源点云处理库)库就尤为关键
我不再赘述,直接引入大佬的博客(注意不要安装pcl1.12的,到时候可能会有内存问题导致无法运行)
大佬的链接:推荐跟大佬一样创建一个项目属性表,这样会方便很多Visual Studio+PCL环境配置及各步骤意义简介_pcl环境变量_糊烟乱雨的博客-CSDN博客
2.使用线激光
先把线激光厂家给的文件进行链接,头文件放到所写的cpp文件目录下即可,链接的教程网上有很多,不再赘述。
运行这个官方程序
或者这个应用时
会显示出这个界面
使用线激光扫描一下之后,在信息显示那里会显示当前x,y的间距,这个间距可以通过改变线激光的测量范围来进行改变,。
在代码中使用这个间距来获得扫描出完整的点云数据。
我使用的是示例中的非阻塞有限循环获取数据
//相机 IP 地址
SR7IF_ETHERNET_CONFIG SREthernetConFig;
SREthernetConFig.abyIpAddress[0] = 192;
SREthernetConFig.abyIpAddress[1] = 168;
SREthernetConFig.abyIpAddress[2] = 6;
SREthernetConFig.abyIpAddress[3] = 12;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud <pcl::PointXYZ>);
float a = 1.44, b = 0.0;
//设备 ID
const int DEVICE_ID = 0;
//连接相机
SR7IF_EthernetOpen(DEVICE_ID, &SREthernetConFig);
//开始批处理---------IO 触发时调用函数 SR7IF_StartIOTriggerMeasure(DEVICE_ID, 20000)
SR7IF_StartMeasure(DEVICE_ID, 20000);
//等待数据接收
SR7IF_Data DataObject = NULL;
SR7IF_ReceiveData(0, DataObject);
//获取批处理行数
int BatchPoint = SR7IF_ProfilePointCount(DEVICE_ID, DataObject);
//获取轮廓宽度
int m_DataWidth = SR7IF_ProfileDataWidth(DEVICE_ID, DataObject);
cout << "轮廓宽度为" << m_DataWidth << endl;
//获取高度数据
//定义高度数据缓存
int* HeightData = new int[BatchPoint * m_DataWidth];
cout << "高度数据为" << BatchPoint * m_DataWidth << endl;
SR7IF_GetProfileData(DEVICE_ID, DataObject, HeightData);
//获取灰度数据
//定义灰度数据缓存
unsigned char* grayData = new unsigned char[BatchPoint * m_DataWidth];
SR7IF_GetIntensityData(DEVICE_ID, DataObject, grayData);
//保存点云数据
for (int i = 0; i < BatchPoint; ++i) {
pcl::PointXYZ point;
point.x = a;
point.y = b;
point.z = HeightData[i * 1200 + j] * 0.00001;
cloud->push_back(point);
a += 0.36;
}
b += 0.1;
a = 1.44;
}
//获取编码器数据
//定义编码器数据缓存
// int* Encoder = new unsigned int[BatchPoint];
//SR7IF_GetEncoder(DEVICE_ID, DataObject, Encoder);
/******用户代码******/
cout << "点云数据点数为" << cloud->size() << endl;
//创建一个CloudViewer对象
pcl::visualization::CloudViewer viewer("Cloud Viewer");
// 显示点云数据
viewer.showCloud(cloud);
// 等待用户关闭查看器窗口
while (!viewer.wasStopped())
{
// 在此处添加其他代码
}
/********************/
//内存释放
delete[] HeightData;
delete[] grayData;
//delete[] Encoder;
//停止批处理
SR7IF_StopMeasure(DEVICE_ID);
//关闭设备
SR7IF_CommClose(DEVICE_ID);
将扫描的点云数据保存为一个对象并且显示出来,a,b分别是x,y轴的间距,z轴的数值就是代码中获取的数组中元素数据,z轴坐标要转化一下,不然数值非常大。这些可以通过使用软件将点云数据保存为一个随便点云格式文件(ply,pcd等等),然后通过代码查看点云中每一个点的坐标信息得到 ,分析一下就可以得到这个结论:x轴都是起始位置在一个固定点,然后累加的,y轴则是经过你设置的线激光一列点数(3000,5000等等)之后再累加。
这样就可以正常的保存并且显示线激光获取的点云数据了。