该示例演示了如何调用 captureSourceImage、captureTextureImage、scan 接口。
这些接口分别用于采集原始图像(未经过立体校正)、采集纹理图像(立体校正后)、采集深度图或点云。
注意:这些接口在后续版本中会逐渐废弃掉,请谨慎使用!
// std
#include <iostream>
#include <fstream>
// alson
#include <alson/classic_client.h>
// 以 ASCII 格式将点云保存到文本文件中
void savePoints(const std::string& filename, const ALSON::AlsonMat& points) {
std::ofstream fo;
fo.open(filename);
auto* pPointsData = (float*) points.data();
for (int y = 0; y < points.rows; ++y) {
for (int x = 0; x < points.cols; ++x) {
int index = (y * points.cols + x) * 3;
fo << (pPointsData + index)[0] << " " << (pPointsData + index)[1] << " " << (pPointsData + index)[2] << std::endl;
}
}
fo.close();
}
int main(int argc, char** argv) {
try {
// 开启客户端日志,需要指定日志配置文件。
ALSON::Client::initLog("../../../LogConfig-Client.yaml");
// 检测所有服务端(即可用的设备),并获取其中第一个服务端的信息。
std::vector<ALSON::ServerInfo> serverInfoList = ALSON::Client::discovery();
if (serverInfoList.empty()) {
std::cerr << "can not find any server or device" << std::endl;
return -1;
}
ALSON::ServerInfo serverInfo = serverInfoList.front();
// 构造客户端并建立通信连接
ALSON::Client client;
client.connect(serverInfo.getServerNetworkCardInfo().getIp(), serverInfo.getServerNetworkCardInfo().getBindPort());
std::cout << "is connected: " << client.isConnected() << std::endl;
// 心跳时间通常设置为 2000ms 至 3000ms。在开发调试过程中,可适当设置大些。
// 如果心跳时间很大,那么当通信意外断开时,客户端和服务端都需要经历很长的时间才能感知到。
// 在此期间,客户端将阻塞您的进程,服务端不能被新的客户端连接。
client.setHeartbeatTimeout(3000);
// 创建设备控制器对象
ALSON::ClassicDeviceController deviceController = client.createDeviceController<ALSON::ClassicDeviceController>();
// 打开设备。注意无论设备是否关闭,在调用 DeviceController 中其他接口之前都必须调用 open 接口。
deviceController.open();
// 获取参数组管理器
ALSON::DeviceParameterManager parameterManager = client.createDeviceParameterManager();
// 获取原始图像(立体校正之前的图像),参数为true则返回最新的图像。
std::vector<ALSON::AlsonMat> sourceImages;
sourceImages = deviceController.captureSourceImage(true);
// 保存原始图像到本地
sourceImages[0].save("./Deprecated_ScanAndCapture_LeftSourceImage.bmp");
sourceImages[1].save("./Deprecated_ScanAndCapture_RightSourceImage.bmp");
// 获取纹理图像(立体校正之后的图像),参数为true则返回最新的图像。
std::vector<ALSON::AlsonMat> textureImages;
textureImages = deviceController.captureTextureImage(true);
// 保存纹理图像到本地
textureImages[0].save("./Deprecated_ScanAndCapture_LeftTextureImage.bmp");
textureImages[1].save("./Deprecated_ScanAndCapture_RightTextureImage.bmp");
// 扫描采集点云,参数为 true 返回深度图。
ALSON::AlsonMat depthImage = deviceController.scan(true);
// 保存深度图像到本地
depthImage.save("./Deprecated_ScanAndCapture_DepthImage.tiff");
// 扫描采集点云,参数为 false 返回点云。
ALSON::AlsonMat pointCloud = deviceController.scan(false);
// 保存点云到本地
savePoints("./Deprecated_ScanAndCapture_PointCloud.txt", pointCloud);
// 关闭设备。注意:close 接口一般情况下不需要调用,如果该接口被调用,下次调用 open 接口的时候就会比较耗时。
deviceController.close();
// 如果不再需要连接服务端,请及时调用 disconnect 断开连接。
client.disconnect();
}
catch (ALSON::CommonException& cause) {
// API 中的所有接口都有可能抛出异常,请按照这种方式进行捕获。否则异常发生时可能会导致程序崩溃。
std::cerr << cause.getStackTrace() << std::endl;
return -1;
}
return 0;
}