捕获
介绍
本教程介绍了如何使用SizectorS_SDK捕获点云和Tiff图像
对于Linux,请查看教程
如果您更喜欢观看视频教程,我们的网络研讨 会 Making 3D captures easy涵盖的内容与捕获教程相同。
先决条件
- 安装SizectorS软件。
初始化
调用SizectorS_SDK中的任何API都需要初始化一个Sensor实例,并在程序运行时使其保持活动状态。
IMPSizectorS *Sensor = MPSizectorS_Factory::GetInstance(MPSizectorS_LogMediaType_CallBack);
设置当前程序的所有分类的本地化信息为英语语言环境、美国地区、UTF-8 编码方式。
setlocale(LC_ALL, "");
连接
查看相机
您还可以列出所有连接到计算机的 相机,并通过以下方式查看它们的序列号和相关信息
int DeviceCount = Sensor->GetDeviceCount();
for(int i = 0; i < DeviceCount; i++)
{
DeviceInfo = Sensor->GetDeviceInfo(i);
printf("Device #%d :\r\n", i);
wprintf(L" -Name : %s\r\n", DeviceInfo.DeviceName);
wprintf(L" -Serial Number : %s\r\n", DeviceInfo.DeviceSerialNumber);
printf(" -Is Activated : %s\r\n", DeviceInfo.IsActivated ? "True" : "False");
printf(" -HW Version : %.2f\r\n", (float)DeviceInfo.HWVersion);
printf(" -FW Version : %.2f\r\n", (float)DeviceInfo.FWVersion);
printf(" -Minimum SDK Version : %.2f\r\n", DeviceInfo.MinimumSDKVersion);
printf(" -Sensor Width : %d\r\n", DeviceInfo.SensorWidth);
printf(" -Sensor Height : %d\r\n", DeviceInfo.SensorHeight);
printf(" -Sensor Resolution : %d\r\n", DeviceInfo.SensorResolution);
printf(" -Binning Possibility : %s\r\n", DeviceInfo.BinningPossibility ? "True" : "False");
printf(" -Sensor Binning Width : %d\r\n", DeviceInfo.SensorBinningWidth);
printf(" -Sensor Binning Height : %d\r\n", DeviceInfo.SensorBinningHeight);
printf(" -Sensor Binning Resolution : %d\r\n", DeviceInfo.SensorBinningResolution);
printf(" -X Max : %.2f\r\n", DeviceInfo.XMax);
printf(" -Y Max : %.2f\r\n", DeviceInfo.YMax);
printf(" -Z Max : %.2f\r\n", DeviceInfo.ZMax);
printf(" -Device Interface : %s\r\n", (DeviceInfo.InterfaceType == MPSizectorS_InterfaceType_U2) ? "USB2.0" : ((DeviceInfo.InterfaceType == MPSizectorS_InterfaceType_U3) ? "USB3.0" : "EtherNet"));
}
设置回调函数
设置日志回调函数、设置设备状态改变回调函数、设置数据回调函数
if (SHOW_LOG) Sensor->SetLogCallBack(LogCallBack);
Sensor->SetDeviceStateChangeCallBack(&DeviceStateChangeCallBack);
Sensor->SetDataCallBack(DataCallBack);
选定相机
当多台相机连接到同一台计算机时,如果需要在代码中使用某台特定的相机,可以通过该相机的序列号来实现。
Sensor->Open(Sensor->GetDeviceInfo(choice));
采集设置应当如下所示进行初始 化,但您可以自由更改处理设置。
Sensor->SetTriggerSource(MPSizectorS_TriggerSourceType_SoftTriggerOnly);
Sensor->SetHoldState(false);
Sensor->SetAutoReconnect(true);
Sensor->SetExposureIntensity2D(10);
Sensor->SetExposureIntensity3D_1st(5);
Sensor->SetExposureIntensity3D_2nd(10);
Sensor->SetExposureIntensity3D_3rd(20);
Sensor->SetUserGain(0);
配置
与其它所有相机一样,SizectorS相机也具备可设置的参数。这些参数可以通过手动设置。
手动设置
Another option is to configure settings manually. For more information about what each settings does, please see 相机设置.
设置像素合并
Sensor->SetBinningState(false); //关闭像素合并
Sensor->SetBinningState(true); //开启像素合并
设置捕获模式
Sensor->SetWorkingMode(MPSizectorS_WorkingModeType_3D_Fast); /// 快速3D模式
Sensor->SetWorkingMode(MPSizectorS_WorkingModeType_2D_White); /// 全白照明2D模式
Sensor->SetDataOutMode(MPSizectorS_DataOutModeType); //浮点数点云3D数据模式。X,Y,Z分别通过32位浮点数表示
Sensor->SetTriggerSource(MPSizectorS_TriggerSourceType_SoftTriggerOnly); /// 仅接收软件触发。
Sensor->SetTriggerSource(MPSizectorS_TriggerSourceType_KeepRunning); /// 连续拍摄, 当一次拍摄完成后自动开始下一次拍摄。
设置为2D工作模式时,不需要SetDataOutMode
加载
SizectorS_SDK可以将当前设置存储到.mpur文件中。这些可以在API中读取和应用。您可能会发现在首选编辑器中修改这些(人类可读的)mpur文件中的设置会更容易。
char* chrArrSN = "Setting";
const char* cfgSuffix = ".mpur";
std::string fileName = std::string(chrArrSN) + cfgSuffix;
auto retRead = Sensor->ReadAllConfigFromFile((char*)fileName.c_str());
printf("\r\n Device [%s] ReadAllConfigure result is %s \r\n", chrArrSN, retRead ? "SUCCESS" : "FAILED");
保存
您还可以将设置保存到.mpur文件。
char* chrArrSN = "Setting";
const char* cfgSuffix = ".mpur";
std::string fileName = std::string(chrArrSN) + cfgSuffix;
auto retWrite = Sensor->WriteAllConfigToFile((char*)fileName.c_str());
printf("\r\n WriteAllConfigToFile result is %s \r\n", retWrite ? "SUCCESS" : "FAILED");
printf("\r\n Configurations is saved to [%s%s] \r\n\r\n", chrArrSN, ".mpur");
设置默认配置
您还可以设置默认模式,保存在FlashROM中,在设备上电时将被调用
auto retSave = Sensor->SaveSettingsAsDefault();
printf("\r\n SaveSettingsAsDefault result is %s \r\n\r\n", retSave ? "SUCCESS" : "FAILED");;
捕获
现在我们可以捕获2D或者3D图像了。
MPSizectorS_DataFormatType DataFormat; 包含捕获信息的数据格式。
MPSizectorS_DataFrameUndefinedStruct Data; 包含了点云和彩色图像(存储在计算设备内存中)以及捕获和相机的信息。
捕获图像
如果我们想捕获图像,则可以通过API来实现。
Sensor->Snap(true, &DataFormat, &Data, 100);
加载
保存后,可以从 mpdat 文件加载图像帧。
const auto dataFile = std::string(ZIVID_SAMPLE_DATA_DIR) + "/SizectorS.mpdat";
std::cout << "Reading MPDAT frame from file: " << dataFile << std::endl;
MPSizectorS_Utils::Load(&Data, dataFile);
本教程稍后会说明如何保存到mpdat文件。
保存
我们现在可以保存结果了。
const auto dataFile = "Frame.mpdat";
MPSizectorS_Utils::Save(Data, dataFile);
您可以在 MPSizectorS_ControlCenter 中打开并查看 Frame.mpdat 文件。
导出
API检测要使用的格式。请参阅点云了解支持的格式列表。例如,我们可以将点云导出为.ply或.pcd格式。
const auto dataFile = "PointCloud.ply";
MPSizectorS_Process_SavePLY(Data, dataFile);
const auto dataFile = "PointCloud.pcd";
MPSizectorS_Process_SavePCD(Data, dataFile);
保存Tiff图像
我们可以从捕获中获得Tiff类型的图像并保存。
const auto dataFile = "PointCloud.tiff";
MPSizectorS_Process_SaveTIFF(Data, true, dataFile, true);
结论
本教程展示了如何使用MPSizectorS SDK进行相机的连接、配置、捕获和保存文件。