该示例主要演示 alson 从本地加载、保存设备信息,并且无需启用服务端同样可调用客户端接口
ClassicClientUtil 是 ClassicDeviceController 中部分算法接口的离线版本
如何在Visual Studio、QT、CLion中使用示例工程请参考示例工程使用说明。
// std
#include <iostream>
// alson
#include <alson/classic_client.h>
int main(int argc, char** argv) {
try {
ALSON::ClassicDeviceUtil classicDeviceUtil;
// 从 controller 中创建设备信息文件并保存本地
// ALSON::ServerInfo serverInfo = ALSON::Client::discovery().front();
// ALSON::Client client;
// client.connect(serverInfo.getServerNetworkCardInfo().getIp(), serverInfo.getServerNetworkCardInfo().getBindPort());
// ALSON::ClassicDeviceController deviceController = client.createDeviceController<ALSON::ClassicDeviceController>();
// deviceController.open();
// classicDeviceUtil = deviceController.createClassicDeviceUtil();
// classicDeviceUtil.save("./cameraParameters.alson");
classicDeviceUtil = ALSON::ClassicDeviceUtil::load("./cameraParameters.alson");
ALSON::PointCloud pointCloud = ALSON::PointCloud::load("./pointCloud.pcd");
ALSON::AlsonMat textureImage = ALSON::AlsonMat::load("./textureImage.bmp");
// 点云纹理贴图
ALSON::PointCloud pointCloudWithRGB = classicDeviceUtil.addRGBForPointCloud(pointCloud, textureImage);
pointCloudWithRGB.save("./PointCloudProcess_ClassicClientUtil_PointCloudWithRGB.pcd");
// 点云纹理贴图+计算法向
// 注意:可以根据计算机硬件环境和性能需求来设置线程数,线程设置越小运行速度越慢
// 较小的半径可能导致噪声敏感的法向计算,而较大的半径可能导致法向过度平滑
double radiusSearch = 3;
int totalThreads = 6;
ALSON::PointCloud pointCloudWithRGBAndNormal = classicDeviceUtil.addRGBAndNormalForPointCloud(pointCloud, textureImage, radiusSearch, totalThreads);
pointCloudWithRGBAndNormal.save("./PointCloudProcess_ClassicClientUtil_PointCloudWithRGBAndNormal.pcd");
// 获取对齐后的纹理图像
ALSON::AlsonMat alignedTextureImage = classicDeviceUtil.alignTextureImage(textureImage);
alignedTextureImage.save("./PointCloudProcess_ClassicClientUtil_AlignedTextureImage.bmp");
// 点云转深度图并保存深度图
ALSON::AlsonMat depthImage = classicDeviceUtil.pointCloudToDepthImage(pointCloud);
depthImage.save("./PointCloudProcess_ClassicClientUtil_DepthImage.tiff");
// 深度图转点云
classicDeviceUtil.depthImageToPointCloud(depthImage);
// 点云对齐处理
ALSON::PointCloud alignedPointCloud = classicDeviceUtil.alignPointCloud(pointCloud);
alignedPointCloud.save("./PointCloudProcess_ClassicClientUtil_AlignedPointCloud.pcd");
// 查找点云中的第一个有效点。
ALSON::PointXYZ pointXYZ;
auto* pointPtr = pointCloud.ptr<ALSON::PointXYZ>();
int totalPoints = pointCloud.size();
for (int i = 0; i < totalPoints; ++i) {
auto& point = pointPtr[i];
if ((!std::isnan(point.x)) && (!std::isnan(point.y)) && (!std::isnan(point.z))) {
pointXYZ.x = point.x;
pointXYZ.y = point.y;
pointXYZ.z = point.z;
break;
}
}
ALSON::PointUV pointUV = classicDeviceUtil.pointXYZToUV(pointXYZ);
std::cout << "PointXYZ: (" << pointXYZ.x << ", " << pointXYZ.y << "," << pointXYZ.z << ")" << std::endl;
std::cout << "PointUV: (" << pointUV.u << ", " << pointUV.v << ")" << std::endl;
}
catch (ALSON::CommonException& cause) {
// API 中的所有接口都有可能抛出异常,请按照这种方式进行捕获。否则异常发生时可能会导致程序崩溃。
std::cerr << cause.getStackTrace() << std::endl;
return -1;
}
return 0;
}