跳到主要内容

捕获

介绍

本教程介绍了如何使用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进行相机的连接、配置、捕获和保存文件。