Bootstrap

图漾相机——C++语言属性设置

文章目录

前言

请参考图漾官网的在线文档:http://doc.percipio.xyz/cam/latest/apiguides/api_description.html
因为所有SDK都是基于C++代码,所以以C++为例。
在这里插入图片描述

测试相机列表

1.SDK API功能介绍

1.1 Device组件下的API测试

1.1.1 相机工作模式设置(TY_TRIGGER_PARAM_EX)

图漾相机包含多种工作模式设置

TY_TRIGGER_MODE_OFF:自由采集模式
TY_TRIGGER_MODE_SLAVE:软触发/硬触发模式
TY_TRIGGER_MODE_SIG_LASER:定制的工作模式,已弃用
TY_TRIGGER_MODE_M_SIG:相机接收到软触发信号后,自身触发的同时,在OutPut引脚输出信号,以触发从设备。

上述工作模式设置方法统一如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_MODE_OFF;//根据需要的工作模式进行配置
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));

TY_TRIGGER_MODE_M_PER:相机按照特定的帧率触发,同时在OutPut引脚输出信号,以触发从设备。设置方法如下:

TY_TRIGGER_PARAM_EX param; 
param.mode = TY_TRIGGER_MODE_M_PER;
param.fps = 5;
ASSERT_OK(TYSetStruct(cams[count].hDev, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, (void*)&param, sizeof(param)));

注意:TY_TRIGGER_MODE_M_SIG和TY_TRIGGER_MODE_M_PER固件版本需大于3.13.68,否则使用TY_TRIGGER_PARAM进行设置

TY_TRIGGER_MODE_SIG:工作模式18,已弃用
TY_TRIGGER_MODE_PER:工作模式19,已弃用
TY_TRIGGER_MODE_TIMER_LIST:列表触发模式,定制功能,普通产品不建议使用

根据设置的触发开始时间(start_time_us)、每两帧的时间间隔数组(offset_us_list[])和触发次数(offset_us_count),相机定时采集(1 +offset_us_count)帧图像并输出图像数据。启用此⼯作模式要求相机先启动 PTP 对时,且 offset_us_count≤ 50。

设置方法如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_MODE_TIMER_LIST;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));
TY_TRIGGER_TIMER_LIST list_timer;
list_timer.start_time_us = (getSystemTime() + 3000) * 1000;
list_timer.offset_us_count = 4;
list_timer.offset_us_list[0] = 1000000;
list_timer.offset_us_list[1] = 1000000;
list_timer.offset_us_list[2] = 1000000;
list_timer.offset_us_list[3] = 1000000;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_TIMER_LIST, &list_timer, sizeof(list_timer)));

TY_TRIGGER_MODE_TIMER_PERIOD:周期触发模式,定制功能,不建议使用

根据设置的触发开始时间(start_time_us)、触发次数(trigger_count)和触发时间间隔(peroid_us),相机每间隔
peroid_us 采集⼀帧图像,共采集 trigger_count 帧图像并输出图像数据。
此工作模式要求相机先启动 PTP 对时

设置方法如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_MODE_TIMER_PERIOD;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));
TY_TRIGGER_TIMER_PERIOD period_timer;
period_timer.start_time_us = (getSystemTime() + 3000) * 1000;
period_timer.trigger_count = 10;
period_timer.period_us = 1000000;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_TIMER_PERIOD, &period_timer, sizeof(period_timer)));

TY_TRIGGER_MODE28:定制功能,不建议使用

在此工作模式下,相机接收到软触发/硬触发信号后,输出一帧深度图像和左ir图像(带泛光)。同时在OutPut引脚输出触发信号。

设置方法如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_MODE28;
trigger.led_expo = 1088;    // [3, 1088]
trigger.led_gain = 32;      // [0, 255]
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));

TY_TRIGGER_MODE29:定制功能,不建议使用

在此工作模式下,相机按照特定的帧率,输出一帧深度图像和左ir图像(带泛光)。同时在OutPut引脚输出触发信号。

设置方法如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_MODE29;
trigger.fps = 5;           // [1, 10]
trigger.led_expo = 1088;    // [3,1088]
trigger.led_gain = 32;      // [0, 255]
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));

TY_TRIGGER_WORK_MODE31:定制功能,不建议使用
设置方法如下:

TY_TRIGGER_PARAM_EX trigger;
trigger.mode = TY_TRIGGER_WORK_MODE31;
trigger.ir_gain[0] = 50;
trigger.ir_gain[1] = 100;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM_EX, &trigger, sizeof(trigger)));

1.1.2 TY_INT_FRAME_PER_TRIGGER

该功能可以设置相机在接收到一次软触发/硬触发后的出图数量,相机默认接收一次信号后只出一帧图像,此功能不建议使用。

设置方法如下:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_FRAME_PER_TRIGGER, value));

验证方法:

if (index % (value +1) == 0) 
{
LOGD("send soft trigger");
while (TY_STATUS_BUSY == TYSendSoftTrigger(hDevice));
}

一次触发后,上位机只可以拿到2帧图像。

1.1.3 TY_INT_PACKET_DELAY

该功能用于设置相机数据包传输时包与包之间延迟时间,用于网络环境不理想的情况下。

设置方法:

int32_t value = 10000;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_PACKET_DELAY, value));

验证方法:

观察相机帧率,TY_INT_PACKET_DELAY越大,相机帧率越低

1.1.4 TY_INT_PACKET_SIZE

该功能用于设置相机数据包的大小,用于网络环境不理想的情况下
设置方法:

int32_t value = 100;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_PACKET_SIZE, value));

验证方法:

观察相机帧率,TY_INT_PACKET_SIZE越小,相机帧率越低。

1.1.5 TY_BOOL_GVSP_RESEND

网络相机图像重传功能

设置方法

ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_GVSP_RESEND, true));

验证方法:

网络相机默认为未开启,图像重传模式(False),设置为True以后,开启重传,有效减少上位机无法获取到图像的概率。

在这里插入图片描述
不设置丢包重传会导致会存在如下常见问题:

1.Percipioview的连续模式可以正常取图,SDK打开后无法取图
2.连续模式的帧率与percipioview不一致
3.触发取图没有图像返回

1.1.6 TY_BOOL_TRIGGER_OUT_IO

该功能用于反转trigger_out的输出电平
设置方法:

ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_TRIGGER_OUT_IO, false));

验证方法:
相机进行trigger供电后,将示波器探头接在相机trigger_out引脚上

TY_BOOL_TRIGGER_OUT_IO = true;电平反转
TY_BOOL_TRIGGER_OUT_IO = false;电平不反转

1.1.7 TY_BOOL_KEEP_ALIVE_ONOFF

SDK 与相机维持通信状态保持机制,默认为 true。表示通讯保持。
设置方法:

ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_KEEP_ALIVE_ONOFF, false));

验证方法:

将此属性设置为false后,运行相机,以“ctrl+c”的方式异常终止SDK采图,相机激光器常亮,SDK无法再次打开相机

1.1.8 TY_INT_KEEP_ALIVE_TIMEOUT

SDK与相机维持通信状态保持时间,usb默认15000ms,网络相机默认3000ms。单位:ms
设置方法

int32_t value = 30000;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_KEEP_ALIVE_TIMEOUT, value));

验证方法

运行相机,以“ctrl+c”的方式异常终止SDK采图,相机激光器在常亮30000ms后熄灭

1.1.9 TY_INT_TRIGGER_DELAY_US

软/硬触发延迟时间设置。相机在收到硬触发信号后,延迟一段时间后出图。单位:us
设置方法:

int32_t value = 1300000;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_TRIGGER_DELAY_US, value));

验证方法:

设置后,相机在收到硬触发信号后,延迟 1300000us(1.3s)后出图

1.1.10 TY_INT_TRIGGER_DURATION_US

输出信号的电平保持时间,单位:us
设置方法:

int32_t value = 100000;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_TRIGGER_DURATION_US, value));

验证方法:

1.相机进行trigger供电后,将示波器探头接在相机trigger_out引脚上。
2.设置相机工作模式为:TY_TRIGGER_MODE_M_SIG
对于输出默认为高电平的相机,则信号低电平保持时间为100000us;
对于输出默认为低电平的相机,则信号高电平保持时间为100000us

注意:很少使用

1.1.11 TY_ENUM_STREAM_ASYNC

数据流异步功能
TY_STREAM_ASYNC_OFF:数据流同步 TY_STREAM_ASYNC_DEPTH:depth数据流异步
TY_STREAM_ASYNC_RGB:RGB数据流异步 TY_STREAM_ASYNC_DEPTH_RGB:depth和RGB数据流异步
TY_STREAM_ASYNC_ALL:所有数据流都异步

设置方法

ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEVICE, TY_ENUM_STREAM_ASYNC, TY_STREAM_ASYNC_RGB));

验证方法

观察程序运行log,以TY_STREAM_ASYNC_RGB为例,上位机先拿到一帧RGB图像,然后拿到一帧depth和ir图。depth和ir的时间戳一致,RGB的时间戳与depth和ir的不一致,根据使用的相机或早或晚的情况都存在。但是同一台相机不会出现有早有晚的情况。

1.1.12 TY_INT_CAPTURE_TIME_US

读取深度计算的时间,仅适用于触发模式下,单位us 自由采集模式下,读取的深度计算时间为0。
使用方法:

int32_t default_value=0;
ASSERT_OK(TYGetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_CAPTURE_TIME_US, &default_value));

验证方法:

与开发描述的深度计算时间统一

1.1.13 TY_ENUM_TIME_SYNC_TYPE

相机的对时功能

TY_TIME_SYNC_TYPE_NONE:不进行对时。 TY_TIME_SYNC_TYPE_HOST:相机与上位机对时
TY_TIME_SYNC_TYPE_NTP:相机与NTP服务器对时 TY_TIME_SYNC_TYPE_PTP:相机与PTP服务器对时
TY_TIME_SYNC_TYPE_CAN:相机与can网络对时,仅定制相机支持
TY_TIME_SYNC_TYPE_PTP_MASTER:设置相机为PTP服务器

设置方法:

ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEVICE, TY_ENUM_TIME_SYNC_TYPE, TY_TIME_SYNC_TYPE_HOST));
while (1) 
{
bool sync_ready;
ASSERT_OK(TYGetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_TIME_SYNC_READY, &sync_ready));
if (sync_ready) 
{
break;
}
MSLEEP(10);
}

验证方法:

TY_TIME_SYNC_TYPE_NONE:图像时间戳位数较短 。
TY_TIME_SYNC_TYPE_HOST:图像时间戳与上位机一致,修改上位机时间后,相机时间戳自动发生变化 。
TY_TIME_SYNC_TYPE_NTP:图像时间戳与NTP服务器一致,修改上位机时间后,时间戳不会发生变化。
TY_TIME_SYNC_TYPE_PTP:图像时间戳与PTP服务器一致,定制功能,不建议使用。
TY_TIME_SYNC_TYPE_CAN:图像时间戳与can网络服务器一致,定制相机,不建议使用。
TY_TIME_SYNC_TYPE_PTP_MASTER:相机自身作为PTP服务器,其他相机可以与其进行对时,定制功能,不建议使用。

对于NTP对时,需要额外验证指定服务器ip后的对时情况。
方法如下:

const char* ntp_ip = " 119.29.26.206 ";
int32_t ip_i[4];
uint8_t ip_b[4];
int32_t ip32;
sscanf(ntp_ip, "%d.%d.%d.%d", &ip_i[0], &ip_i[1], &ip_i[2], &ip_i[3]);
ip_b[0] = ip_i[0]; ip_b[1] = ip_i[1]; ip_b[2] = ip_i[2]; ip_b[3] = ip_i[3];
ip32 = TYIPv4ToInt(ip_b);
LOGI("Set persistent IP 0x%x(%d.%d.%d.%d)", ip32, ip_b[0], ip_b[1], ip_b[2], ip_b[3]);
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_NTP_SERVER_IP, ip32));
ASSERT_OK(TYGetInt(hDevice, TY_COMPONENT_DEVICE,TY_INT_NTP_SERVER_IP, &ip32));
TYIntToIPv4(ip32, ip_b);
LOGD("%d %d %d %d", ip_b[0], ip_b[1], ip_b[2], ip_b[3]);
LOGD("Set type of time sync mechanism");
ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEVICE, TY_ENUM_TIME_SYNC_TYPE, TY_TIME_SYNC_TYPE_NTP));
LOGD("Wait for time sync ready");
while (1) 
{
bool sync_ready;
ASSERT_OK(TYGetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_TIME_SYNC_READY, &sync_ready));
if (sync_ready) 
{
break;
}
MSLEEP(10);
}

1.1.14 TY_BOOL_TIME_SYNC_READY

对时是否成功判断API
使用方法:

bool sync_ready;
ASSERT_OK(TYGetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_TIME_SYNC_READY, &sync_ready));

验证方法:

设置相机为NTP对时,每隔1s打印一次对时是否成功的状态。
当对时尚未成功时,返回结果为false。
当对时成功时,返回结果为true。

1.1.15 TY_BOOL_CMOS_SYNC

左右ir异步曝光开关。true:同步曝光;false:异步曝光
设置方法:

ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_CMOS_SYNC, false));

验证方法:

使用FM851-E2相机,对比开启和关闭TY_BOOL_CMOS_SYNC后,深度图像的帧率, TY_BOOL_CMOS_SYNC =false时帧率比TY_BOOL_CMOS_SYNC = true时高。

1.1.16 TY_INT_ACCEPTABLE_PERCENT

网络数据包丢包容忍度,上位机接收到的图像数据包百分比低于此阈值的图像将被丢弃, 单位:%
设置方法:

ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_ACCEPTABLE_PERCENT, 90));

验证方法:

关闭网络重传后,将TY_INT_ACCEPTABLE_PERCENT设置成较小的数值时,在一台电脑上运行多台相机,观察各个相机的输出图像。当此值较小时,上位机将收到破损的图像(如:RGB上有大面积的绿色)

1.1.17 TY_STRUCT_CAM_STATISTICS

获取网络相机的传图情况。
设置方法:

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:上位机总的未收到的图像数量

1.1.18 IP设置

ip设置涉及3个API:

IP设置API:TY_INT_PERSISTENT_IP
子网掩码设置API:TY_INT_PERSISTENT_SUBMASK
网关设置API:TY_INT_PERSISTENT_GATEWAY

验证方法:

1.使用ForceDeviceIP设置合法的ip地址(动态、静态、临时ip)
2.使用ForceDeviceIP设置非法的ip地址(动态、静态、临时ip),设置静态ip后,相机上电重启,ip保持不变。可以在进行跨网段发现及跨网清除ip。

1.2 Laser组件下的API测试

1.2.1 TY_BOOL_LASER_AUTO_CTRL

激光自动控制开关

并不是根据光线亮度,自动调整激光器的亮度的意思!!!

设置方法:

ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_LASER, TY_BOOL_LASER_AUTO_CTRL, false));

验证方法:

1.对于主动双目结构光相机:
TY_BOOL_LASER_AUTO_CTRL=false时,出任意数据流,只要laser_power≠0,激光器都被点亮,ir为散斑图。
TY_BOOL_LASER_AUTO_CTRL = true时,只有出深度时,激光器才被点亮,ir出sobel图。

2.对于主动双目条纹光相机:
TY_BOOL_LASER_AUTO_CTRL =false时,出任意数据流,只要laser_power≠0,条纹光投射器都将被点亮。
TY_BOOL_LASER_AUTO_CTRL = true时,只有出深度时,条纹光投射器才会被点亮。

1.2.2 TY_INT_LASER_POWER

用于设置激光/条纹光投射器光源强度
设置方法:

int32_t value = 0;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_LASER, TY_INT_LASER_POWER, value));

验证方法:

TY_INT_LASER_POWER值越大,激光/条纹光投射器投射的光越亮

1.2.3 TY_BOOL_IR_FLASHLIGHT

用于开启IR的泛光灯源(FM855-E1-G)
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_LASER, TY_BOOL_IR_FLASHLIGHT, value));

验证方法:

将此属性设置为true以后,ir的泛光灯源被点亮 。
ir泛光灯源与RGB泛光灯源、激光器不可同时被点亮。
当相机出深度图时,ir泛光灯不可被点亮。

1.2.4 TY_BOOL_RGB_FLASHLIGHT

用于开启RGB的泛光灯源(FM855-E1-G)
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_LASER, TY_BOOL_RGB_FLASHLIGHT, value));

验证方法:

将此属性设置为true以后,RGB的泛光灯源被点亮。

1.2.5 TY_INT_IR_FLASHLIGHT_INTENSITY

用于设置IR泛光亮度强度(FM855-E1-G)
设置方法:

int32_t value = 0;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_LASER, TY_INT_IR_FLASHLIGHT_INTENSITY, value));

验证方法:

开启IR泛光后,设置的强度越大,灯越亮,IR图像越亮。

1.2.6 TY_INT_RGB_FLASHLIGHT_INTENSITY

用于设置RGB泛光亮度强度(FM855-E1-G)
设置方法:

int32_t value = 0;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_LASER, TY_INT_RGB_FLASHLIGHT_INTENSITY, value));

验证方法:

开启RGB泛光后,设置的强度越大,灯越亮,RGB图像越亮。

1.3 Depth组件下的API测试

1.3.1 TY_FLOAT_SCALE_UNIT

深度数值单位
设置方法:

float value = 0.25;
ASSERT_OK(TYSetFloat(hDevice, TY_COMPONENT_DEPTH_CAM, TY_FLOAT_SCALE_UNIT,value));

验证方法:

设置后,鼠标点击深度图,观察程序打印的深度值单位。如设置为0.25,则深度值为1000.5, 1000.8(打印数据精度的问题)

1.3.2 TY_INT_SGBM_IMAGE_NUM

SGBM计算深度时需要的ir图像数量
设置方法:

int32_t value = 10;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_IMAGE_NUM, value));

验证方法:

改变TY_INT_SGBM_IMAGE_NUM值,深度有效像素有明显差异,该参数越小,帧率越高

1.3.3 TY_INT_SGBM_DISPARITY_NUM

SGBM计算深度时的视差搜索范围
设置方法:

int32_t value = 10;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_DISPARITY_NUM, value));

验证方法:

改变TY_INT_SGBM_DISPARITY_NUM值,深度有效像素有明显差异

1.3.4 TY_INT_SGBM_DISPARITY_OFFSET

SGBM计算深度时开始搜索的视差值
设置方法:

int32_t value = 10;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_DISPARITY_OFFSET, value));

验证方法:

改变TY_INT_SGBM_DISPARITY_OFFSET值,深度有效像素有明显差异

1.3.5 TY_INT_SGBM_MATCH_WIN_HEIGHT

SGBM计算深度时匹配窗口的高
设置方法:

int32_t value = 10;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_MATCH_WIN_HEIGHT, value));

验证方法:

改变TY_INT_SGBM_MATCH_WIN_HEIGHT值,深度有效像素有明显差异。
TY_INT_SGBM_MATCH_WIN_HEIGHTTY_INT_SGBM_IMAGE_NUM存在约束关系,约束关系以相机config文件中的约束为准。

1.3.6 TY_INT_SGBM_MATCH_WIN_WIDTH

SGBM计算深度时匹配窗口的高
设置方法:

int32_t value = 10;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_MATCH_WIN_WIDTH, value));

验证方法:

改变TY_INT_SGBM_MATCH_WIN_WIDTH值,深度有效像素有明显差异

1.3.7 TY_INT_SGBM_SEMI_PARAM_P1

相邻像素 (+/-1) 约束惩罚参数
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_SEMI_PARAM_P1, value));

验证方法:

P1越小,深度上细小的黑洞就越多

1.3.8 TY_INT_SGBM_SEMI_PARAM_P1_SCALE

相邻像素 (+/-1) 约束惩罚参数 P1_scale
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_SEMI_PARAM_P1_SCALE, value));

验证方法:

P1_Scale参数越大,深度黑洞越多

1.3.9 TY_INT_SGBM_SEMI_PARAM_P2

周围像素约束惩罚参数 P2
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_SEMI_PARAM_P2, value));

验证方法:

调整P2,深度图有效像素及深度效果有明显变化

1.3.10 TY_INT_SGBM_UNIQUE_FACTOR

唯一性检查参数 2,即最优与次优匹配点的差值
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_UNIQUE_FACTOR, value));

验证方法:

唯一性百分比参数越大,深度黑洞越多

1.3.11 TY_INT_SGBM_UNIQUE_ABSDIFF

唯一性检查参数 1,即最优与次优匹配点的百分比
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_UNIQUE_FACTOR, value));

验证方法:

唯一性差值参数越大,深度黑洞越多

1.3.12 TY_BOOL_SGBM_HFILTER_HALF_WIN

搜索滤波开关。用于进一步优化深度图,去除噪声和不连续性,对物体边缘点云更友好
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEPTH_CAM, TY_BOOL_SGBM_HFILTER_HALF_WIN, value));

验证方法:

关闭搜索滤波后,深度黑洞变少,错误匹配点增多

1.3.13 TY_BOOL_SGBM_MEDFILTER

中值滤波开关,用于消除孤立的噪声点,同时尽可能地保留图像的边缘信息
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEPTH_CAM, TY_BOOL_SGBM_MEDFILTER, value));

验证方法:

开启中值滤波后,平面拟合的均方根误差变小(可以用PV进行辅证)

1.3.14 TY_INT_SGBM_MEDFILTER_THRESH

中值滤波阈值。设定值越大,过滤的噪点越多,但也可能会导致深度图的细节信息丢失
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_MEDFILTER_THRESH, value));

验证方法:

开启中值滤波后,中值滤波阈值参数越大,平面拟合的均方根误差越小(可以用PV进行辅证)

1.3.15 TY_BOOL_SGBM_LRC

左右一致性检查开关
设置方法:

bool value = false;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEPTH_CAM, TY_BOOL_SGBM_LRC, value));

验证方法:
关闭左右一致性检查后,错误匹配点变多

1.3.16 TY_INT_SGBM_LRC_DIFF

中值滤波阈值。设定值越大,过滤的噪点越多,但也可能会导致深度图的细节信息丢失
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_LRC_DIFF, value));

验证方法:

开启左右一致性检查后,一致性检查参数越大,错误匹配点越多

1.3.17 TY_ENUM_DEPTH_QUALITY

tof相机的深度图像质量
设置方法:

uint32_t value = 0;
ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEPTH_CAM, feature_id, value));

验证方法:

比较不同的图像质量下,深度图的帧率

1.3.18 TY_INT_TOF_MODULATION_THRESHOLD

tof深度相机接收激光调制光强的阈值,小于此阈值的像素点不参与计算深度,即像素点的深度值赋值为0
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_TOF_MODULATION_THRESHOLD, value));

验证方法:

参数越大,深度有效像素百分比越低

1.3.19 TY_INT_TOF_JITTER_THRESHOLD

tof 深度相机抖动过滤阈值,阈值设置值越大,深度图边缘抖动的深度数据过滤得越少
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_TOF_JITTER_THRESHOLD, value));

验证方法:

参数越小,深度有效像素百分比越低

1.3.20 TY_INT_FILTER_THRESHOLD

tof 深度相机飞点滤波阈值,默认值为 0,即不加滤波。滤波阈值设置越小,过滤的飞点越多
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_FILTER_THRESHOLD, value));

验证方法:

参数越小,深度有效像素百分比越低

1.3.21 TY_INT_TOF_CHANNEL

tof 深度相机调制频道。 不同调制频道的调制频率不同,互不干扰。 如需在同一场景运行多台 tof 深度相机,首先需确保同系列相机的调制频道不同

设置方法

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_TOF_CHANNEL, value));

验证方法

1.多台相机使用相同的频率进行对射制造多相机干扰现象;(多相机深度异常)
2.多台相机使用不同的频率进行对射制造多相机干扰现象;(多相机深度不受干扰)

1.3.22 TY_INT_TOF_HDR_RATIO

高动态范围比阈值,需在TY_ENUM_DEPTH_QUALITY=HIGH模式下使用
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_TOF_HDR_RATIO, value));

验证方法:

拍摄高反物体,使用不同的参数进行对比

1.3.23 TY_INT_TOF_ANTI_SUNLIGHT_INDEX

tof抗阳光指数
设置方法:

int32_t value = 1;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_TOF_ANTI_SUNLIGHT_INDEX, value));

验证方法:

在太阳光底下,设置该参数后,可以有效减少阳光的干扰

1.3.24 TY_INT_MAX_SPECKLE_DIFF

斑点滤波器聚类阈值,单位:mm。若相邻像素的深度差值小于该阈值,则认为该相邻像素属于同一个聚类斑点
设置方法:

int32_t value = 200;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_MAX_SPECKLE_DIFF, value));

验证方法:

阈值越小,图像滤除的斑点越多,在(max speckle size)较大值时调试diff参数,效果明显

1.3.25 TY_INT_MAX_SPECKLE_SIZE

斑点滤波器面积阈值,单位:像素。面积小于该阈值的聚类斑点会被滤除
设置方法:

int32_t value = 200;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_MAX_SPECKLE_SIZE, value));

验证方法:

阈值越大,图像滤除的斑点越多

1.3.26 TY_BOOL_TOF_ANTI_INTERFERENCE

抗多机干扰开关,适用于场景中dtof相机数量大于tof_channel数量时的场景,可以有效避免多机干扰现象。
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEPTH_CAM, TY_BOOL_TOF_ANTI_INTERFERENCE, value));

验证方法:

开启抗多机干扰后,同一场景中的多台dtof相机之间的影响有效减弱

1.3.27 TY_ENUM_CONFIG_MODE

V系列相机预设的参数,不同模式下相机的精度不同
设置方法:

uint32_t value = TY_CONFIG_MODE_PRESET1;
ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEVICE, TY_ENUM_CONFIG_MODE, value));

验证方法:

对比不同模式下,相机的精度、成像效果

1.4 RGB组件下的API测试

1.4.1 TY_INT_ANALOG_GAIN

用于设置RGB模拟增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_ANALOG_GAIN, value));

验证方法:

参数越大,RGB图像越亮

1.4.2 TY_INT_R_GAIN

用于设置RGB红色通道增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_R_GAIN, value));

验证方法:

参数越大,RGB图像越红

1.4.3 TY_INT_G_GAIN

用于设置RGB绿色通道增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_G_GAIN, value));

验证方法:

参数越大,RGB图像越绿

1.4.4 TY_INT_B_GAIN

用于设置RGB蓝色通道增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_B_GAIN, value));

验证方法:

参数越大,RGB图像越蓝

1.4.5 TY_INT_EXPOSURE_TIME

用于设置RGB曝光时间
设置方法:

int32_t value = 100;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_EXPOSURE_TIME, value));

验证方法:

参数越大,RGB图像越亮

1.4.6 TY_INT_AE_TARGET_Y

AEC调节的目标明亮度
设置方法:

int32_t value = 200;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_RGB_CAM, TY_INT_AE_TARGET_Y, value));

验证方法:

开启AEC以后,参数越低,图像越暗;参数越大,图像越亮

1.4.7 TY_STRUCT_AEC_ROI

AEC调节感兴趣区域,设置后,根据感兴趣区域的亮度,自动调整曝光时间
设置方法:

TY_AEC_ROI_PARAM roi;
roi.x = 0;
roi.y = 0;
roi.w = 100;
roi.h = 100;
ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_RGB_CAM, TY_STRUCT_AEC_ROI, &roi, sizeof(roi)));

验证方法:

若感兴趣区域内过曝(日光灯),则整幅图像变暗
若感兴趣区域欠曝(黑色物体),则整幅图像变亮

1.4.8 TY_BOOL_AUTO_EXPOSURE

RGB自动曝光开关
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_RGB_CAM, TY_BOOL_AUTO_EXPOSURE, value));

验证方法:

方法1:开启RGB自动曝光后,相机对着日光灯,用手遮住RGB镜头,手移开后,图像会有一个收敛的过程。
方法2:关闭RGB自动曝光后,将曝光时间拉到最低,然后开启RGB自动曝光,图像会变亮

1.4.9 TY_BOOL_AUTO_AWB

RGB自动白平衡功能
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_RGB_CAM, TY_BOOL_AUTO_AWB, value));

验证方法:

使用FM851-E1相机,关闭自动白平衡后,调节RGB三通道增益,使RGB图像偏色,然后开启自动白平衡,图像恢复正常色彩

1.4.10 AUTO_ISP

若图像输出YUYV格式,则相机带有硬件ISP模块。
若图像输出BAYER8GB格式,则相机需要使用软件ISP。

针对RGB镜头无ISP功能,提供的软件isp功能,涉及TYISPCreate()ColorIspInitSetting()TYISPUpdateDevice() 3个API
验证方法:

连接一台FM851-E2相机,运行SimpleView_FetchFrame、SimpleView_TriggerMode1示例程序,对比RGB图像颜色。

启用auto isp后,TY_INT_ANALOG_GAIN会被设置为1

软ISP功能,仅针对BAYER8GB格式彩色相机,开启后可实现一定程度的自动白平衡和自动曝光,但会降低帧率。

1.5 IR组件下的API测试

1.5.1 TY_INT_EXPOSURE_TIME

用于设置左右IR曝光时间
设置方法:

int32_t value = 100;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_INT_EXPOSURE_TIME, value));

验证方法:

参数越大,IR图像越亮

1.5.2 TY_INT_ANALOG_GAIN

用于设置左右IR模拟增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_INT_ANALOG_GAIN, value));

验证方法:

参数越大,IR图像越亮

1.5.3 TY_INT_GAIN

用于设置左右IR增益
设置方法:

int32_t value = 2;
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_INT_GAIN, value));

验证方法:

参数越大,IR图像越亮

1.5.4 TY_BOOL_UNDISTORTION

左右IR畸变校正开关,开启则表示进行校正,默认为不开启状态
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_BOOL_UNDISTORTION, value));

验证方法:

拍摄天花板,开启畸变校正后,天花板上的缝隙拉直(与人眼看到的一样) 左右ir为绑定状态,要开一起开,要关一起关。以“后设置”的为准

1.5.5 TY_BOOL_HDR

左右IR HDR开关
设置方法:

bool value = true;
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_BOOL_HDR, value));

验证方法:

开启HDR后,ir图像变的有“朦胧感”

1.5.6 TY_BYTEARRAY_HDR_PARAMETER

HDR曝光比参数
设置方法:
1.读取HDR数组的大小

uint32_t hdr_size;
ASSERT_OK(TYGetByteArraySize(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_BYTEARRAY_HDR_PARAMETER, &hdr_size));
printf("hdr_size %d\n", hdr_size);

2.读取默认的HDR参数

uint32_t hdr_param[8];
hdr_param[0] = -1;
hdr_param[1] = -1;
ASSERT_OK(TYGetByteArray(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_BYTEARRAY_HDR_PARAMETER, (uint8_t*)&hdr_param[0], hdr_size));
printf("default %d  %d\n", hdr_param[0], hdr_param[1]);

3.设置HDR参数

hdr_param[0] = 0;
hdr_param[1] = 0;
ASSERT_OK(TYSetByteArray(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_BYTEARRAY_HDR_PARAMETER, (uint8_t*)&hdr_param[0], hdr_size));

验证方法:

HDR参数范围[0,2],开启HDR后,参数越小,图像越亮

1.6 Storage组件下的API测试

操作存储空间,请使用API进行操作,切勿进入相机底层,通过echo的方式写入内容!!!

操作存储空间的方法请见DeviceStorage示例程序或SimpleView_SaveLoadConfigSaveLoadConfig_v2

1.6.1 TY_BYTEARRAY_CUSTOM_BLOCK

用于获取custom_block.bin存储空间大小
使用方法:
uint32_t block_size;

ASSERT_OK( TYGetByteArraySize(hDevice, TY_COMPONENT_STORAGE, TY_BYTEARRAY_CUSTOM_BLOCK, &block_size) );
LOGD("custom block bin size %d", block_size);

1.结构光相机文件内容一般为0xFF,ToF相机的内容一般为NUL。
2.对于结构光相机,自R3.13.81版本开始,custom_block.bin文件大小由原来的4kb变更为64kb。

1.6.2 TY_BYTEARRAY_ISP_BLOCK

用于获取isp_block.bin存储空间大小
使用方法:

uint32_t block_size;
ASSERT_OK(TYGetByteArraySize(hDevice, TY_COMPONENT_STORAGE, TY_BYTEARRAY_ISP_BLOCK, &block_size));
LOGD("isp block bin size %d", block_size);

1.7 其他常用API测试

1.7.1 TYHasFeature()

用于判断相机是否具备该功能
使用方法:

bool has_feature = false;
ASSERT_OK(TYHasFeature(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_SEMI_PARAM_P1, &has_feature));

验证方法:

1.若相机具有此功能,则返回结果为true,反之则返回false。
2.没有对应的Component,TYHasFeature上报-1008错误(TY_STATUS_INVALID_COMPONENT)

1.7.2 TYGetFeatureInfo()

用于获取功能的属性,如:isValid、accessMode、writableAtRun、componentID、featureID等
使用方法:

TY_FEATURE_INFO feature_info;
int32_t err = (TYGetFeatureInfo(hDevice, TY_COMPONENT_DEPTH_CAM, TY_INT_SGBM_SEMI_PARAM_P1, &feature_info));
printf("API return %d ,  isValid %d , accessMode %d  writeableatrun %d ,\n", err,feature_info.isValid, feature_info.accessMode, feature_info.writableAtRun);

验证方法:

若相机具有此功能,则API返回结果为0,isValid=true,其他描述与相机config一致。

1.7.3 TYGetDeviceFeatureNumber()

用于获取组件下feature的数量
使用方法:

uint32_t feature_number = 0;
ASSERT_OK(TYGetDeviceFeatureNumber(hDevice, TY_COMPONENT_DEPTH_CAM, &feature_number));
LOGD("feature_number %d", feature_number);

验证方法:

获取的feature数量与config文件中描述的数量进行比对(获取的比config文件中多一个,是calib info)

1.7.4 TYGetDeviceFeatureInfo()

和TYGetDeviceFeatureNumber搭配使用,可以获取组件下全部的feature信息
使用方法:

uint32_t feature_number = 0;
ASSERT_OK(TYGetDeviceFeatureNumber(hDevice, TY_COMPONENT_STORAGE, &feature_number));
LOGD("feature_number %d", feature_number);

std::vector <TY_FEATURE_INFO> feature_info(feature_number);
uint32_t entry_count = 0;
ASSERT_OK(TYGetDeviceFeatureInfo(hDevice, TY_COMPONENT_STORAGE, &feature_info[0], feature_number, &entry_count));
for (uint i = 0; i < feature_number; i++) 
{
LOGD("feature name [%s], writebleAtRun[%d], TY_FEATURE_ID [%x]", feature_info[i].name, feature_info[i].writableAtRun, feature_info[i].featureID);
}

验证方法:

与config文件的描述进行比对

1.7.5 write_parameters_to_storage()

SDK 3.6.51及以上版本新增功能,用于将PV导出的json文件写入相机custom_block.bin文件。
使用方法:

1.使用PV2.5.0版本及以上,生成一份当前相机参数的json文件(只保存打开相机后调整过的参数)
2.运行SimpleView_SaveLoadConfig -id 相机序列号 -s xxxx.json 该步骤会将json文件写入相机

验证方法:

1.相机断电重启后,使用PV直接加载参数,观察参数是否发生变化
2.SDK3.6.65及其之后,写入参数时会使用哈夫曼压缩方法,故通过直接查看文件为乱码,需要通过加载的方式验证。

1.7.6 load_parameters_from_storage()

SDK 3.6.51及以上版本新增功能,用于从custom_block.bin文件加载参数,并将其保存至本地文件
使用方法:

运行SimpleView_SaveLoadConfig -id 相机序列号 -o xxxxxxx.json
该步骤会从custom_block.bin加载参数并将参数输出至程序目录下的xxxxxxx.json文件中

验证方法:

有以下2种方法进行验证:
1.加载相机参数后, 查看相机图像变化与设置的参数是否一致。
2.在加载完成后,调用SDK API,读取被加载的参数,与文件内容进行比较。

1.7.7 clear_storage()

清除相机custom_block.bin存储区域的内容
使用方法:

 ASSERT_OK(clear_storage(hDevice));

验证方法:

custom_block.bin文件拷贝至本地,使用notepade++打开,文件内容显示为NUL或调用load_parameters_from_storage(),打印“The CRC check code is empty ”,接口返回错误-1001。

1.7.8 selectDevice()

该API可以使用指定的接口,根据id或者ip打开图漾相机
使用方法:
1.指定使用网络接口,打开图漾相机

std::vector<TY_DEVICE_BASE_INFO> selected;
    ASSERT_OK( selectDevice(TY_INTERFACE_ETHERNET, ID, IP, 1, selected) );

2.使用指定ID或IP打开相机

// ID = "207000149647";
IP = "192.168.6.150";
std::vector<TY_DEVICE_BASE_INFO> selected;
ASSERT_OK( selectDevice(TY_INTERFACE_ETHERNET, ID, IP, 1, selected) );

验证方法:

1.指定使用网络接口,打开图漾相机:当相机是usb相机时,无法打开相机。
2.使用指定ID或IP打开相机:无需输入序列号,每次运行程序都能打开指定的相机。
3.指定网络或usb接口列表中没有的相机—— >返回-1001

1.7.9 TYOpenInterface()

该API可以打开指定的网络接口

1.如网卡MAC地址为:88-a4-c2-b1-35-e3(ipconfig /all查看)
2.Ip地址为:192.168.6.45(对应16进制的小端存储为2d06a8c0)
3.则指定网卡时需要写成“eth-88-a4-c2-b1-35-e32d06a8c0”(注意大小写,需要做区分)。

使用方法:

char* iface_id = "eth-88-a4-c2-b1-35-e32d06a8c0";
ASSERT_OK(TYOpenInterface(iface_id, &hIface));

验证方法:

1.网卡MAC地址大写,接口报错-1023
2.网卡ip地址错误,接口报错-1023

1.7.10 TYOpenDevice()

该API用于打开图漾相机,若相机能够正常打开,则API返回结果为0。其他返回结果均为异常
测试方法:

1.跨网段打开相机 ——> -1005
2.打开正在采集图像的相机——>网络(-1014),usb(-1005)
3.打开初始化错误的相机——> -1024

1.7.11 parse_firmware_errcode()

用于打印-1024错误对应的错误码
使用方法:

TY_FW_ERRORCODE err_code;
int32_t TYOpenDevice_err = ( TYOpenDevice(hIface, selectedDev.id, &hDevice ,&err_code) );
printf("TYOpenDevice_err %d\n", TYOpenDevice_err);
parse_firmware_errcode(err_code);

验证方法:

使用打开相机时报错-1024的相机进行验证。parse_firmware_errcode(err_code);打印的错误与错误码表征的一致

1.7.12 TYGetDeviceXMLSize()

SDK3.6.52版本上首次加入此API,用以获取相机xml文件的大小
使用方法:

uint32_t size;
TYGetDeviceXMLSize(hDevice, &size);
LOGD("XML size %d", size);  

验证方法:

将读取的值与fetch_config.xml文件大小进行比较,读取到的值应比fetch_config.xml多1个字节(结束符)

1.7.13 TYGetDeviceXML()

SDK3.6.52版本首次加入,用以获取相机的xml文件
使用方法:

uint32_t size;
ASSERT_OK(TYGetDeviceXMLSize(hDevice, &size));
LOGD("XML size %d", size);  
std::vector<char> xmlBuffer(size);
ASSERT_OK(TYGetDeviceXML(hDevice, xmlBuffer.data(),size,&size));

1.API内容全部打印的方法:

std::cout << std::string(xmlBuffer.data(), size) << std::endl;

2.打印指定行的内容:

int32_t lineCount = 0;
size_t start = 0;
size_t end = 0;
while (lineCount < 50 && end != std::string::npos) 
{
end = std::string(xmlBuffer.data(), size).find('\n', start);
if (end != std::string::npos) 
{
lineCount++;
if (lineCount == 49) 
{
std::string line(xmlBuffer.data() + start, end - start);
printf("The firmware version is: %s\n", line.c_str());
break;
}
start = end + 1;
}
}

验证方法:
将API获取的内容打印出来,与fetch_config.xml文件进行比对。

1.7.14 TYImageMode2

1.在TY_RESOLUTION_MODE_LIST中,没有对1024x768这个分辨率进行定义,故TY_IMAGE_MODE_DEPTH16_1024x768为未定义的标识符。
2.在这种情况下,则需要通过**TYImageMode2()**接口,构造一个参数。

使用方法:

   TY_IMAGE_MODE ImageMode = TYImageMode2(TY_PIXEL_FORMAT_DEPTH16, 1024, 736);
   ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEPTH_CAM, TY_ENUM_IMAGE_MODE, ImageMode));

用法不限于深度图分辨率,可以扩展到RGB和IR分辨率上

1.8 图像格式及分辨率测试

1.8.1 Depth图像支持的格式及分辨率

Depth图像格式具有depth16和xyz48两种格式,测试情况如下:
在这里插入图片描述

1.8.2 RGB图像支持的格式及分辨率

RGB具有多种图像格式,测试情况如下:
在这里插入图片描述

1.8.3 IR图像分辨率测试

IR具有多种图像格式,测试情况如下:
在这里插入图片描述

1.9 RGBD对齐测试

1.9.1图像对齐

图漾相机支持RGBD对齐,其中RGBD对齐分为Depth2RGB和RGB2Depth。
测试方法:
1.RGB2Depth

直接运行SimpleView_Registration,将相机固定后拍摄箱体,观察图像是否对齐。

2.Depth2RGB

修改宏:#define MAP_DEPTH_TO_COLOR 1后,运行SimpleView_Registration,将相机固定后拍摄箱体,观察图像是否对齐。

1.9.2 RGBD点云对齐测试

图漾SDK支持将相机输出的深度图和点云图做对齐后转化为点云数据。其中RGBD对齐分为Depth2RGB和RGB2Depth
测试方法:

1.RGB2Depth:直接运行SimpleView_Point3D,将相机固定后拍摄箱体,观察点云是否对齐。
2.Depth2RGB:运行SimpleView_Point3D -dep2rgb,将相机固定后拍摄箱体,观察点云是否对齐

1.9.3 视差参数

当RGB和DEPTH存在视差,导致RGBD对齐(rgb2dep)有大量黑洞或者存在错误匹配的情况,可适当调节此参数。文件位于include文件夹下的TYCoordinateMapper.h

在这里插入图片描述

delt值是用来过滤视差的,值越小,过滤越狠,会影响大斜面的对齐(RGB信息缺失)。
在这里插入图片描述

1.10 获取相机标定参数API

1.10.1 TY_STRUCT_CAM_INTRINSIC

获取相机内参API,可用于获取depth、color、ir_left、right_ir的内参。
使用方法:

TY_COMPONENT_ID componentID;
TY_FEATURE_ID featureID;
componentID = TY_COMPONENT_RGB_CAM;
featureID = TY_STRUCT_CAM_INTRINSIC;
TY_CAMERA_INTRINSIC intri;
ASSERT_OK(TYGetStruct(hDevice, componentID, featureID, &intri, sizeof(TY_CAMERA_INTRINSIC)));
LOGD("===%23s%f %f %f", "", intri.data[0], intri.data[1], intri.data[2]);
LOGD("===%23s%f %f %f", "", intri.data[3], intri.data[4], intri.data[5]);
LOGD("===%23s%f %f %f", "", intri.data[6], intri.data[7], intri.data[8]);

验证方法:

1.读取的内参与config文件中的一致,若分辨率与标定时使用的图像分辨率不一致,则等比例的进行放大和缩小。

TY_STRUCT_CAM_CALIB_DATA读取的内参与TY_STRUCT_CAM_INTRINSIC的内参区别
TY_STRUCT_CAM_CALIB_DATA内参是相机最大分辨率的内参
TY_STRUCT_CAM_INTRINSIC内参是相机当前分辨率的内参

1.10.2 TY_STRUCT_EXTRINSIC_TO_DEPTH

获取ir_right/rgb到左ir的外参。
使用方法:

TY_COMPONENT_ID componentID;
TY_FEATURE_ID featureID;
componentID = TY_COMPONENT_IR_CAM_RIGHT;
featureID = TY_STRUCT_EXTRINSIC_TO_DEPTH;
TY_CAMERA_EXTRINSIC extri;
ASSERT_OK(TYGetStruct(hDevice, componentID, featureID, &extri, sizeof(TY_CAMERA_EXTRINSIC)));
LOGD("===%23s%f %f %f %f", "", extri.data[0], extri.data[1], extri.data[2], extri.data[3]);
LOGD("===%23s%f %f %f %f", "", extri.data[4], extri.data[5], extri.data[6], extri.data[7]);
LOGD("===%23s%f %f %f %f", "", extri.data[8], extri.data[9], extri.data[10], extri.data[11]);
LOGD("===%23s%f %f %f %f", "", extri.data[12], extri.data[13], extri.data[14], extri.data[15]);

验证方法:

读取的参数与config中的一致,获取的参数不随分辨率切换而变化。

1.10.3 TY_STRUCT_CAM_DISTORTION

畸变参数,可用于rgb、ir_left、ir_right的畸变校正
使用方法:

TY_COMPONENT_ID componentID;
TY_FEATURE_ID featureID;
componentID = TY_COMPONENT_RGB_CAM;
featureID = TY_STRUCT_CAM_DISTORTION;
TY_CAMERA_DISTORTION dist;
ASSERT_OK(TYGetStruct(hDevice, componentID, featureID, &dist, sizeof(TY_CAMERA_DISTORTION)));
LOGD("===%23s%f %f %f %f", "", dist.data[0], dist.data[1], dist.data[2], dist.data[3]);
LOGD("===%23s%f %f %f %f", "", dist.data[4], dist.data[5], dist.data[6], dist.data[7]);
LOGD("===%23s%f %f %f %f", "", dist.data[8], dist.data[9], dist.data[10], dist.data[11]);

验证方法:

读取的参数与config中的一致,获取的参数不随分辨率切换而变化

1.10.4 TY_STRUCT_CAM_RECTIFIED_INTRI

获取校正后的ir_left/ir_right内参。
使用方法:

TY_COMPONENT_ID componentID;
TY_FEATURE_ID featureID;
componentID = TY_COMPONENT_IR_CAM_LEFT;
featureID = TY_STRUCT_CAM_RECTIFIED_INTRI;
TY_CAMERA_INTRINSIC intri;
ASSERT_OK(TYGetStruct(hDevice, componentID, featureID, &intri, sizeof(TY_CAMERA_INTRINSIC)));
LOGD("===%23s%f %f %f", "", intri.data[0], intri.data[1], intri.data[2]);
LOGD("===%23s%f %f %f", "", intri.data[3], intri.data[4], intri.data[5]);
LOGD("===%23s%f %f %f", "", intri.data[6], intri.data[7], intri.data[8]);

验证方法:

读取的参数与config中的一致

1.11 图像处理加速功能

开启OpenMP功能后,SDK运行时采用多核处理图像,CPU占用率高,处理图像快。
使用方法:
代码引用头文件“TYImageProc.h”并在代码中进行如下设置

TYImageProcesAcceEnable(true);
true:表示启用图像加速处理功能;false:表示不启用

验证方法:

在对齐程序中,打印做RGB畸变校正所花的时间,并观察上位机在运行对齐程序时的cpu占用率。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;