圖漾相機——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*)&param, sizeof(param)));

注意:TY_TRIGGER_MODE_M_SIG和TY_TRIGGER_MODE_M_PER固件版本需大于3.13.68,否則使用TY_TRIGGER_PARAM進行設置

TY_TRIGGER_MODE_SIG:工作模式18,已棄用
TY_TRIGGER_MODE_PER:工作模式19,已棄用
TY_TRIGGER_MODE_TIMER_LIST:列表觸發模式,定制功能,普通產品不建議使用

根據設置的觸發開始時間(start_time_us)、每兩幀的時間間隔數組(offset_us_list[])和觸發次數(offset_us_count),相機定時采集(1 +offset_us_count)幀圖像并輸出圖像數據。啟用此?作模式要求相機先啟動 PTP 對時,且 offset_us_count≤ 50。

設置方法如下:

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

TY_TRIGGER_MODE_TIMER_PERIOD:周期觸發模式,定制功能,不建議使用

根據設置的觸發開始時間(start_time_us)、觸發次數(trigger_count)和觸發時間間隔(peroid_us),相機每間隔
peroid_us 采集?幀圖像,共采集 trigger_count 幀圖像并輸出圖像數據。
此工作模式要求相機先啟動 PTP 對時

設置方法如下:

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

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

在此工作模式下,相機接收到軟觸發/硬觸發信號后,輸出一幀深度圖像和左ir圖像(帶泛光)。同時在OutPut引腳輸出觸發信號。

設置方法如下:

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

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

在此工作模式下,相機按照特定的幀率,輸出一幀深度圖像和左ir圖像(帶泛光)。同時在OutPut引腳輸出觸發信號。

設置方法如下:

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

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

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

1.1.2 TY_INT_FRAME_PER_TRIGGER

該功能可以設置相機在接收到一次軟觸發/硬觸發后的出圖數量,相機默認接收一次信號后只出一幀圖像,此功能不建議使用。

設置方法如下:

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

驗證方法:

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

一次觸發后,上位機只可以拿到2幀圖像。

1.1.3 TY_INT_PACKET_DELAY

該功能用于設置相機數據包傳輸時包與包之間延遲時間,用于網絡環境不理想的情況下。

設置方法:

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

驗證方法:

觀察相機幀率,TY_INT_PACKET_DELAY越大,相機幀率越低

1.1.4 TY_INT_PACKET_SIZE

該功能用于設置相機數據包的大小,用于網絡環境不理想的情況下
設置方法:

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

驗證方法:

觀察相機幀率,TY_INT_PACKET_SIZE越小,相機幀率越低。

1.1.5 TY_BOOL_GVSP_RESEND

網絡相機圖像重傳功能

設置方法

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

驗證方法:

網絡相機默認為未開啟,圖像重傳模式(False),設置為True以后,開啟重傳,有效減少上位機無法獲取到圖像的概率。

在這里插入圖片描述
不設置丟包重傳會導致會存在如下常見問題:

1.Percipioview的連續模式可以正常取圖,SDK打開后無法取圖
2.連續模式的幀率與percipioview不一致
3.觸發取圖沒有圖像返回

1.1.6 TY_BOOL_TRIGGER_OUT_IO

該功能用于反轉trigger_out的輸出電平
設置方法:

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

驗證方法:
相機進行trigger供電后,將示波器探頭接在相機trigger_out引腳上

TY_BOOL_TRIGGER_OUT_IO = true;電平反轉
TY_BOOL_TRIGGER_OUT_IO = false;電平不反轉

1.1.7 TY_BOOL_KEEP_ALIVE_ONOFF

SDK 與相機維持通信狀態保持機制,默認為 true。表示通訊保持。
設置方法:

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

驗證方法:

將此屬性設置為false后,運行相機,以“ctrl+c”的方式異常終止SDK采圖,相機激光器常亮,SDK無法再次打開相機

1.1.8 TY_INT_KEEP_ALIVE_TIMEOUT

SDK與相機維持通信狀態保持時間,usb默認15000ms,網絡相機默認3000ms。單位:ms
設置方法

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

驗證方法

運行相機,以“ctrl+c”的方式異常終止SDK采圖,相機激光器在常亮30000ms后熄滅

1.1.9 TY_INT_TRIGGER_DELAY_US

軟/硬觸發延遲時間設置。相機在收到硬觸發信號后,延遲一段時間后出圖。單位:us
設置方法:

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

驗證方法:

設置后,相機在收到硬觸發信號后,延遲 1300000us(1.3s)后出圖

1.1.10 TY_INT_TRIGGER_DURATION_US

輸出信號的電平保持時間,單位:us
設置方法:

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

驗證方法:

1.相機進行trigger供電后,將示波器探頭接在相機trigger_out引腳上。
2.設置相機工作模式為:TY_TRIGGER_MODE_M_SIG
對于輸出默認為高電平的相機,則信號低電平保持時間為100000us;
對于輸出默認為低電平的相機,則信號高電平保持時間為100000us

注意:很少使用

1.1.11 TY_ENUM_STREAM_ASYNC

數據流異步功能
TY_STREAM_ASYNC_OFF:數據流同步 TY_STREAM_ASYNC_DEPTH:depth數據流異步
TY_STREAM_ASYNC_RGB:RGB數據流異步 TY_STREAM_ASYNC_DEPTH_RGB:depth和RGB數據流異步
TY_STREAM_ASYNC_ALL:所有數據流都異步

設置方法

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

驗證方法

觀察程序運行log,以TY_STREAM_ASYNC_RGB為例,上位機先拿到一幀RGB圖像,然后拿到一幀depth和ir圖。depth和ir的時間戳一致,RGB的時間戳與depth和ir的不一致,根據使用的相機或早或晚的情況都存在。但是同一臺相機不會出現有早有晚的情況。

1.1.12 TY_INT_CAPTURE_TIME_US

讀取深度計算的時間,僅適用于觸發模式下,單位us 自由采集模式下,讀取的深度計算時間為0。
使用方法:

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

驗證方法:

與開發描述的深度計算時間統一

1.1.13 TY_ENUM_TIME_SYNC_TYPE

相機的對時功能

TY_TIME_SYNC_TYPE_NONE:不進行對時。 TY_TIME_SYNC_TYPE_HOST:相機與上位機對時
TY_TIME_SYNC_TYPE_NTP:相機與NTP服務器對時 TY_TIME_SYNC_TYPE_PTP:相機與PTP服務器對時
TY_TIME_SYNC_TYPE_CAN:相機與can網絡對時,僅定制相機支持
TY_TIME_SYNC_TYPE_PTP_MASTER:設置相機為PTP服務器

設置方法:

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

驗證方法:

TY_TIME_SYNC_TYPE_NONE:圖像時間戳位數較短 。
TY_TIME_SYNC_TYPE_HOST:圖像時間戳與上位機一致,修改上位機時間后,相機時間戳自動發生變化 。
TY_TIME_SYNC_TYPE_NTP:圖像時間戳與NTP服務器一致,修改上位機時間后,時間戳不會發生變化。
TY_TIME_SYNC_TYPE_PTP:圖像時間戳與PTP服務器一致,定制功能,不建議使用。
TY_TIME_SYNC_TYPE_CAN:圖像時間戳與can網絡服務器一致,定制相機,不建議使用。
TY_TIME_SYNC_TYPE_PTP_MASTER:相機自身作為PTP服務器,其他相機可以與其進行對時,定制功能,不建議使用。

對于NTP對時,需要額外驗證指定服務器ip后的對時情況。
方法如下:

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

1.1.14 TY_BOOL_TIME_SYNC_READY

對時是否成功判斷API
使用方法:

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

驗證方法:

設置相機為NTP對時,每隔1s打印一次對時是否成功的狀態。
當對時尚未成功時,返回結果為false。
當對時成功時,返回結果為true。

1.1.15 TY_BOOL_CMOS_SYNC

左右ir異步曝光開關。true:同步曝光;false:異步曝光
設置方法:

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

驗證方法:

使用FM851-E2相機,對比開啟和關閉TY_BOOL_CMOS_SYNC后,深度圖像的幀率, TY_BOOL_CMOS_SYNC =false時幀率比TY_BOOL_CMOS_SYNC = true時高。

1.1.16 TY_INT_ACCEPTABLE_PERCENT

網絡數據包丟包容忍度,上位機接收到的圖像數據包百分比低于此閾值的圖像將被丟棄, 單位:%
設置方法:

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

驗證方法:

關閉網絡重傳后,將TY_INT_ACCEPTABLE_PERCENT設置成較小的數值時,在一臺電腦上運行多臺相機,觀察各個相機的輸出圖像。當此值較小時,上位機將收到破損的圖像(如:RGB上有大面積的綠色)

1.1.17 TY_STRUCT_CAM_STATISTICS

獲取網絡相機的傳圖情況。
設置方法:

TY_CAMERA_STATISTICS st;ASSERT_OK( TYGetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_CAM_STATISTICS, &st, sizeof(st)) );LOGI("Statistics:");LOGI("  packetReceived: %" PRIu64 " ", st.packetReceived);LOGI("  packetLost    : %" PRIu64 " ", st.packetLost);LOGI("  imageOutputed : %" PRIu64 " ", st.imageOutputed);LOGI("  imageDropped  : %" PRIu64 " ", st.imageDropped);

驗證方法:

packetReceived:上位機共收到的數據包數量
packetLost:上位機共未收到的數據包數量
imageOutputed:上位機收到的圖像數量(與數據流個數成整倍數關系)
imageDropped:上位機總的未收到的圖像數量

1.1.18 IP設置

ip設置涉及3個API:

IP設置API:TY_INT_PERSISTENT_IP
子網掩碼設置API:TY_INT_PERSISTENT_SUBMASK
網關設置API:TY_INT_PERSISTENT_GATEWAY

驗證方法:

1.使用ForceDeviceIP設置合法的ip地址(動態、靜態、臨時ip)
2.使用ForceDeviceIP設置非法的ip地址(動態、靜態、臨時ip),設置靜態ip后,相機上電重啟,ip保持不變。可以在進行跨網段發現及跨網清除ip。

1.2 Laser組件下的API測試

1.2.1 TY_BOOL_LASER_AUTO_CTRL

激光自動控制開關

并不是根據光線亮度,自動調整激光器的亮度的意思!!!

設置方法:

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

驗證方法:

1.對于主動雙目結構光相機:
TY_BOOL_LASER_AUTO_CTRL=false時,出任意數據流,只要laser_power≠0,激光器都被點亮,ir為散斑圖。
TY_BOOL_LASER_AUTO_CTRL = true時,只有出深度時,激光器才被點亮,ir出sobel圖。

2.對于主動雙目條紋光相機:
TY_BOOL_LASER_AUTO_CTRL =false時,出任意數據流,只要laser_power≠0,條紋光投射器都將被點亮。
TY_BOOL_LASER_AUTO_CTRL = true時,只有出深度時,條紋光投射器才會被點亮。

1.2.2 TY_INT_LASER_POWER

用于設置激光/條紋光投射器光源強度
設置方法:

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

驗證方法:

TY_INT_LASER_POWER值越大,激光/條紋光投射器投射的光越亮

1.2.3 TY_BOOL_IR_FLASHLIGHT

用于開啟IR的泛光燈源(FM855-E1-G)
設置方法:

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

驗證方法:

將此屬性設置為true以后,ir的泛光燈源被點亮 。
ir泛光燈源與RGB泛光燈源、激光器不可同時被點亮。
當相機出深度圖時,ir泛光燈不可被點亮。

1.2.4 TY_BOOL_RGB_FLASHLIGHT

用于開啟RGB的泛光燈源(FM855-E1-G)
設置方法:

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

驗證方法:

將此屬性設置為true以后,RGB的泛光燈源被點亮。

1.2.5 TY_INT_IR_FLASHLIGHT_INTENSITY

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

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

驗證方法:

開啟IR泛光后,設置的強度越大,燈越亮,IR圖像越亮。

1.2.6 TY_INT_RGB_FLASHLIGHT_INTENSITY

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

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

驗證方法:

開啟RGB泛光后,設置的強度越大,燈越亮,RGB圖像越亮。

1.3 Depth組件下的API測試

1.3.1 TY_FLOAT_SCALE_UNIT

深度數值單位
設置方法:

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

驗證方法:

設置后,鼠標點擊深度圖,觀察程序打印的深度值單位。如設置為0.25,則深度值為1000.5, 1000.8(打印數據精度的問題)

1.3.2 TY_INT_SGBM_IMAGE_NUM

SGBM計算深度時需要的ir圖像數量
設置方法:

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

驗證方法:

改變TY_INT_SGBM_IMAGE_NUM值,深度有效像素有明顯差異,該參數越小,幀率越高

1.3.3 TY_INT_SGBM_DISPARITY_NUM

SGBM計算深度時的視差搜索范圍
設置方法:

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

驗證方法:

改變TY_INT_SGBM_DISPARITY_NUM值,深度有效像素有明顯差異

1.3.4 TY_INT_SGBM_DISPARITY_OFFSET

SGBM計算深度時開始搜索的視差值
設置方法:

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

驗證方法:

改變TY_INT_SGBM_DISPARITY_OFFSET值,深度有效像素有明顯差異

1.3.5 TY_INT_SGBM_MATCH_WIN_HEIGHT

SGBM計算深度時匹配窗口的高
設置方法:

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

驗證方法:

改變TY_INT_SGBM_MATCH_WIN_HEIGHT值,深度有效像素有明顯差異。
TY_INT_SGBM_MATCH_WIN_HEIGHTTY_INT_SGBM_IMAGE_NUM存在約束關系,約束關系以相機config文件中的約束為準。

1.3.6 TY_INT_SGBM_MATCH_WIN_WIDTH

SGBM計算深度時匹配窗口的高
設置方法:

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

驗證方法:

改變TY_INT_SGBM_MATCH_WIN_WIDTH值,深度有效像素有明顯差異

1.3.7 TY_INT_SGBM_SEMI_PARAM_P1

相鄰像素 (+/-1) 約束懲罰參數
設置方法:

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

驗證方法:

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

1.3.8 TY_INT_SGBM_SEMI_PARAM_P1_SCALE

相鄰像素 (+/-1) 約束懲罰參數 P1_scale
設置方法:

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

驗證方法:

P1_Scale參數越大,深度黑洞越多

1.3.9 TY_INT_SGBM_SEMI_PARAM_P2

周圍像素約束懲罰參數 P2
設置方法:

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

驗證方法:

調整P2,深度圖有效像素及深度效果有明顯變化

1.3.10 TY_INT_SGBM_UNIQUE_FACTOR

唯一性檢查參數 2,即最優與次優匹配點的差值
設置方法:

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

驗證方法:

唯一性百分比參數越大,深度黑洞越多

1.3.11 TY_INT_SGBM_UNIQUE_ABSDIFF

唯一性檢查參數 1,即最優與次優匹配點的百分比
設置方法:

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

驗證方法:

唯一性差值參數越大,深度黑洞越多

1.3.12 TY_BOOL_SGBM_HFILTER_HALF_WIN

搜索濾波開關。用于進一步優化深度圖,去除噪聲和不連續性,對物體邊緣點云更友好
設置方法:

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

驗證方法:

關閉搜索濾波后,深度黑洞變少,錯誤匹配點增多

1.3.13 TY_BOOL_SGBM_MEDFILTER

中值濾波開關,用于消除孤立的噪聲點,同時盡可能地保留圖像的邊緣信息
設置方法:

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

驗證方法:

開啟中值濾波后,平面擬合的均方根誤差變小(可以用PV進行輔證)

1.3.14 TY_INT_SGBM_MEDFILTER_THRESH

中值濾波閾值。設定值越大,過濾的噪點越多,但也可能會導致深度圖的細節信息丟失
設置方法:

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

驗證方法:

開啟中值濾波后,中值濾波閾值參數越大,平面擬合的均方根誤差越小(可以用PV進行輔證)

1.3.15 TY_BOOL_SGBM_LRC

左右一致性檢查開關
設置方法:

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

驗證方法:
關閉左右一致性檢查后,錯誤匹配點變多

1.3.16 TY_INT_SGBM_LRC_DIFF

中值濾波閾值。設定值越大,過濾的噪點越多,但也可能會導致深度圖的細節信息丟失
設置方法:

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

驗證方法:

開啟左右一致性檢查后,一致性檢查參數越大,錯誤匹配點越多

1.3.17 TY_ENUM_DEPTH_QUALITY

tof相機的深度圖像質量
設置方法:

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

驗證方法:

比較不同的圖像質量下,深度圖的幀率

1.3.18 TY_INT_TOF_MODULATION_THRESHOLD

tof深度相機接收激光調制光強的閾值,小于此閾值的像素點不參與計算深度,即像素點的深度值賦值為0
設置方法:

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

驗證方法:

參數越大,深度有效像素百分比越低

1.3.19 TY_INT_TOF_JITTER_THRESHOLD

tof 深度相機抖動過濾閾值,閾值設置值越大,深度圖邊緣抖動的深度數據過濾得越少
設置方法:

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

驗證方法:

參數越小,深度有效像素百分比越低

1.3.20 TY_INT_FILTER_THRESHOLD

tof 深度相機飛點濾波閾值,默認值為 0,即不加濾波。濾波閾值設置越小,過濾的飛點越多
設置方法:

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

驗證方法:

參數越小,深度有效像素百分比越低

1.3.21 TY_INT_TOF_CHANNEL

tof 深度相機調制頻道。 不同調制頻道的調制頻率不同,互不干擾。 如需在同一場景運行多臺 tof 深度相機,首先需確保同系列相機的調制頻道不同

設置方法

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

驗證方法

1.多臺相機使用相同的頻率進行對射制造多相機干擾現象;(多相機深度異常)
2.多臺相機使用不同的頻率進行對射制造多相機干擾現象;(多相機深度不受干擾)

1.3.22 TY_INT_TOF_HDR_RATIO

高動態范圍比閾值,需在TY_ENUM_DEPTH_QUALITY=HIGH模式下使用
設置方法:

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

驗證方法:

拍攝高反物體,使用不同的參數進行對比

1.3.23 TY_INT_TOF_ANTI_SUNLIGHT_INDEX

tof抗陽光指數
設置方法:

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

驗證方法:

在太陽光底下,設置該參數后,可以有效減少陽光的干擾

1.3.24 TY_INT_MAX_SPECKLE_DIFF

斑點濾波器聚類閾值,單位:mm。若相鄰像素的深度差值小于該閾值,則認為該相鄰像素屬于同一個聚類斑點
設置方法:

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

驗證方法:

閾值越小,圖像濾除的斑點越多,在(max speckle size)較大值時調試diff參數,效果明顯

1.3.25 TY_INT_MAX_SPECKLE_SIZE

斑點濾波器面積閾值,單位:像素。面積小于該閾值的聚類斑點會被濾除
設置方法:

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

驗證方法:

閾值越大,圖像濾除的斑點越多

1.3.26 TY_BOOL_TOF_ANTI_INTERFERENCE

抗多機干擾開關,適用于場景中dtof相機數量大于tof_channel數量時的場景,可以有效避免多機干擾現象。
設置方法:

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

驗證方法:

開啟抗多機干擾后,同一場景中的多臺dtof相機之間的影響有效減弱

1.3.27 TY_ENUM_CONFIG_MODE

V系列相機預設的參數,不同模式下相機的精度不同
設置方法:

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

驗證方法:

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

1.4 RGB組件下的API測試

1.4.1 TY_INT_ANALOG_GAIN

用于設置RGB模擬增益
設置方法:

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

驗證方法:

參數越大,RGB圖像越亮

1.4.2 TY_INT_R_GAIN

用于設置RGB紅色通道增益
設置方法:

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

驗證方法:

參數越大,RGB圖像越紅

1.4.3 TY_INT_G_GAIN

用于設置RGB綠色通道增益
設置方法:

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

驗證方法:

參數越大,RGB圖像越綠

1.4.4 TY_INT_B_GAIN

用于設置RGB藍色通道增益
設置方法:

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

驗證方法:

參數越大,RGB圖像越藍

1.4.5 TY_INT_EXPOSURE_TIME

用于設置RGB曝光時間
設置方法:

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

驗證方法:

參數越大,RGB圖像越亮

1.4.6 TY_INT_AE_TARGET_Y

AEC調節的目標明亮度
設置方法:

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

驗證方法:

開啟AEC以后,參數越低,圖像越暗;參數越大,圖像越亮

1.4.7 TY_STRUCT_AEC_ROI

AEC調節感興趣區域,設置后,根據感興趣區域的亮度,自動調整曝光時間
設置方法:

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

驗證方法:

若感興趣區域內過曝(日光燈),則整幅圖像變暗
若感興趣區域欠曝(黑色物體),則整幅圖像變亮

1.4.8 TY_BOOL_AUTO_EXPOSURE

RGB自動曝光開關
設置方法:

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

驗證方法:

方法1:開啟RGB自動曝光后,相機對著日光燈,用手遮住RGB鏡頭,手移開后,圖像會有一個收斂的過程。
方法2:關閉RGB自動曝光后,將曝光時間拉到最低,然后開啟RGB自動曝光,圖像會變亮

1.4.9 TY_BOOL_AUTO_AWB

RGB自動白平衡功能
設置方法:

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

驗證方法:

使用FM851-E1相機,關閉自動白平衡后,調節RGB三通道增益,使RGB圖像偏色,然后開啟自動白平衡,圖像恢復正常色彩

1.4.10 AUTO_ISP

若圖像輸出YUYV格式,則相機帶有硬件ISP模塊。
若圖像輸出BAYER8GB格式,則相機需要使用軟件ISP。

針對RGB鏡頭無ISP功能,提供的軟件isp功能,涉及TYISPCreate()ColorIspInitSetting()TYISPUpdateDevice() 3個API
驗證方法:

連接一臺FM851-E2相機,運行SimpleView_FetchFrame、SimpleView_TriggerMode1示例程序,對比RGB圖像顏色。

啟用auto isp后,TY_INT_ANALOG_GAIN會被設置為1

軟ISP功能,僅針對BAYER8GB格式彩色相機,開啟后可實現一定程度的自動白平衡和自動曝光,但會降低幀率。

1.5 IR組件下的API測試

1.5.1 TY_INT_EXPOSURE_TIME

用于設置左右IR曝光時間
設置方法:

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

驗證方法:

參數越大,IR圖像越亮

1.5.2 TY_INT_ANALOG_GAIN

用于設置左右IR模擬增益
設置方法:

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

驗證方法:

參數越大,IR圖像越亮

1.5.3 TY_INT_GAIN

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

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

驗證方法:

參數越大,IR圖像越亮

1.5.4 TY_BOOL_UNDISTORTION

左右IR畸變校正開關,開啟則表示進行校正,默認為不開啟狀態
設置方法:

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

驗證方法:

拍攝天花板,開啟畸變校正后,天花板上的縫隙拉直(與人眼看到的一樣) 左右ir為綁定狀態,要開一起開,要關一起關。以“后設置”的為準

1.5.5 TY_BOOL_HDR

左右IR HDR開關
設置方法:

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

驗證方法:

開啟HDR后,ir圖像變的有“朦朧感”

1.5.6 TY_BYTEARRAY_HDR_PARAMETER

HDR曝光比參數
設置方法:
1.讀取HDR數組的大小

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

2.讀取默認的HDR參數

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

3.設置HDR參數

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

驗證方法:

HDR參數范圍[0,2],開啟HDR后,參數越小,圖像越亮

1.6 Storage組件下的API測試

操作存儲空間,請使用API進行操作,切勿進入相機底層,通過echo的方式寫入內容!!!

操作存儲空間的方法請見DeviceStorage示例程序或SimpleView_SaveLoadConfigSaveLoadConfig_v2

1.6.1 TY_BYTEARRAY_CUSTOM_BLOCK

用于獲取custom_block.bin存儲空間大小
使用方法:
uint32_t block_size;

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

1.結構光相機文件內容一般為0xFF,ToF相機的內容一般為NUL。
2.對于結構光相機,自R3.13.81版本開始,custom_block.bin文件大小由原來的4kb變更為64kb。

1.6.2 TY_BYTEARRAY_ISP_BLOCK

用于獲取isp_block.bin存儲空間大小
使用方法:

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

1.7 其他常用API測試

1.7.1 TYHasFeature()

用于判斷相機是否具備該功能
使用方法:

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

驗證方法:

1.若相機具有此功能,則返回結果為true,反之則返回false。
2.沒有對應的Component,TYHasFeature上報-1008錯誤(TY_STATUS_INVALID_COMPONENT)

1.7.2 TYGetFeatureInfo()

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

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

驗證方法:

若相機具有此功能,則API返回結果為0,isValid=true,其他描述與相機config一致。

1.7.3 TYGetDeviceFeatureNumber()

用于獲取組件下feature的數量
使用方法:

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

驗證方法:

獲取的feature數量與config文件中描述的數量進行比對(獲取的比config文件中多一個,是calib info)

1.7.4 TYGetDeviceFeatureInfo()

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

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

驗證方法:

與config文件的描述進行比對

1.7.5 write_parameters_to_storage()

SDK 3.6.51及以上版本新增功能,用于將PV導出的json文件寫入相機custom_block.bin文件。
使用方法:

1.使用PV2.5.0版本及以上,生成一份當前相機參數的json文件(只保存打開相機后調整過的參數)
2.運行SimpleView_SaveLoadConfig -id 相機序列號 -s xxxx.json 該步驟會將json文件寫入相機

驗證方法:

1.相機斷電重啟后,使用PV直接加載參數,觀察參數是否發生變化
2.SDK3.6.65及其之后,寫入參數時會使用哈夫曼壓縮方法,故通過直接查看文件為亂碼,需要通過加載的方式驗證。

1.7.6 load_parameters_from_storage()

SDK 3.6.51及以上版本新增功能,用于從custom_block.bin文件加載參數,并將其保存至本地文件
使用方法:

運行SimpleView_SaveLoadConfig -id 相機序列號 -o xxxxxxx.json
該步驟會從custom_block.bin加載參數并將參數輸出至程序目錄下的xxxxxxx.json文件中

驗證方法:

有以下2種方法進行驗證:
1.加載相機參數后, 查看相機圖像變化與設置的參數是否一致。
2.在加載完成后,調用SDK API,讀取被加載的參數,與文件內容進行比較。

1.7.7 clear_storage()

清除相機custom_block.bin存儲區域的內容
使用方法:

 ASSERT_OK(clear_storage(hDevice));

驗證方法:

custom_block.bin文件拷貝至本地,使用notepade++打開,文件內容顯示為NUL或調用load_parameters_from_storage(),打印“The CRC check code is empty ”,接口返回錯誤-1001。

1.7.8 selectDevice()

該API可以使用指定的接口,根據id或者ip打開圖漾相機
使用方法:
1.指定使用網絡接口,打開圖漾相機

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

2.使用指定ID或IP打開相機

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

驗證方法:

1.指定使用網絡接口,打開圖漾相機:當相機是usb相機時,無法打開相機。
2.使用指定ID或IP打開相機:無需輸入序列號,每次運行程序都能打開指定的相機。
3.指定網絡或usb接口列表中沒有的相機—— >返回-1001

1.7.9 TYOpenInterface()

該API可以打開指定的網絡接口

1.如網卡MAC地址為:88-a4-c2-b1-35-e3(ipconfig /all查看)
2.Ip地址為:192.168.6.45(對應16進制的小端存儲為2d06a8c0)
3.則指定網卡時需要寫成“eth-88-a4-c2-b1-35-e32d06a8c0”(注意大小寫,需要做區分)。

使用方法:

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

驗證方法:

1.網卡MAC地址大寫,接口報錯-1023
2.網卡ip地址錯誤,接口報錯-1023

1.7.10 TYOpenDevice()

該API用于打開圖漾相機,若相機能夠正常打開,則API返回結果為0。其他返回結果均為異常
測試方法:

1.跨網段打開相機 ——> -1005
2.打開正在采集圖像的相機——>網絡(-1014),usb(-1005)
3.打開初始化錯誤的相機——> -1024

1.7.11 parse_firmware_errcode()

用于打印-1024錯誤對應的錯誤碼
使用方法:

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

驗證方法:

使用打開相機時報錯-1024的相機進行驗證。parse_firmware_errcode(err_code);打印的錯誤與錯誤碼表征的一致

1.7.12 TYGetDeviceXMLSize()

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

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

驗證方法:

將讀取的值與fetch_config.xml文件大小進行比較,讀取到的值應比fetch_config.xml多1個字節(結束符)

1.7.13 TYGetDeviceXML()

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

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

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

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

2.打印指定行的內容:

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

驗證方法:
將API獲取的內容打印出來,與fetch_config.xml文件進行比對。

1.7.14 TYImageMode2

1.在TY_RESOLUTION_MODE_LIST中,沒有對1024x768這個分辨率進行定義,故TY_IMAGE_MODE_DEPTH16_1024x768為未定義的標識符。
2.在這種情況下,則需要通過**TYImageMode2()**接口,構造一個參數。

使用方法:

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

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

1.8 圖像格式及分辨率測試

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

Depth圖像格式具有depth16和xyz48兩種格式,測試情況如下:
在這里插入圖片描述

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

RGB具有多種圖像格式,測試情況如下:
在這里插入圖片描述

1.8.3 IR圖像分辨率測試

IR具有多種圖像格式,測試情況如下:
在這里插入圖片描述

1.9 RGBD對齊測試

1.9.1圖像對齊

圖漾相機支持RGBD對齊,其中RGBD對齊分為Depth2RGB和RGB2Depth。
測試方法:
1.RGB2Depth

直接運行SimpleView_Registration,將相機固定后拍攝箱體,觀察圖像是否對齊。

2.Depth2RGB

修改宏:#define MAP_DEPTH_TO_COLOR 1后,運行SimpleView_Registration,將相機固定后拍攝箱體,觀察圖像是否對齊。

1.9.2 RGBD點云對齊測試

圖漾SDK支持將相機輸出的深度圖和點云圖做對齊后轉化為點云數據。其中RGBD對齊分為Depth2RGB和RGB2Depth
測試方法:

1.RGB2Depth:直接運行SimpleView_Point3D,將相機固定后拍攝箱體,觀察點云是否對齊。
2.Depth2RGB:運行SimpleView_Point3D -dep2rgb,將相機固定后拍攝箱體,觀察點云是否對齊

1.9.3 視差參數

當RGB和DEPTH存在視差,導致RGBD對齊(rgb2dep)有大量黑洞或者存在錯誤匹配的情況,可適當調節此參數。文件位于include文件夾下的TYCoordinateMapper.h

在這里插入圖片描述

delt值是用來過濾視差的,值越小,過濾越狠,會影響大斜面的對齊(RGB信息缺失)。
在這里插入圖片描述

1.10 獲取相機標定參數API

1.10.1 TY_STRUCT_CAM_INTRINSIC

獲取相機內參API,可用于獲取depth、color、ir_left、right_ir的內參。
使用方法:

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

驗證方法:

1.讀取的內參與config文件中的一致,若分辨率與標定時使用的圖像分辨率不一致,則等比例的進行放大和縮小。

TY_STRUCT_CAM_CALIB_DATA讀取的內參與TY_STRUCT_CAM_INTRINSIC的內參區別
TY_STRUCT_CAM_CALIB_DATA內參是相機最大分辨率的內參
TY_STRUCT_CAM_INTRINSIC內參是相機當前分辨率的內參

1.10.2 TY_STRUCT_EXTRINSIC_TO_DEPTH

獲取ir_right/rgb到左ir的外參。
使用方法:

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

驗證方法:

讀取的參數與config中的一致,獲取的參數不隨分辨率切換而變化。

1.10.3 TY_STRUCT_CAM_DISTORTION

畸變參數,可用于rgb、ir_left、ir_right的畸變校正
使用方法:

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

驗證方法:

讀取的參數與config中的一致,獲取的參數不隨分辨率切換而變化

1.10.4 TY_STRUCT_CAM_RECTIFIED_INTRI

獲取校正后的ir_left/ir_right內參。
使用方法:

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

驗證方法:

讀取的參數與config中的一致

1.11 圖像處理加速功能

開啟OpenMP功能后,SDK運行時采用多核處理圖像,CPU占用率高,處理圖像快。
使用方法:
代碼引用頭文件“TYImageProc.h”并在代碼中進行如下設置

TYImageProcesAcceEnable(true);
true:表示啟用圖像加速處理功能;false:表示不啟用

驗證方法:

在對齊程序中,打印做RGB畸變校正所花的時間,并觀察上位機在運行對齊程序時的cpu占用率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894447.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32 TIM定時器配置

TIM簡介 TIM&#xff08;Timer&#xff09;定時器 定時器可以對輸入的時鐘進行計數&#xff0c;并在計數值達到設定值時觸發中斷 16位計數器、預分頻器、自動重裝寄存器的時基單元&#xff0c;在72MHz計數時鐘下可以實現最大59.65s的定時 不僅具備基本的定時中斷功能&#xff…

pytorch實現基于Word2Vec的詞嵌入

PyTorch 實現 Word2Vec&#xff08;Skip-gram 模型&#xff09; 的完整代碼&#xff0c;使用 中文語料 進行訓練&#xff0c;包括數據預處理、模型定義、訓練和測試。 1. 主要特點 支持中文數據&#xff0c;基于 jieba 進行分詞 使用 Skip-gram 進行訓練&#xff0c;適用于小數…

【數據結構】_鏈表經典算法OJ(力扣/牛客第二彈)

目錄 1. 題目1&#xff1a;返回倒數第k個節點 1.1 題目鏈接及描述 1.2 解題思路 1.3 程序 2. 題目2&#xff1a;鏈表的回文結構 2.1 題目鏈接及描述 2.2 解題思路 2.3 程序 1. 題目1&#xff1a;返回倒數第k個節點 1.1 題目鏈接及描述 題目鏈接&#xff1a; 面試題 …

pytorch基于 Transformer 預訓練模型的方法實現詞嵌入(tiansz/bert-base-chinese)

以下是一個完整的詞嵌入&#xff08;Word Embedding&#xff09;示例代碼&#xff0c;使用 modelscope 下載 tiansz/bert-base-chinese 模型&#xff0c;并通過 transformers 加載模型&#xff0c;獲取中文句子的詞嵌入。 from modelscope.hub.snapshot_download import snaps…

爬蟲基礎之爬取某站視頻

目標網址:為了1/4螺口買小米SU7&#xff0c;開了一個月&#xff0c;它值嗎&#xff1f;_嗶哩嗶哩_bilibili 本案例所使用到的模塊 requests (發送HTTP請求)subprocess(執行系統命令)re (正則表達式操作)json (處理JSON數據) 需求分析: 視頻的名稱 F12 打開開發者工具 or 右擊…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最強 AI 工具

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux 目錄 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下載 Ollama&#x1f98b; 選擇模型&#x1f98b; 運行模型&#x1f98b; 使用 && 測試 二&#xff1a;&#x1f525; Chat…

【linux網絡(5)】傳輸層協議詳解(下)

目錄 前言1. TCP的超時重傳機制2. TCP的流量控制機制3. TCP的滑動窗口機制4. TCP的擁塞控制機制5. TCP的延遲應答機制6. TCP的捎帶應答機制7. 總結以及思考 前言 強烈建議先看傳輸層協議詳解(上)后再看這篇文章. 上一篇文章講到TCP協議為了保證可靠性而做的一些策略, 這篇文章…

DeepSeek 遭 DDoS 攻擊背后:DDoS 攻擊的 “千層套路” 與安全防御 “金鐘罩”

當算力博弈升級為網絡戰爭&#xff1a;拆解DDoS攻擊背后的技術攻防戰——從DeepSeek遇襲看全球網絡安全新趨勢 在數字化浪潮席卷全球的當下&#xff0c;網絡已然成為人類社會運轉的關鍵基礎設施&#xff0c;深刻融入經濟、生活、政務等各個領域。從金融交易的實時清算&#xf…

二、CSS筆記

(一)css概述 1、定義 CSS是Cascading Style Sheets的簡稱,中文稱為層疊樣式表,用來控制網頁數據的表現,可以使網頁的表現與數據內容分離。 2、要點 怎么找到標簽怎么操作標簽對象(element) 3、css的四種引入方式 3.1 行內式 在標簽的style屬性中設定CSS樣式。這種方…

第三篇:模型壓縮與量化技術——DeepSeek如何在邊緣側突破“小而強”的算力困局

——從算法到芯片的全棧式優化實踐 隨著AI應用向移動終端與物聯網設備滲透&#xff0c;模型輕量化成為行業核心挑戰。DeepSeek通過自研的“算法-編譯-硬件”協同優化體系&#xff0c;在保持模型性能的前提下&#xff0c;實現參數量與能耗的指數級壓縮。本文從技術原理、工程實…

C++編程語言:抽象機制:泛型編程(Bjarne Stroustrup)

泛型編程(Generic Programming) 目錄 24.1 引言(Introduction) 24.2 算法和(通用性的)提升(Algorithms and Lifting) 24.3 概念(此指模板參數的插件)(Concepts) 24.3.1 發現插件集(Discovering a Concept) 24.3.2 概念與約束(Concepts and Constraints) 24.4 具體化…

DeepSeek-R1本地部署實踐

一、下載安裝 --Ollama Ollama是一個開源的 LLM&#xff08;大型語言模型&#xff09;服務工具&#xff0c;用于簡化在本地運行大語言模型&#xff0c;降低使用大語言模型的門檻&#xff0c;使得大模型的開發者、研究人員和愛好者能夠在本地環境快速實驗、管理和部署最新大語言…

AI技術路線(marked)

人工智能&#xff08;AI&#xff09;是一個非常廣泛且充滿潛力的領域&#xff0c;它涉及了讓計算機能夠執行通常需要人類智能的任務&#xff0c;比如感知、推理、學習、決策等。人工智能的應用已經滲透到各行各業&#xff0c;從自動駕駛到醫療診斷&#xff0c;再到推薦系統和自…

【leetcode詳解】T598 區間加法

598. 區間加法 II - 力扣&#xff08;LeetCode&#xff09; 思路分析 核心在于將問題轉化&#xff0c; 題目不是要求最大整數本身&#xff0c;而是要求解最大整數的個數 結合矩陣元素的增加原理&#xff0c;我們將抽象問題轉為可操作的方法&#xff0c;其實就是再找每組ops中…

【最后203篇系列】004 -Smarklink

說明 這個用來替代nginx。 最初是希望用nginx進行故障檢測和負載均衡&#xff0c;花了很多時間&#xff0c;大致的結論是&#xff1a;nginx可以實現&#xff0c;但是是在商業版里。非得要找替代肯定可以搞出來&#xff0c;但是太麻煩了&#xff08;即使是nginx本身的配置也很煩…

完全卸載mysql server步驟

1. 在控制面板中卸載mysql 2. 打開注冊表&#xff0c;運行regedit, 刪除mysql信息 HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->EventLog->Application->Mysql HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->Mysql …

1. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--引言

在當前軟件開發領域&#xff0c;云原生和微服務架構已經成為主流趨勢&#xff0c;傳統的單體應用正逐步向分布式系統轉型。隨著業務需求的不斷變化與用戶規模的迅速擴大&#xff0c;如何在保證高可用、高擴展性的同時&#xff0c;還能提高開發效率與降低維護成本&#xff0c;成…

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群 簡介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系統安裝部署 Kubernetes v1.29.13 集群 1 環境準備1.1 集群IP規劃1.2 初始化步驟&#xff08;各個節點都需執行&#xff09;1.2.1 主機名與IP地址解析1.…

基于SpringBoot的新聞資訊系統的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

每日一題——包含min函數的棧

包含min函數的棧 題目數據范圍&#xff1a;示例C語言代碼實現解釋1. push(value)2. pop()3. top()4. min() 總結大小堆 題目 定義棧的數據結構&#xff0c;請在該類型中實現一個能夠得到棧中所含最小元素的 min 函數&#xff0c;輸入操作時保證 pop、top 和 min 函數操作時&am…