图漾相机——C++语言属性设置
文章目录
- 前言
- 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.2.1 TY_BOOL_LASER_AUTO_CTRL
- 1.2.2 TY_INT_LASER_POWER
- 1.2.3 TY_BOOL_IR_FLASHLIGHT
- 1.2.4 TY_BOOL_RGB_FLASHLIGHT
- 1.2.5 TY_INT_IR_FLASHLIGHT_INTENSITY
- 1.2.6 TY_INT_RGB_FLASHLIGHT_INTENSITY
- 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.5.1 TY_INT_EXPOSURE_TIME
- 1.5.2 TY_INT_ANALOG_GAIN
- 1.5.3 TY_INT_GAIN
- 1.5.4 TY_BOOL_UNDISTORTION
- 1.5.5 TY_BOOL_HDR
- 1.5.6 TY_BYTEARRAY_HDR_PARAMETER
- 1.6 Storage组件下的API测试
- 1.6.1 TY_BYTEARRAY_CUSTOM_BLOCK
- 1.6.2 TY_BYTEARRAY_ISP_BLOCK
- 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.8.1 Depth图像支持的格式及分辨率
- 1.8.2 RGB图像支持的格式及分辨率
- 1.8.3 IR图像分辨率测试
- 1.9 RGBD对齐测试
- 1.9.1图像对齐
- 1.9.2 RGBD点云对齐测试
- 1.9.3 视差参数
- 1.10 获取相机标定参数API
- 1.10.1 TY_STRUCT_CAM_INTRINSIC
- 1.10.2 TY_STRUCT_EXTRINSIC_TO_DEPTH
- 1.10.3 TY_STRUCT_CAM_DISTORTION
- 1.10.4 TY_STRUCT_CAM_RECTIFIED_INTRI
- 1.11 图像处理加速功能
前言
请参考图漾官网的在线文档: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占用率。
相关文章:
图漾相机——C++语言属性设置
文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置(TY_TRIGGER_PARAM_EX)1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…...
解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题
macOS 系统中如何开启“任何来源”以解决安装报错问题? 大家好!今天我们来聊聊在使用 macOS 系统 时,遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时,因为 macOS 会默认阻止不明开发者的…...
网站快速收录:利用网站评论系统增加曝光
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/40.html 利用网站评论系统增加曝光,是提升网站快速收录的有效途径之一。以下是一些详细策略,旨在通过优化和利用评论系统来增强网站的可见性和互动性: 一…...
实验十 Servlet(一)
实验十 Servlet(一) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 1、参考课堂例子,客户端通过login.jsp发出登录请求,请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功,…...
MyBatis-Plus笔记-快速入门
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...
Node.js MySQL:深度解析与最佳实践
Node.js MySQL:深度解析与最佳实践 引言 Node.js作为一种流行的JavaScript运行时环境,以其轻量级、高性能和事件驱动模型受到开发者的青睐。MySQL则是一款功能强大的关系型数据库管理系统,广泛应用于各种规模的应用程序中。本文将深入探讨Node.js与MySQL的集成,分析其优势…...
《超自然》:科学与灵性融合的自我转变之路
在现代社会中,许多人开始探寻自我成长、身心疗愈与灵性提升的可能性。Bestselling author Dr. Joe Dispenza 的《超自然:普通人如何创造非凡人生》正是在这样的大背景下问世的。书中既融合了量子物理、神经科学和表观遗传学的前沿理论,又吸收…...
JAVA内置类使用方法记录
Array数组 普通数组是基本类型,例如int[] 就像是;一个装着元素排列整齐的盒子,他没有size(),length()等方法,但是存在length属性。 Array.sort() 这是专门排序数组的方法,但是前提是你必须给数组存储的元素…...
《Origin画百图》之脊线图
1.数据准备:将数据设置为y 2.选择绘图>统计图>脊线图 3.生成基础图形,并不好看,接下来对图形属性进行设置 4.双击图形>选择图案>颜色选择按点>Y值 5.这里发现颜色有色阶,过度并不平滑,需要对色阶进行更…...
w189电商平台的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
c++ string类 +底层模拟实现
提醒: 本片博客只是小编的听课笔记,介意勿看。 基础 包含在头文件<string>,才能使用string类似函数接口。 string常见构造类 string s1; cin>>s1;//无参构造 string s2(s1);//拷贝构造 string s1("jfksa");//传参构造 三种…...
让banner.txt可以自动读取项目版本
文章目录 1.sunrays-dependencies1.配置插件2.pluginManagement统一指定版本 2.common-log4j2-starter1.banner.txt使用$ 符号取出2.查看效果 1.sunrays-dependencies 1.配置插件 <!-- 为了让banner.txt自动获取版本号 --><plugin><groupId>org.apache.mave…...
深度解析:网站快速收录与网站安全性的关系
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/58.html 网站快速收录与网站安全性之间存在着密切的关系。以下是对这一关系的深度解析: 一、网站安全性对收录的影响 搜索引擎惩罚: 如果一个网站存在安全隐患&am…...
96,【4】 buuctf web [BJDCTF2020]EzPHP
进入靶场 查看源代码 GFXEIM3YFZYGQ4A 一看就是编码后的 1nD3x.php 访问 得到源代码 <?php // 高亮显示当前 PHP 文件的源代码,用于调试或展示代码结构 highlight_file(__FILE__); // 关闭所有 PHP 错误报告,防止错误信息泄露可能的安全漏洞 erro…...
个人笔记(很没营养,纯备忘录)
1.输入电阻和输出电阻指在一个可划分为3部分的电路中,中间部分电路相当于前面电路的负载有输入端电阻,称输入电阻,相对于后面部分等效为电源有输出端内阻,称输出电阻 理所当然的希望输出电阻对负载影响小,输入电阻能完…...
基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
音视频多媒体编解码器基础-codec
如果要从事编解码多媒体的工作,需要准备哪些更为基础的内容,这里帮你总结完。 因为数据类型不同所以编解码算法不同,分为图像、视频和音频三大类;因为流程不同,可以分为编码和解码两部分;因为编码器实现不…...
小白零基础--CPP多线程
进程 进程就是运行中的程序线程进程中的进程 1、C11 Thread线程库基础 #include <iostream> #include <thread> #include<string>void printthread(std::string msg){std::cout<<msg<<std::endl;for (int i 0; i < 1000; i){std::cout<…...
Java线程认识和Object的一些方法ObjectMonitor
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 要对Java线程有整体了解,深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor,这有助于后面的Synchron…...
LeetCode:300.最长递增子序列
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:300.最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由…...
pytorch实现长短期记忆网络 (LSTM)
人工智能例子汇总:AI常见的算法和例子-CSDN博客 LSTM 通过 记忆单元(cell) 和 三个门控机制(遗忘门、输入门、输出门)来控制信息流: 记忆单元(Cell State) 负责存储长期信息&…...
AI学习指南HuggingFace篇-模型部署与推理
一、引言 将训练好的模型部署为API并实现推理是将AI模型应用于实际场景的关键步骤。Hugging Face提供了多种工具和框架,支持快速部署和优化模型推理。本文将介绍如何将Hugging Face模型部署为API,探讨模型部署的常见方法和优化技巧,帮助读者将模型应用于实际场景。 二、模型…...
Games104——引擎工具链高级概念与应用
世界编辑器 其实是一个平台(hub),集合了所有能够制作地形世界的逻辑 editor viewport:可以说是游戏引擎的特殊视角,会有部分editor only的代码(不小心开放就会变成外挂入口)Editable Object&…...
【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点
学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…...
消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347
消息队列 使用信号量、事件标志组和线标志进行任务同步时,只能提供同步的时刻信息,无法在任务之间进行数据传输。要实现任务间的数据传输,一般使用两种方式: 1. 全局变量 在 RTOS 中使用全局变量时,必须保证每个任务…...
Hive之数据定义DDL
Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …...
ROS-SLAM
基本概念 SLAM 即 Simultaneous Localization and Mapping,中文名为同时定位与地图构建,是机器人、自动驾驶、增强现实等领域中的关键技术。 在未知环境中,搭载特定传感器的主体(如机器人、无人机等)在运动过程中&am…...
网络攻防实战指北专栏讲解大纲与网络安全法
专栏 本专栏为网络攻防实战指北,大纲如下所示 进度:目前已更完准备篇、HTML基础 计划:所谓基础不牢,地动山摇。所以下一步将持续更新基础篇内容 讲解信息安全时,结合《中华人民共和国网络安全法》(以下简…...
Spark的基本概念
个人博客地址:Spark的基本概念 | 一张假钞的真实世界 编程接口 RDD:弹性分布式数据集(Resilient Distributed Dataset )。Spark2.0之前的编程接口。Spark2.0之后以不再推荐使用,而是被Dataset替代。Datasetÿ…...
效用曲线的三个实例
效用曲线的三个实例 文章目录 效用曲线的三个实例什么是效用曲线风险与回报:投资决策消费选择:价格与质量的平衡程序员绩效评估:准时与程序正确性 分析- 风险与回报:投资决策分析- 消费选择:价格与质量的平衡- 程序员绩…...
