文章目录
- 前言
- 1.SDK API功能介绍
- 1.1 Device组件下的API测试
- 1.1.1 相机工作模式设置(TY_TRIGGER_PARAM_EX)
- 1.1.2 TY_INT_FRAME_PER_TRIGGER
- 1.1.3 TY_INT_PACKET_DELAY
- 1.1.4 TY_INT_PACKET_SIZE
- 1.1.5 TY_BOOL_GVSP_RESEND
- 1.1.6 TY_BOOL_TRIGGER_OUT_IO
- 1.1.7 TY_BOOL_KEEP_ALIVE_ONOFF
- 1.1.8 TY_INT_KEEP_ALIVE_TIMEOUT
- 1.1.9 TY_INT_TRIGGER_DELAY_US
- 1.1.10 TY_INT_TRIGGER_DURATION_US
- 1.1.11 TY_ENUM_STREAM_ASYNC
- 1.1.12 TY_INT_CAPTURE_TIME_US
- 1.1.13 TY_ENUM_TIME_SYNC_TYPE
- 1.1.14 TY_BOOL_TIME_SYNC_READY
- 1.1.15 TY_BOOL_CMOS_SYNC
- 1.1.16 TY_INT_ACCEPTABLE_PERCENT
- 1.1.17 TY_STRUCT_CAM_STATISTICS
- 1.1.18 IP设置
- 1.2 Laser组件下的API测试
- 1.3 Depth组件下的API测试
- 1.3.1 TY_FLOAT_SCALE_UNIT
- 1.3.2 TY_INT_SGBM_IMAGE_NUM
- 1.3.3 TY_INT_SGBM_DISPARITY_NUM
- 1.3.4 TY_INT_SGBM_DISPARITY_OFFSET
- 1.3.5 TY_INT_SGBM_MATCH_WIN_HEIGHT
- 1.3.6 TY_INT_SGBM_MATCH_WIN_WIDTH
- 1.3.7 TY_INT_SGBM_SEMI_PARAM_P1
- 1.3.8 TY_INT_SGBM_SEMI_PARAM_P1_SCALE
- 1.3.9 TY_INT_SGBM_SEMI_PARAM_P2
- 1.3.10 TY_INT_SGBM_UNIQUE_FACTOR
- 1.3.11 TY_INT_SGBM_UNIQUE_ABSDIFF
- 1.3.12 TY_BOOL_SGBM_HFILTER_HALF_WIN
- 1.3.13 TY_BOOL_SGBM_MEDFILTER
- 1.3.14 TY_INT_SGBM_MEDFILTER_THRESH
- 1.3.15 TY_BOOL_SGBM_LRC
- 1.3.16 TY_INT_SGBM_LRC_DIFF
- 1.3.17 TY_ENUM_DEPTH_QUALITY
- 1.3.18 TY_INT_TOF_MODULATION_THRESHOLD
- 1.3.19 TY_INT_TOF_JITTER_THRESHOLD
- 1.3.20 TY_INT_FILTER_THRESHOLD
- 1.3.21 TY_INT_TOF_CHANNEL
- 1.3.22 TY_INT_TOF_HDR_RATIO
- 1.3.23 TY_INT_TOF_ANTI_SUNLIGHT_INDEX
- 1.3.24 TY_INT_MAX_SPECKLE_DIFF
- 1.3.25 TY_INT_MAX_SPECKLE_SIZE
- 1.3.26 TY_BOOL_TOF_ANTI_INTERFERENCE
- 1.3.27 TY_ENUM_CONFIG_MODE
- 1.4 RGB组件下的API测试
- 1.4.1 TY_INT_ANALOG_GAIN
- 1.4.2 TY_INT_R_GAIN
- 1.4.3 TY_INT_G_GAIN
- 1.4.4 TY_INT_B_GAIN
- 1.4.5 TY_INT_EXPOSURE_TIME
- 1.4.6 TY_INT_AE_TARGET_Y
- 1.4.7 TY_STRUCT_AEC_ROI
- 1.4.8 TY_BOOL_AUTO_EXPOSURE
- 1.4.9 TY_BOOL_AUTO_AWB
- 1.4.10 AUTO_ISP
- 1.5 IR组件下的API测试
- 1.6 Storage组件下的API测试
- 1.7 其他常用API测试
- 1.7.1 TYHasFeature()
- 1.7.2 TYGetFeatureInfo()
- 1.7.3 TYGetDeviceFeatureNumber()
- 1.7.4 TYGetDeviceFeatureInfo()
- 1.7.5 write_parameters_to_storage()
- 1.7.6 load_parameters_from_storage()
- 1.7.7 clear_storage()
- 1.7.8 selectDevice()
- 1.7.9 TYOpenInterface()
- 1.7.10 TYOpenDevice()
- 1.7.11 parse_firmware_errcode()
- 1.7.12 TYGetDeviceXMLSize()
- 1.7.13 TYGetDeviceXML()
- 1.7.14 TYImageMode2
- 1.8 图像格式及分辨率测试
- 1.9 RGBD对齐测试
- 1.10 获取相机标定参数API
前言
请参考图漾官网的在线文档: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*)¶m, 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_HEIGHT和TY_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_SaveLoadConfig或SaveLoadConfig_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占用率。