图漾相机——C++之Sample_V1之3.X.X版本官网示例解析(停止维护)
发布时间:2026/10/16 5:39:12 锦皓数字建站
`)
文章目录前言示例程序说明1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoadConfig3.5 SimpleView_FetchFrame3.6 SimpleView_Callback3.7 SimpleView_SGBM3.7.1 disparityNum和disparityOffset参数调整技巧3.7.2 matchWinW和matchWinH参数调整技巧3.7.3 P1和P2参数调整技巧3.7.4 uniqueFator和uniqueAbsDiff参数调整技巧3.8 SimpleView_Point3D3.8.1 如何获取相机内参3.8.2 相机内参描述3.8.3 fetch_config.xml文件描述3.8.4 D2C对齐方式说明3.8.5 C2D对齐方式说明3.9 SimpleView_SGBM_XYZ483.10 SimpleView_TriggerMode13.10.1 软触模式3.10.2 硬触发模式3.11 SimpleView_TriggerMode_M2S13.12 SimpleView_TriggerMode_M3S14.常见问题FAQ4.1 编译完成后无SimpleView_Point3D和SimpleView_Registration例子4.2 选择Opencv安装路径后仍编译不成功4.3 在Ubuntu16系统编译报错4.4 Linux环境编译官网SDK无SimpleView_Point3D和SimpleView_Point3D_XYZ48例子5.参考资料前言请参考图漾官网的在线文档C示例程序下载示例程序说明1.ListDevices该示例程序用于枚举连接到上位机上的所有深度相机。2.DeviceStorage该示例程序用于读写相机的 Custom Block Storage 组件区域 (64KB) 和 ISP Block Storage 组件区域 (64KB)。3.DumpAllFeatures该示例程序用于枚举深度相机支持的各个组件和属性以及各个属性支持的读写等信息。4.ForceDeviceIP该示例程序用于强制设置网络深度相机的 IP 地址。5.LoopDetect该示例程序用于处理因环境不稳定等因素造成的数据连接异常。6.NetStatistic该示例程序用于统计网络深度相机的丢包率。7.SimpleView_FetchFrame该示例程序用于深度相机工作在连续采集模式下连续采集图像并输出图像数据。8.SimpleView_Callback该示例程序用于深度相机工作在连续采集模式下连续采集图像在独立的数据处理线程防止堵塞图像数据获取中进行 OpenCV 渲染并输出图像数据。9.SimpleView_FetchHisto该示例程序用于获取图像亮度数据直方图。10.SimpleView_MultiDevice该示例程序用于多台深度相机同时连续采集图像并输出图像数据。11.SimpleView_Point3D该示例程序用于获取 3D 点云数据。12.SimpleView_Registration该示例程序用于获取深度相机的内参、外参、深度图和彩色图并将深度图和彩色图对齐。13.SimpleView_TriggerDelay该示例程序用于设置硬件触发延时时间深度相机在接收到硬件触发信号并等待特定延时之后采集图像。14.SimpleView_TriggerMode0该示例程序用于设置深度相机工作在模式 0相机连续采集图像并以最高帧率输出图像数据。15.SimpleView_TriggerMode1该示例程序用于设置深度相机工作在模式 1相机收到软触发指令或硬触发信号后采集图像并输出图像数据。16.SimpleView_TriggerMode_M2S1该示例程序用于设置主设备相机工作在模式 2多台从设备相机工作在模式 1以实现多台深度相机级联触发同时采集图像。主设备收到上位机发送的软件触发信号后通过硬件 TRIG_OUT 接口输出触发信号同时触发自身采集并输出深度图从设备收到主设备的硬件触发信号后采集并输出深度图。17.SimpleView_TriggerMode_M3S1该示例程序用于设置主设备相机工作在模式 3多台从设备相机工作在模式 1以实现多台深度相机按照设置的帧率级联触发同时采集图像。主设备按照设置的帧率通过硬件 TRIG_OUT 接口输出触发信号同时触发自身采集并输出深度图从设备收到主设备的硬件触发信号后采集并输出深度图。18.SimpleView_SaveLoadConfig该示例程序用于将本地的 JSON 文件写入 Storage 组件并从 Storage 组件中加载已写入的 JSON 文件。此外程序还支持将 JSON 文件导出到本地以便检查和配置参数。19.SimpleView_XYZ48该示例程序用于解析并显示 XYZ 格式的深度图。20.SimpleView_Point3D_XYZ48该示例程序用于获取深度为 xyz48 格式下的 3D 点云数据21.SimpleView_HDR:该示例程序用于展示如何使用HDR功能进行相机采图。22.SimpleView_OpenWithIP该示例程序用于使用IP打开相机 。23.SimpleView_PixelsRegistration该示例程序展示深度图像中心在彩色图像上的位置。24.SimpleView_SGBM该示例程序展示了如何配置SGBM参数并实现采图的方法。25.SimpleView_StreamAsync该示例程序展示软触发下如何配置相机数据流异步并进行采集图像。26.SimpleView_StreamAsync1该示例程序用于展示相机在自由采集模式下如何配置相机数据流异步并进行采集图像。1.SDK支持的平台类型1.1 Windows 平台Windows SDK 支持 X8632位和 X6464位硬件平台并提供支持 Window7 及以上版本操作系统的驱动文件。1.2 Linux平台Linux SDK 支持 AArch64、ARMv7hf、RaspberryPi、i686 和 x86-64 硬件平台并为开发者编译程序提供相应平台的库文件。2.SDK基本知识2.1 SDK目录结构Include:头文件TYApi.h:设备操作的常规接口TYCoordinateMapper.h:坐标系变换相关接口TYImageProc.h:畸变校正/滤波接口TyIsp.h:RAW RGB数据的软ISP处理代码Lib :各类平台下的动态库文件及windows平台下sample程序sample:SDK中示例代码通过CMake跨平台自动构建项目详细功能参见在线文档https://doc.percipio.xyz/cam/latest/getstarted/compile.html2.2 设备组件简介TY_DEVICE_COMPONENT_LIST(TYApi.h)TY_COMPONENT_DEVICE:用于设置相机本身属性例如触发属性网口相机的IP参数等TY_COMPONENT_DEPTH_CAM:用于设置深度相机属性例如是能深度数据通道设置深度数据分辨率等TY_COMPONENT_IR_CAM_LEFT:用于设置左IR相机属性TY_COMPONENT_IR_CAM_RIGHT:用于设置右IR相机属性TY_COMPONENT_LASER:用于设置激光器属性例如激光器强度设置激光器自动控制使能等TY_COMPONENT_RGB_CAM:用于设置RGB相机属性例如使能RGB通道数据设置RGB分辨率曝光时间增益等2.3 设备组件属性TY_FEATURE_ID_LIST1.相机的所有组件所有属性2.并不是相机会支持这里面所有的属性可通过API接口TYHasFeature的返回值判断是否支持。3.属性的设置/获取可以通过API接口进行操作:TYSetBool/TYSetInt/TYSetFloat/TYSetStruct…TYGetBool/TYGetInt/TYGetFloat/TYGetStruct…4.部分属性参数存在一个range范围,可通过API接口TYGetIntRange/ TYGetFloatRange读取。2.4 设备的帧数据管理机制1.设备初始化的时候设置好使能的通道/分辨率/格式之后可通过API接口TYGetFrameBufferSize获取Frame包大小。2.可根据获取的Frame包尺寸分配buffer。3.调用TYEnqueueBuffer将分配的buffer加入到SDK的数据缓冲队列中。4.调用TYFetchFrame将能从SDK缓冲队列中获取一帧数据。5.处理完数据之后重新调用TYEnqueueBuffer将buffer重新加入SDK缓冲队列。设备的帧数据管理机制示意图2.5 SDK中的坐标系变换深度图的像素坐标系和空间坐标系(点云)TYMapDepthToPoint3d/ TYMapDepthImageToPoint3d TYMapPoint3dToDepth/TYMapPoint3dToDepthImage点云空间坐标系变换TYMapPoint3dToPoint3d深度图和RGB图像素坐标系变换TYMapDepthToColorCoordinate/TYMapDepthImageToColorCoordinateTYMapRGBImageToDepthCoordinate3.Sample_V1示例程序下面运行exe程序可以通过鼠标右键shift按键打开powershell运行3.1 DeviceStorage该示例程序用于操作custom_block.bin和isp_block.bin的存储空间。使用方法:1.操作custom_block.bin 存储空间1)写入文件内容将1.txt文件中的内容写入custom_block.bin。运行示例程序.\DeviceStorage.exe-id207000151696-b custom-i1.txt2)读出内存中的文件内容并输出到程序运行目录下。运行示例程序.\DeviceStorage.exe-id207000151696-b custom-o2.txt注释207000151696是相机序列号根据实际情况更改2.操作isp_block.bin存储空间1)写入文件内容将1.txt文件中的内容写入isp_block.bin 。运行示例程序.\DeviceStorage.exe-id207000151696-b isp-i1.txt2)读出内存中的文件内容并输出到程序运行目录下。运行示例程序.\DeviceStorage.exe-id207000151696-b isp-o2.txt3.2 DumpCalibInfoSDK3.6.52之后版本新增示例程序此示例程序可以将相机的标定参数以json文件的形式导出到本地。使用方法:1.导出原始的标定参数文件.\DumpCalibInfo.exe-id 相机序列号-cs0-ds0-out_json FM855-E1-G.json-cs 0表示设置RGB分辨率为列表中的第一个-ds 0表示设置depth分辨率为列表中的第一个-out_json指定输出文件的名字及路径2.导出当前的标定参数文件.\DumpCalibInfo.exe-id207000151696-cs1-ds2-mode0-out_json FM855-E1-G.json-mode 0表示读取当前设置后的标定参数读取到的内参会随分辨率变化其他模式均为原始的标定参数。3.3 NetStatistic该示例程序用于测试网络相机图像的丢包率。示例程序如下TY_CAMERA_STATISTICS st;ASSERT_OK(TYGetStruct(hDevice,TY_COMPONENT_DEVICE,TY_STRUCT_CAM_STATISTICS,st,sizeof(st)));LOGI(Statistics:);LOGI( packetReceived: %PRIu64 ,st.packetReceived);LOGI( packetLost : %PRIu64 ,st.packetLost);LOGI( imageOutputed : %PRIu64 ,st.imageOutputed);LOGI( imageDropped : %PRIu64 ,st.imageDropped);packetReceived上位机共收到的数据包数量packetLost上位机共未收到的数据包数量imageOutputed上位机总的收到的图像数量与数据流个数成整倍数关系imageDropped上位机总的未收到的图像数量3.4 SimpleView_SaveLoadConfig该示例程序给出了保存/导出相机配置参数的demo。参数配置文件有自己的格式格式错误会校验不通过从而功能失效。若需正确的参数配置文件请使用PV软件导出一份。使用方法:1.将参数配置文件导入相机存储空间运行示例程序.\SimpleView_SaveLoadConfig.exe-id207000151696-s FM855.json2.将参数配置文件导出到本地程序运行目录下运行示例程序.\SimpleView_SaveLoadConfig.exe-id207000151696-o fm855.jsonwrite_parameters_to_storage向DeviceStorage写入包含featrue配置的json数据load_parameters_from_storage从DeviceStorage读出json并解码出json然后配置到相机常见错误反馈1.Error:The configuration file is too large,the maximum size shouldnotexceed4000bytes写入存储空间时文件内容大于存储空间的大小2.Error:The CRC check code is empty加载参数时存储空间没有内容3.parameters load fail!用write_parameters_to_storage写入的文件内容错误格式不匹配4.Error:The data in the storage area has a CRC check error. 存储空间的文件内容不是以write_parameters_to_storage接口写入的在调用load_parameters_from_storage时将返回此错误3.5 SimpleView_FetchFrame该示例程序用于深度相机工作在自由采集模式下连续采集图像并输出图像数据。3.6 SimpleView_Callback该示例程序用于深度相机工作在自由采集模式下连续采集图像在独立的数据处理线程防止堵塞图像数据获取中进行 OpenCV 渲染并输出图像数据。sample/common/TYThread.cpp提供了简单的线程创建接口通过开启线程循环fetch图像以避免主线程的阻塞。3.7 SimpleView_SGBMSGM是一种用于计算双目视觉中视差disparity的半全局匹配算法在OpenCV中的实现为semi-global block matchingSGBM。而图漾的FM815/PS800/PS801/PS802/FM855等相机SGBM参数作用如下3.7.1 disparityNum和disparityOffset参数调整技巧disparityNum视差范围。disparityOffset最小视差值。使用场景客户想要更改预定义的深度范围近远端值。调整方向:深度范围减小 disparityNum大概率减小。深度范围远端往相机端缩进 disparityOffset变大反之亦反。而disparityNum和disparityOffset参数设置计算公式如下disparityNum(baseline*fx)/depth_thres.first-(baseline*fx)/depth_thres.second15;disparityOffset((baseline*fx)/(depth_thres.second))-DISPARITY_TRANSLATION;计算公式里的每个参数的具体含义如下3.7.2 matchWinW和matchWinH参数调整技巧matchWinW匹配块横向大小matchWinH匹配块纵向大小使用场景针对被测物要测量的特征针对的是平滑面还是物体细节进行细微的调整。调整方向一般的预设置的匹配块大小可认为是一个全局考虑的值深度图越需要平滑的匹配块大概率是从预设值向大调整反之亦反。注意事项请首先按照 matchWinW matchWinH 的方式进行调整一般匹配块大小必须是奇数且大于等于33.7.3 P1和P2参数调整技巧P1控制视差平滑度的第一个参数。P1scale控制视差平滑度的尺度参数。P2控制视差平滑度的第二个参数。使用场景 需要调整深度图平滑度的情况。调整方向P1越大越倾向于生成连续的视差图。 P1scale作用在平滑度上P1sacle范围是[0~1]越大就越平滑。 P2越大越倾向于消除小的视差变化。P2必须大于P1。注意事项建议先调整P1sacle后P1再P2。3.7.4 uniqueFator和uniqueAbsDiff参数调整技巧uniqueFator唯一性检查阈值最优与次优的比值约束。uniqueAbsDiff唯一性检查阈值绝对值差阈值。使用场景被测物有杂点、飞点、空洞过多等情况。调整方向后处理约束参数调整过小会产生杂点或飞点过大则会产生大片空洞。 一般uniqueAbsDiff比uniqueFator约束性更强。3.8 SimpleView_Point3D该例子的主要功能输出带有color信息的点云而fetch_thread流程如下提所示3.8.1 如何获取相机内参第一种方式方式:在PercipioViewer软件同级目录下建一个fetch_config.xml文件之后打开相机取流相机内参会写到fetch_config.xml文件中。此文件包含了该相机支持的所有组件和属性具体步骤如下1).在电脑上新建一个名为fetch_config的.xml文件。2).将.xml 文件与 Percipio Viewer 软件放置于同一目录层级。3).打开软件 选择相机取流之后便可在此文件中查看相机支持的组件和属性。第二种是下载官网C版本SDK运行DumpAllFeatures.exe例程输入.\DumpAllFeatures.exe -d也可在当前目录下得到fetch_config.xml文件而程序中获取相机RGB/深度图内参可通过如下函数接口获取:TY_STRUCT_CAM_CALIB_DATA内参是相机最大分辨率的内参TY_STRUCT_CAM_INTRINSIC内参是相机当前分辨率的内参3.8.2 相机内参描述fxfy图像在xy方向的有效焦距cxcy镜头中心点的坐标rxx描述相机相对于其它坐标轴的方向tx描述相机在其它坐标系中的位置k1k2径向畸变参数p1p2切向畸变参数3.8.3 fetch_config.xml文件描述关于fetch_config.xml的详细描述请参考如下链接https://doc.percipio.xyz/cam/latest/apiguides/baisc_concepts.html3.8.4 D2C对齐方式说明D2C方式深度图对齐到彩色图对齐后转换到彩色图坐标系。D2C对齐流程如下:3.8.5 C2D对齐方式说明C2D方式彩色图对齐到深度图对齐后转换到彩色图坐标系。C2D对齐流程如下:3.9 SimpleView_SGBM_XYZ48SimpleView_SGBM_XYZ48流程而SimpleView_Point3D和SimpleView_SGBM_XYZ48例子的主要区别如下3.10 SimpleView_TriggerMode13.10.1 软触模式软触发sdk通过以太网或usb向相机发送软触发指令相机收到后进行触发动作。TY_TRIGGER_PARAM trigger;//设置触发模式trigger.modeTY_TRIGGER_MODE_SLAVE;//软触发和硬触发模式ASSERT_OK(TYSetStruct(hDevice,TY_COMPONENT_DEVICE,TY_STRUCT_TRIGGER_PARAM,trigger,sizeof(trigger)));3.10.2 硬触发模式硬触发向相机trig引脚发送沿信号每次触发相机进行一次触发动作。硬触发模式防抖:////硬触发模式防抖boolhasDI0_WORKMODE;ASSERT_OK(TYHasFeature(hDevice,TY_COMPONENT_DEVICE,TY_STRUCT_DI0_WORKMODE,hasDI0_WORKMODE));if(hasDI0_WORKMODE){TY_DI_WORKMODE di_wm;di_wm.modeTY_DI_PE_INT;di_wm.int_actTY_DI_INT_TRIG_CAP;uint32_ttime_hw10;//单位ms硬件滤波小于设定时间的电平信号会被过滤uint32_ttime_sw200;//单位ms软件滤波连续高频触发情形小于设置周期的后一个触发信号将被过滤di_wm.reserved[0]time_hw|(time_sw16);ASSERT_OK(TYSetStruct(hDevice,TY_COMPONENT_DEVICE,TY_STRUCT_DI0_WORKMODE,di_wm,sizeof(di_wm)));}硬触发延迟时间trig_delay 仅在slave模式下启用并且仅适用于硬触发相机收到触发信号后延时delay微秒后触发sensor采图TYSetInt(hDevice,TY_COMPONENT_DEVICE,TY_INT_TRIGGER_DELAY_US,delay)TYGetInt(hDevice,TY_COMPONENT_DEVICE,TY_INT_TRIGGER_DELAY_US,delay)3.11 SimpleView_TriggerMode_M2S1TY_TRIGGER_MODE_M_SIG 配置主设备相机工作在模式 2多台从设备相机工作在模式 1以实现多台深度相机级联触发同时采集图像。master 模式每一次软触发命令会同步输出一个trig out信号 trig out信号可以连接多台slave模式相机的trig in实现1台master控制n台slave同步触发具体实现代码如下LOGD( Set trigger mode);if(((strcmp(selected[i].id,list[0])0)(list.size()0))||((count0)(list.size()0))){LOGD( set master device, id: %s,cams[count].sn);cams[count].tagstd::string(cams[count].sn)_master;TY_TRIGGER_PARAM param;param.modeTY_TRIGGER_MODE_M_SIG;ASSERT_OK(TYSetStruct(cams[count].hDev,TY_COMPONENT_DEVICE,TY_STRUCT_TRIGGER_PARAM,(void*)param,sizeof(param)));}else{cams[count].tagstd::string(cams[count].sn)_slave;TY_TRIGGER_PARAM param;param.modeTY_TRIGGER_MODE_SLAVE;ASSERT_OK(TYSetStruct(cams[count].hDev,TY_COMPONENT_DEVICE,TY_STRUCT_TRIGGER_PARAM,(void*)param,sizeof(param)));}而这种模式下触发过滤时间设置如下TYSetInt(hDevice,TY_COMPONENT_DEVICE,TY_INT_TRIGGER_DURATION_US,dura)TYGetInt(hDevice,TY_COMPONENT_DEVICE,TY_INT_TRIGGER_DURATION_US,dura)trig_duration 仅在master模式下启用并且仅适用于软触发 相机收到触发信号后延时dura微秒后输出trig out信号3.12 SimpleView_TriggerMode_M3S1多台从设备相机工作在模式 1以实现多台深度相机按照设置的帧率级联触发同时采集图像。master 模式不需要触发信号相机start后按周期连续输出trig out信号 trig out信号可以连接多台slave模式相机的trig in实现1台master控制n台slave同步触发。具体实现代码如下LOGD( Set trigger mode);if(((strcmp(selected[i].id,list[0])0)(list.size()0))||((count0)(list.size()0))){LOGD( set master device);cams[count].tagstd::string(cams[count].sn)_master;TY_TRIGGER_PARAM param;param.modeTY_TRIGGER_MODE_M_PER;param.fps5;//设置的帧率相机根据fps计算周期周期是1000000/fps usASSERT_OK(TYSetStruct(cams[count].hDev,TY_COMPONENT_DEVICE,TY_STRUCT_TRIGGER_PARAM,(void*)param,sizeof(param)));}else{cams[count].tagstd::string(cams[count].sn)_slave;TY_TRIGGER_PARAM param;param.modeTY_TRIGGER_MODE_SLAVE;ASSERT_OK(TYSetStruct(cams[count].hDev,TY_COMPONENT_DEVICE,TY_STRUCT_TRIGGER_PARAM,(void*)param,sizeof(param)));}4.常见问题FAQ下面主要介绍图漾官网C版本SDK编译过程中常遇见的问题及解决方式4.1 编译完成后无SimpleView_Point3D和SimpleView_Registration例子早期的SDK版本需要在Cmake编译过程中勾选Opengl_View如不勾选编译生成的例子无SimpleView_Point3D和SimpleView_Registration4.2 选择Opencv安装路径后仍编译不成功选择Opencv安装路径后编译仍报错如遇到此情况建议将选择的Opencv路径更改为..\opencv\build\x64\vc16\lib4.3 在Ubuntu16系统编译报错在使用ubuntu16系统编译官网C版本的SDK出现如下报错而解决方式需要加入C版本标准如下图如果需要只编译sample_v2关闭sample_v1则cmake增加如下参数:cmake..-DBUILD_SAMPLESoff在sample_v2基础上关闭对opencv依赖则cmake增加如下cmake..-DBUILD_SAMPLESoff-DBUILD_SAMPLE_V2_WITH_OPENCVoff4.4 Linux环境编译官网SDK无SimpleView_Point3D和SimpleView_Point3D_XYZ48例子需要先安装opengl库sudo apt-get install freeglut3-dev之后打开camport4-main/sample/sample_v1路径下的CMakeLists.txt进行编译将option(OPENGL_VIEW Enable GLUT OpenGL point cloud view ON)设置ON。5.参考资料1.双目立体匹配算法SGBMhttps://blog.csdn.net/A_L_A_N/article/details/81490043?spm1001.2014.3001.55062.双目立体匹配博客资料汇总https://blog.csdn.net/qq_38233873/article/details/135450586?spm1001.2014.3001.5506
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。