图漾相机——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.…...

【性能优化专题系列】利用CompletableFuture优化多接口调用场景下的性能
背景说明 在实际的软件开发中,我们经常会遇到需要批量调用接口的场景。例如,电商系统在生成商品详情页时,需要同时调用多个服务接口来获取商品的基本信息、库存信息、价格信息、用户评价等。 传统的依次调用方式存在性能问题 面对上述场景…...

docker安装emqx
emqx安装 拉取emqx镜像 docker pull emqx/emqx:v4.1.0 运行docker容器 docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.1.0 放行端口 1、如果要是自己的虚拟机,并且关闭了防火墙&a…...

DeepSeek超越ChatGPT的能力及部分核心原理
DeepSeek超越ChatGPT的能力及部分核心原理 目录 DeepSeek超越ChatGPT的能力及部分核心原理超越ChatGPT的能力核心原理超越ChatGPT的能力 推理计算能力更强:在复杂的数学计算、法律文件审查等任务中,DeepSeek的推理能力可媲美甚至超越部分国际顶尖AI模型,包括ChatGPT。例如在…...

Leetcode 3434. Maximum Frequency After Subarray Operation
Leetcode 3434. Maximum Frequency After Subarray Operation 1. 解题思路2. 代码实现 题目链接:3434. Maximum Frequency After Subarray Operation 1. 解题思路 这一题的话我们只需要考察所有的数 i i i转换为 k k k时所能够形成的最大的值。 而对于这个问题&…...

《DeepSeek-R1 问世,智能搜索领域迎来新变革》
DeepSeek-R1是由DeepSeek公司开发的一款创新型人工智能模型,自2024年5月7日发布以来,迅速在AI领域引起广泛关注。该模型凭借其卓越的语言理解能力、高效的数据处理能力、自适应学习能力、高安全性与可靠性以及广泛的应用场景与拓展性,在众多人…...

GEE | 植被总初级生产力GPP的时间变化特征
同学们好,这期我们分享的是植被总初级生产力GPP的日、月、生长季和年变化趋势代码。我们选用的数据集是MODIS/061/MOD17A2HGF,该产品时间跨度为2000-至今,空间分辨率500米,时间分辨率8天。 其中我们把生长季时间设置为了5-9月份&…...

安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】
一、实验目的(如果代码有错漏,可查看源码) 1.熟悉广播机制的实现流程。 2.掌握广播接收者的创建方式。 3.掌握广播的类型以及自定义官博的创建。 二、实验条件 熟悉广播机制、广播接收者的概念、广播接收者的创建方式、自定广播实现方式以及有…...

本地部署DeepSeek
1、打开ollama,点击“Download” Ollamahttps://ollama.com/ 2、下载完成后,安装ollama.exe 3、安装完成后,按"windowsR",输入"cmd” 4、输入“ollama -v”,查看版本,表示安装成功 5、返回ollama网页,…...

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。
佬们过年好呀~新年第一篇博客让我们来场赛博算命吧! 更多文章:个人主页 系列文章:JAVA专栏 欢迎各位大佬来访哦~互三必回!!! 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…...

Hive:窗口函数(1)
窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上…...

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)
一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像到…...

基于PLC的变频调速系统设计
摘要 现代科技发展迅速,特别是通讯技术的发展,工业现场提供了便捷的数据交互和控制的手段,将工业现场的仪表、驱动器、控制器以及上位机之间进行通讯连接,进行相互信息交互,数据准确高效的传送,并且对现场的…...

鸿蒙开发在onPageShow中数据加载不完整的问题分析与解决
API Version 12 1、onPageShow()作什么的 首先说明下几个前端接口的区别: ArkUI-X的aboutToAppear()接口是一个生命周期接口,用于在页面即将显示之前调用。 在ArkUI-X中,aboutToAppear()接口是一个重要的生命周期接口,它会在页…...

本地搭建deepseek-r1
一、下载ollama(官网下载比较慢,可以找个网盘资源下) 二、安装ollama 三、打开cmd,拉取模型deepseek-r1:14b(根据显存大小选择模型大小) ollama pull deepseek-r1:14b 四、运行模型 ollama run deepseek-r1:14b 五、使用网页api访问&#x…...

【数据结构与算法】AVL树的插入与删除实现详解
文章目录 前言Ⅰ. AVL树的定义Ⅱ. AVL树节点的定义Ⅲ. AVL树的插入Insert一、节点的插入二、插入的旋转① 新节点插入较高左子树的左侧(左左):右单旋② 新节点插入较高右子树的右侧(右右):左单旋③ 新节点插…...
【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
一、使用pytorch框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量,方便后续在模型中…...

unity学习23:场景scene相关,场景信息,场景跳转
目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景,在构建中包含的场景 (否则会认为是失效的Scene) 2.4 Scenes in Bui…...

AI(计算机视觉)自学路线
本文仅用来记录一下自学路线方便日后复习,如果对你自学有帮助的话也很开心o(* ̄▽ ̄*)ブ B站吴恩达机器学习->B站小土堆pytorch基础学习->opencv相关知识(Halcon或者opencv库)->四类神经网络(这里跟…...

Linux第104步_基于AP3216C之I2C实验
Linux之I2C实验是在AP3216C的基础上实现的,进一步熟悉修改设备树和编译设备树,以及学习如何编写I2C驱动和APP测试程序。 1、AP3216C的原理图 AP3216C集成了一个光强传感器ALS,一个接近传感器PS和一个红外LED,为三合一的环境传感…...

常用Android模拟器(雷电 MuMu 夜神 Genymotion 蓝叠) - 20250131
常用Android模拟器(雷电 MuMu 夜神 Genymotion 蓝叠) - 20250131 Android模拟器概述 Android 模拟器是一种软件工具,允许用户在 Windows、Linux 或 macOS 电脑上运行 Android 操作系统,以模拟 Android 设备的行为。它广泛用于 开发测试、应用运行、游戏…...

算法题(53):对称二叉树
审题: 需要我们判断二叉树是否满足对称结构,并返回判断结果 思路: 方法一:递归 其实是否对称分成两部分判断 第一部分:根节点是否相等 第二部分:根节点一的左子树和根节点二的右子树是否相等,根…...

Golang 并发机制-2:Golang Goroutine 和竞争条件
在今天的软件开发中,我们正在使用并发的概念,它允许一次执行多个任务。在Go编程中,理解Go例程是至关重要的。本文试图详细解释什么是例程,它们有多轻,通过简单地使用“go”关键字创建它们,以及可能出现的竞…...

深入剖析 CSRF 漏洞:原理、危害案例与防护
目录 前言 漏洞介绍 漏洞原理 产生条件 产生的危害 靶场练习 post 请求csrf案例 防御措施 验证请求来源 设置 SameSite 属性 双重提交 Cookie 结语 前言 在网络安全领域,各类漏洞层出不穷,时刻威胁着用户的隐私与数据安全。跨站请求伪造&…...

C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库
用C实现高性能数据处理,Python实现操作Redshift导入数据文件。 在Visual Studio 2022中用C和ODBC API导出SQL Server数据库中张表中的所有表的数据为CSV文件格式的数据流,用逗号作为分隔符,用双引号包裹每个数据,字符串类型的数据…...

AI大模型开发原理篇-5:循环神经网络RNN
神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单,窗口大小固定,缺乏长距离依赖捕捉,训练效率低,词汇表固定等。为了解决这些问题,研究人员提出了一些更先进的神经网络语言模型,如循环神经网络、…...

4-图像梯度计算
文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…...

数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...

DDD - 领域事件_解耦微服务的关键
文章目录 Pre领域事件的核心概念领域事件的作用领域事件的识别领域事件的技术实现领域事件的运行机制案例领域事件驱动的优势 Pre DDD - 微服务设计与领域驱动设计实战(中)_ 解决微服务拆分难题 EDA - Spring Boot构建基于事件驱动的消息系统 领域事件的核心概念 领域事件&a…...

芯片AI深度实战:实战篇之vim chat
利用vim-ollama这个vim插件,可以在vim内和本地大模型聊天。 系列文章: 芯片AI深度实战:基础篇之Ollama-CSDN博客 芯片AI深度实战:基础篇之langchain-CSDN博客 芯片AI深度实战:实战篇之vim chat-CSDN博客 芯片AI深度…...