MI TOF API
REVISION HISTORY¶
| Revision No | Description |
Date |
|---|---|---|
| 1.0 | Initial Release | 10/11/2025 |
1. 概述¶
1.1. 模块说明¶
TOF(Time of Flight)通过红外光在空气中的飞行时间,计算出目标体的距离,用于深度感知、3D建模、手势识别。本文主要介绍MI_TOF相关接口,主要用于接收VIF原始数据,进行深度计算、校正、滤波处理后输出TOF深度信息的一套接口应用。
1.2. 基本结构¶
MI_TOF通过接收SENSOR->VIF的原始raw数据,送入内部算法calc_depth,依次经过calculate,calibration,filter流程,从而输出depth数据。
基于MI TOF 架构框图如下图:
1.TOF_DEMO:用于处理depth数据并通过uvc传输至上层app
2.MI VIF:接收sensor模块数据并送到TOF算法处理函数中计算DEPTH数据
3.MI SENSOR:调用底层驱动如drv_ms_cus_jm152a/jm152a获取原始图像数据
4.MI TOF/Algorithm:MI TOF api以及cacl/calibration/filter算法
1.3. 功能介绍¶
MI TOF支持以下功能:
- 输入mipi的raw 数据,计算出IR、depth、PCL 点云数据
- 支持IIR Denoise FlyPixel 等滤波算法
- 支持软件自动曝光并可以通过参数配置不同的效果
- 支持画面旋转/翻转
- 解析包尾数据
1.4. 应用场景¶
MI tof应用于linux下tof的开发。
1.5. 开发流程¶
接口调用如下图:
MI TOF处理流程介绍:
- _TOFParseCalibration:解析标定文件calibration.bin;
- _tof_dev_GetDeviceInfo:获取sensor的配置信息;
- MI_TOF_init:TOF初始化,创建Algorithm线程,注册算法回调cacl_depth;
- MI_Tof_RegisterDepthCallBack:注册Callback用于获取IR/depth/PCL;
- tof_run线程:获取TOF RAW数据并通过API MI_Tof_PutRawIntoAlgo送入Algorithm线程并在Cacl_Depth中完成calculate/calibration/filter等动作得到IR/DEPTH/PCL数据;
- Tof_GetDepth_Callback:获取深度数据用于上层的算法;
- SDK 支持filter/AE 等功能;
1.6. 实例介绍¶
本实例展示了基于MI_TOF api进行开发的流程
数据流向:
-
底层sensor获取原始数据通过MIPI传输到VIF
-
uvc tof demo调用MI_Tof_PutRawIntoAlgo把VIF Raw数据送到算法回调中进行计算
-
uvc tof demo通过Tof_GetDepth_Callback获取数据送到UVC Driver
-
UVC通过v4l2把数据送到PC端
控制流向:
-
UVC driver向uvc tof demo发送sensor ctrl cmd
-
底层MI SENSOR接收并解析cmd
-
经过common sensor driver/JM sensor driver调用驱动的set/get接口
-
再通过MIPI把cmd转换成寄存器值写/读到sensor中
图1-4:TOF流程图
注意:所展示的代码并不能直接编译运行,有部分流程处于回调函数中,实例代码并不完整,完整代码请参考:
- sdk\verify\sample_code\source\pcupid\uvc_tof\uvc_tof_demo\st_main_uvc.cpp
/* 处理raw数据,raw->phase->amplitude->depth,以及封装包尾数据,最后由callback输出depth数据 */ MI_U32 Calc_Depth(void* inputData, void* outputData, void* config) { calculate; calibration; filter; . . . pChannelParams->algoCallbackResult(channel, depth); } /* 接收raw数据线程以及处理回调 */ void* AlgorithmThread(void* arg) { FrameInf_t instFrameInf; FrameInf_t outtFrameInf; mi_tof_pack_data OutputPackId = MI_TOF_PACK_DEPTH_DATA; MI_U32 u32size = 0x0; MI_TOF_Channel_Params_t* pChannelParams = NULL; MI_U8 channel = ((mi_tof_mod_thread_Arg *)arg)->channel; MI_U8 mod = ((mi_tof_mod_thread_Arg *)arg)->mod; if (channel >= MAX_TOTAL_TOF_CHANNEL) { TOF_ERR("algorithm error channel [%d]-->%p\n", channel,arg); return NULL; } pChannelParams = pTofChannelParamsArray[channel]; const static char str[][16] = { "Calc_Depth" }; pChannelParams->u8ThreadRunning |= (0x01 << mod); printf("Algo channel[%d] [%s]start ThreadRunning=0x%x\n", channel, str[mod],pChannelParams->u8ThreadRunning); if (mod >= TOF_MOD_MAX) { TOF_ERR("no this mod[%d]", mod); pthread_exit(NULL); return NULL; } //Add exit thread Loop!!!!!!! while (pChannelParams->bForceStop == 0) { std::unique_lock<std::mutex> lck(pChannelParams->mtx); if(RawFrameQ[channel].empty()) { pChannelParams->cv.wait_for(lck, std::chrono::seconds(FRAME_CAPTURE_TIME_OUT)); continue; } u32size = _CalcTofFrameSize(OutputPackId, pChannelParams); outtFrameInf.pPacketAddr = (void *)malloc(u32size); if (NULL == outtFrameInf.pPacketAddr) { TOF_INFO("outtFrameInf pPacketAddr is null!\n"); continue; } instFrameInf = (FrameInf_t)RawFrameQ[channel].front(); outtFrameInf.nPts = instFrameInf.nPts; outtFrameInf.nFrameNum = instFrameInf.nFrameNum; TOF_TIME("->[ch%d]%s frame %lld cost %f ms\n",channel ,str[mod], instFrameInf.nFrameNum, (float)(MI_OS_GetTime() - instFrameInf.nPts)/1000.0); if (E_SUCCESS != pChannelParams->algoCallback[mod](&instFrameInf, &outtFrameInf, &channel)) { free(outtFrameInf.pPacketAddr); outtFrameInf.pPacketAddr = NULL; } RawFrameQ[channel].pop(); } TOF_WRN("\n Algo channel[%d] [%s]exit\n", channel, str[mod]); pChannelParams->u8ThreadRunning &= (~(0x01 << mod)); pthread_exit(NULL); return E_SUCCESS; } /* tof run线程调用MI VIF api获取raw数据,并通过MI_Tof_PutRawIntoAlgo把vif raw数据送到AlgorithmThread线程进行下一步处理 */ void* Tof_Run(void *argv) { _GetSensorInfo(channel, tofCamerInfo); MI_SNR_SetFps(channel, 10); GetVifRawData(channel, VifRaw); ret = MI_Tof_PutRawIntoAlgo(channel, pOneFullFrame[idx], totalsz, VifRaw.stBufInfo.u64Pts); } /* main函数主要完成以下动作: 1.ST_UvcInit->uvc device初始化,数据流和控制流通路 2.ST_ParserIni->解析ini文件,获取系统初始化一些参数设定 3.ST_Sys_Init->封装MI SYS api初始化SYSTEM模块 4._TofCameraStart内部封装了_TOFCamera_Init和Tof_Init, _TOFCamera_Init->调用MI SNR api初始化sensor;调用_TOFParseCalibration解析标定文件calibration.bin,调用MI VIF api初始化vif Tof_Init->调用MI_Tof_Init初始化tof资源,创建AlgorithmThread线程,注册Calc_Depth算法回调 5.创建tof_run线程,调用MI_Tof_RegisterDepthCallBack注册获取depth数据callback 6.释放资源 */ int main(int argc, char **argv) { int ret = 0; MI_U8 i = 0; MI_U32 maxpacket[MAX_UVC_DEV_NUM] = {1024, 1024,192}; MI_U8 mult[MAX_UVC_DEV_NUM] = {1, 1, 0}, burst[MAX_UVC_DEV_NUM] = {0, 0, 0}; MI_U8 intf[2 * MAX_UVC_DEV_NUM] = {0}; MI_S32 mode = UVC_MEMORY_MMAP; MI_S32 trace_level = UVC_DBG_ERR;//UVC_DBG_TRACE; struct sigaction sigAction; sigAction.sa_handler = ST_HandleSig; sigemptyset(&sigAction.sa_mask); sigAction.sa_flags = 0; sigaction(SIGINT, &sigAction, NULL); MI_SNR_PAD_ID_e eSnrPad = E_MI_SNR_PAD_ID_NA; ST_DefaultArgs(&g_stConfig); #if TOF_SLAVE_MODE _tof_init_xvs(); #endif // Init UVC ST_UVC_SetTraceLevel(trace_level); ST_UvcInit(g_device_num, maxpacket, mult, burst, intf, mode); printf("----------uvc_tof--------\n"); for(i=1; i< argc; i++) { if(MI_SUCCESS != ST_ParserIni(argv[i], &eSnrPad)) { printf("parse init fail \n"); return 0; } strncpy(gSnrIni[eSnrPad], argv[i], ST_TOF_SNR_PATH_MAX); g_u8ChannelNum++; } /************************************************ Step1: init SYS *************************************************/ STCHECKRESULT(ST_Sys_Init()); //_TofCameraStart { MI_S32 s32Ret = 0; MI_S8 u8TaskName[64]; MI_U16 tof_width = 0; MI_U16 tof_height = 0; mPthread_Run_Status = 1; for(int i=0; i<ST_MAX_SENSOR_NUM; i++) { if(gSnrPad[i] != E_MI_SNR_PAD_ID_NA) { //_TOFCamera_Init(gSnrPad[i], tof_width, tof_height); { //sstar_init_snr(pstSensorAttr); { STCHECKRESULT(_TOFParseCalibration(eSnrPadId)); } sstar_init_vif(pstVifAttr, tof_width, tof_height); } //Tof_Init(gSnrPad[i]); { _GetSensorInfo(eSnrPad, g_tofCamerInfo) //MI_Tof_Init(eSnrPad, &tofInitParams); { tof_set_amplitude_frame_type(pChannelParams->handle, (tof_hdr_frame_type)pChannelParams->tofParams.AmplitudeType); { mi_tof_mod_thread_Arg Arg1,Arg2,Arg3; pthread_t threadID; Arg1.channel = channel; Arg1.mod = MI_TOF_CALC; sprintf((char *)threadname, "calc_depth#%1d", channel); TOF_WRN("start AlgorithmThread:%s-->%p\n",threadname,&Arg1); pthread_create(&threadID, NULL, AlgorithmThread, (void *)&Arg1); pthread_setname_np(threadID, (char *)threadname); pChannelParams->mRunAlgoThread[MI_TOF_CALC] = threadID; MySystemDelay(1); } pChannelParams->algoCallback[MI_TOF_CALC] = Calc_Depth; tof_processor_set_hdr_mix_gain(); } } } } _TofCalcDepthSize(tof_width, tof_height, g_tof_irSize, g_tof_depthSize, g_tof_pclSize, g_tof_frameHeaderSize); printf("valid channelNum=%d g_tof_irSize=%d\n", g_u8ChannelNum, g_tof_irSize); for(int i=0; i<ST_MAX_SENSOR_NUM; i++) { if(gSnrPad[i] != E_MI_SNR_PAD_ID_NA) { if(pthread_create(&Tof_Thread_Run[i], NULL, Tof_Run, &gSnrPad[i]) == 0) { memset((char*)u8TaskName, 0x00, sizeof(u8TaskName)); sprintf((char *)u8TaskName, "TofRun_%d",i); pthread_setname_np(Tof_Thread_Run[i] , (const char *)u8TaskName); } else { printf("%s tof run pthread_create failed\n", __func__); goto EXIT; } //use callback to get depth result MI_Tof_RegisterDepthCallBack(gSnrPad[i], Tof_GetDepth_Callback); g_u64lastTime[i] = MI_OS_GetTime(); } } } while(!g_bExit) { MI_U32 u32Select = 0xff; printf("select 0: set depth low/high \n"); printf("select 1: set debug params \n"); printf("select 2: set sensor filter\n"); printf("select 3: set sensor auto exposure\n"); printf("select 13: exit\n"); //printf("select 14: enable cus3a demo\n"); scanf("%d", &u32Select); ST_Flush(); if(u32Select == 0) { ST_TofSetDepthLowHigh(); } else if(u32Select == 13) { g_bExit = TRUE; } usleep(100*1000); } _TofCameraStop(); printf("!!!!!!!!!!!%s %d exit done\n",__FUNCTION__,__LINE__); EXIT: ST_UvcDeinit(); return ret; }
2. API参考¶
功能模块API
| API名 | 功能 | |
|---|---|---|
| 1 | MI_Tof_Init | 初始化TOF Channel |
| 2 | MI_Tof_UnInit | 反初始化TOF Channel |
| 3 | MI_Tof_RegisterCallBack | 注册TOF Channel的Mod函数回调 |
| 4 | MI_Tof_UnRegisterCallBack | 反注册TOF Channel的Mod函数回调 |
| 5 | MI_Tof_PutRawIntoAlgo | 送入一个完整TOF Channel完整原始Frame |
| 6 | MI_Tof_GetTofResult | 获取INZI(亮度&深度)Frame |
| 7 | MI_Tof_ReleaseTofResult | 释放INZI之前获取到的Frame |
| 8 | MI_Tof_SetFilter | 动态开关TOF iir/denoise filter. |
| 9 | MI_Tof_GetFilter | 获取filter的配置信息 |
| 10 | MI_Tof_SetAutoExposure | 动态开关TOF auto exposure. D |
| 11 | MI_Tof_GetAutoExposure | 获取AE的开关,配置信息等 |
| 12 | MI_Tof_SetDebugParams | 设置TOF演算法debug 参数 |
| 13 | MI_Tof_SetAmplitudeFrameType | 动态控制amplitude使用high/low gain data计算。默认使用low gain。 |
| 14 | MI_Tof_SetCalibrationType | 动态开启/关闭calibration type。默认calibration type均开启。Debug接口 |
| 15 | MI_Tof_SetDebugLevel | 设置MI_TOF debug level。Debug接口 |
| 16 | MI_Tof_RegisterDepthCallBack | 注册“Get TOF depth”的 callback。 |
| 17 | MI_Tof_UnRegisterDepthCallBack | 注销“Get TOF depth” callback。 |
| 18 | MI_Tof_ParseEmbedInfo | Get the information from the embed line |
| 19 | MI_Tof_EnableInterferenceDeteced | 开启“多机对射时的干扰排除”功能 |
| 20 | MI_Tof_DisableInterferenceDeteced | 关闭“多机对射时的干扰排除”功能 |
| 21 | MI_Tof_SetFlip | 设定不同的flip类型 |
| 22 | MI_Tof_SetIrThreshold | 设定threshold, 小于该threshold,depth会输出0 |
| 23 | MI_Tof_SetAeParam | 设定AE 参数 |
| 24 | MI_Tof_GetAeParam | 获取AE 参数 |
| 25 | MI_Tof_SetRotation | 设定画面Rotation 功能 |
2.1. MI_Tof_Init¶
-
功能
初始化TOF Channel
-
语法
MI_S32 MI_Tof_Init(MI_U8 channel, MiTofParams_t* pInitParams);
-
形参
参数名称 描述 输入/输出 Channel Channel 可以支持0~3,默认最大支持4路Sensor chanel,需要需要上层做好Sensor chmap/Port和channel映射关系,MI_TOF不会去绑定具体的HW配置 输入 pInitParams 初始化参数,设置channel对应Sensor HW属性,Cali/AE/Filter参数 输入 -
返回值
-
E_SUCCESS 成功初始化TOF Channel,重复创建,如果之前成功的话也是返回E_SUCCESS
-
-1 初始化失败,资源不足或者参数错误.
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
注意
最多支持4路,若系统资源不足会初始化失败
AE参数设定参考如下:
图1‑5:AE参数设定图 -
举例
MiTofParams_t tofInitParams; MiTofSensorHwParams_t TofHwParams; MixerRawBufInfo_t VifRaw; MiTofInterferenceDetecedParams_t pDectectdParams; memset(&VifRaw, 0x0, sizeof(MixerRawBufInfo_t)); //Get Sensor Device infor tof_sensor_information tofCamerInfo; memset(&tofCamerInfo, 0, sizeof(tofCamerInfo)); memset(&tofInitParams, 0, sizeof(MiTofParams_t)); if (0 == MI_SNR_CustFunction(E_MI_SNR_PAD_ID_1, CMDID_GET_DEVICE_INFO, sizeof(tofCamerInfo), &tofCamerInfo, E_MI_SNR_CUSTDATA_TO_USER)) { //setting TOF HW Sensor Params TofHwParams.width = tofCamerInfo.width; TofHwParams.height = tofCamerInfo.height; TofHwParams.pixel_size = tofCamerInfo.pixel_size; TofHwParams.raw_format = tofCamerInfo.raw_format; TofHwParams.hdr_type = tofCamerInfo.hdr_type; TofHwParams.dualFreq = tofCamerInfo.de_aliasing; TofHwParams.mod_freq1 = tofCamerInfo.mod_freq1; TofHwParams.mod_freq2 = tofCamerInfo.mod_freq2; TofHwParams.chip_id = tofCamerInfo.chip_id; TofHwParams.one_quad_one_footer = tofCamerInfo.one_quad_one_footer; tofInitParams.SensorHwParams = TofHwParams; tofInitParams.AmplitudeType = MI_TOF_HDR_FRAME_MIX; { if(tofCamerInfo.dll_sw_calib_capability) { tofInitParams.mDllFilterParams.SetDllClibSwConfig = _tof_SetDllClibSwConfig; tofInitParams.mDllFilterParams.filter_gain = 8; } //[SDR] tof_ae_sdr_params stAESdrParams = { .black_level = 16, .yth_low = 588, .yth_high = 1888, .upper_cnt_limitH = 6680, .upper_cnt_limitL = 1, .exp_limit_low = 20000, .exp_limit_high = 1500000, .exp_step_slow = 20000, .exp_step_fast = 500000, }; //[HDR] tof_ae_hdr_params stAEHdrParams = { .black_level = 16, .yth_low = 280, .yth_high = 1080, .upper_cnt_limitH = 360, .upper_cnt_limitL = 1, .exp_limit_low = 10000, .exp_limit_high = 400000, .exp_step_slow = 10000, .exp_step_fast = 200000, }; tofInitParams.AEParams.sdrParams = stAESdrParams; tofInitParams.AEParams.hdrParams = stAEHdrParams; tofInitParams.AEParams.GetAETimeNs = _tof_GetIntegratimTime; tofInitParams.AEParams.SetAETimeNs = _tof_SetIntegratimTime; tofInitParams.AEParams.AutoExposure = true; } //Fill filter Params { tof_iir_params iir_params;// = pTofChannelParams[channel]->tofParams.FilterParams.iirParams; tof_denoise_params denoise_params;// = pTofChannelParams[channel]->tofParams.FilterParams.denoiseParams; iir_params.gain = 128; denoise_params.mode = 1; denoise_params.lpf_th = 52; denoise_params.flypix_threshold = 1000; tofInitParams.FilterParams.iirParams = iir_params; tofInitParams.FilterParams.denoiseParams = denoise_params; tofInitParams.FilterParams.iirEnable = true; tofInitParams.FilterParams.denoiseEnable = true; if(TofHwParams.mod_freq2 != 0) { MiTofDealiaseFlyPixelParams_t dealiaseFPParams; dealiaseFPParams.low_threshold = 800; dealiaseFPParams.high_threshold = 3200; tofInitParams.FilterParams.dealiaseFlyPixelParams = dealiaseFPParams; tofInitParams.FilterParams.dealiaseFlyPixelEnable = true; } g_tofSetFilter |= ((tofInitParams.FilterParams.iirEnable)?MI_TOF_FILTER_IIR:0); if(tofInitParams.FilterParams.denoiseEnable) { switch(denoise_params.mode) { case 1: g_tofSetFilter |= MI_TOF_FILTER_DENOISE; break; case 2: g_tofSetFilter |= MI_TOF_FILTER_FLYING_PIXEL; break; default: break; } } g_tofSetFilter |= ((tofInitParams.FilterParams.dealiaseFlyPixelEnable)?MI_TOF_FILTER_DEALIASE_FLYPIXEL:0); g_tofSetFilter_pre = g_tofSetFilter; } // Fill Calib Params { char *binpath = (char *)"calibration.bin"; jmcam_persistence_util_block_device_header block_device_header; char *block_image = NULL; struct stat buf; FILE *p = NULL; int result; result = stat("./calibration.bin", &buf); if (result != 0) { printf("error: Failed ^_^ n"); } else { printf(" size of the file in bytes: %d !n",buf.st_size); } block_image = (char *)malloc(buf.st_size); if(block_image == NULL) { printf("@@@@@@@@@@@@Malloc block image failn"); return -1; } p = fopen("./calibration.bin", "rb"); fread(block_image, sizeof (char), buf.st_size, p); fclose(p); tofInitParams.mCaliParams.caliImage = block_image; tofInitParams.mCaliParams.caliImageSZ = (buf.st_size); tofInitParams.mCaliParams.CaliParams.calibartion = NULL; tofInitParams.mCaliParams.temperatureParams.sensor = 36; tofInitParams.mCaliParams.temperatureParams.illumination = 38; } tofInitParams.PclNeed = true; } tofInitParams.GetConfigID = _tof_GetConfigID; tofInitParams.SetConfigID = _tof_SetConfigID; pDectectdParams.SensorRestart = _tof_sensor_restart; MI_Tof_Init(MI_TOF_DEFAULT_CH, &tofInitParams); MI_Tof_EnableInterferenceDeteced(gSnrPad, &pDectectdParams);
2.2. MI_Tof_UnInit¶
-
功能
反初始化TOF Channel,会释放相关的Thread、Frame buffer
-
语法
MI_S32 MI_Tof_UnInit(MI_U8 channel);
-
形参
参数名称 描述 输入/输出 Channel 需要反初始化的TOF Channel,和Init相对应 输入 -
返回值
-
E_SUCCESS or 0 成功反初始化TOF Channel
-
-1 反初始化失败
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
2.3. MI_Tof_RegisterCallBack¶
-
功能
注册TOF Channel的Mod函数回调
-
语法
MI_S32 MI_Tof_RegisterCallBack(MI_U8 channel, MI_U32 Mod, MI_S32 (*Callback)(void* inputData, void* outputData, void* config));
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 Mod mi_tof_mod定义的中三种枚举 输入 Callback 每个Mod注册函数回调 输入 -
返回值
-
E_SUCCESS or 0 注册回调函数成功
-
-1 注册失败
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
2.4. MI_Tof_UnRegisterCallBack¶
-
功能
反注册TOF Channel的Mod函数回调
-
语法
MI_S32 MI_Tof_UnRegisterCallBack(MI_U8 channel, MI_U32 Mod);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 Mod mi_tof_mod定义的中三种枚举 输入 -
返回值
-
E_SUCCESS or 0 反注册回调函数成功。
-
-1 反注册失败
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
2.5. MI_Tof_PutRawIntoAlgo¶
-
功能
送入一个完整原始TOF Frame到对应TOF Channel
-
语法
MI_S32 MI_Tof_PutRawIntoAlgo(MI_U8 channel, char* pbuffer, MI_U32 size, MI_U64 nPts_in);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 pbuffer 完整TOF原始Frame数据Buffer 输入 size Buffer大小 输入 nPts_in Raw 数据的pts 输入 -
返回值
-
E_SUCCESS or 0 送入frame buffer成功。
-
-1 送入失败,可能是channel没有创建有关系,还是送入大小和TOF计算原始数据大小不一致
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
举例
char* pOneFullFrame = (char*)malloc(totalsz); memset(pOneFullFrame, 0, totalsz); while (mPthread_Run_Status) { //1.get vif date if (MI_SUCCESS == GetVifRawData(VifRaw)) { if (TofHwParams.dualFreq == 1) { if (_waitTofDualFreqOneFrameReady((char*)VifRaw.stBufInfo.stFrameData.pVirAddr[0], pOneFullFrame, &TofHwParams)) { **MI_Tof_PutRawIntoAlgo**(MI_TOF_DEFAULT_CH, pOneFullFrame, totalsz, VifRaw.stBufInfo.u64Pts); } } else { //2.to algo **MI_Tof_PutRawIntoAlgo**(MI_TOF_DEFAULT_CH, (char*)VifRaw.stBufInfo.stFrameData.pVirAddr[0], VifRaw.stBufInfo.stFrameData.u32BufSize, VifRaw.stBufInfo.u64Pts); } ReleaseOneRaw(VifRaw.hHandle); } }
2.6. MI_Tof_GetTofResult¶
-
功能
获取INZI(亮度&深度)帧。
-
语法
MI_S32 MI_Tof_GetTofResult(MI_U8 channel, mi_tof_INZI_data &depth);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 depth INZI 亮度/深度数据 输出 -
返回值
-
E_SUCCESS or 0 获取INZI Frame成功。
-
-1 获取失败,可能当前frame buffer中已经空或者channel创建
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
注意
拿INZI数据的方法有二,请注意,目前新版本的SDK只保留方法2
-
法1:MI_Tof_GetTofResult/MI_Tof_ReleaseTofResult;
-
法2:MI_Tof_RegisterDepthCallBack/MI_Tof_UnRegisterDepthCallBack;
-
2.7. MI_Tof_ReleaseTofResult¶
-
功能
释放INZI(亮度&深)Frame
-
语法
MI_S32 MI_Tof_ReleaseTofResult(MI_U8 channel, mi_tof_INZI_data &depth);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 depth INZI 亮度/深度数据 输入 -
返回值
-
E_SUCCESS or 0 释放INZI Frame成功。
-
-1 释放失败.
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
举例
mi_tof_INZI_data depth; while (mPthread_Run_Status) { //3.get if (E_SUCCESS == **MI_Tof_GetTofResult**(MI_TOF_DEFAULT_CH, depth)) { //send to disp { //to do… } MI_Tof_ReleaseTofResult(MI_TOF_DEFAULT_CH, depth); } }
2.8. MI_Tof_SetFilter¶
-
功能
动态开关tof 演算法iir/denoise filter/flying pixel filter/dealise flying pixel fiter。
-
语法
MI_S32 MI_Tof_SetFilter(MI_U8 channel, mi_tof_filter type, void* param);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 type mi_tof_filter 定义的不同的filter 类型 输入 params 根据不同的filter 类型,分别传入不同的数据结构定义,MI_TOF_FILTER_IIR 对应 MiTofFilterIirParam_t,MI_TOF_FILTER_DENOISE 对应 MiTofFilterDenoiseParam_t,MI_TOF_FILTER_FLYING_PIXEL 对应 MiTofFilterFlyPixelParam_t,MI_TOF_FILTER_DEALIASE_FLYPIXEL 对应MiTofDealiaseFlyPixelParams_t 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
举例
//case1:打开iir filter MiTofFilterIirParam_t iirParams; iirParams.enable = (cus_param->filterParam.iir.enable==0)?false:true; iirParams.gain = cus_param->filterParam.iir.gain; MI_Tof_SetFilter(channel, MI_TOF_FILTER_IIR, (void*)&iirParams); //case2:打开denoise filter MiTofFilterDenoiseParam_t denoiseParams; denoiseParams.enable = (cus_param->filterParam.denoise.enable==0)?false:true; denoiseParams.lpf_th = cus_param->filterParam.denoise.lpf_th; denoiseParams.flypix_threshold = cus_param->filterParam.denoise.flypix_threshold; MI_Tof_SetFilter(channel, MI_TOF_FILTER_DENOISE, (void*)&denoiseParams);
2.9. MI_Tof_GetFilter¶
-
功能
获取tof 演算法iir/denoise filter/flying pixel filter/dealise flying pixel fiter的状态
-
语法
MI_S32 MI_Tof_GetFilter(MI_U8 channel, mi_tof_filter type, void* param);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 type mi_tof_filter 定义的不同的filter 类型 输入 params 根据不同的filter 类型,分别传入不同的数据结构定义,MI_TOF_FILTER_IIR 对应 MiTofFilterIirParam_t,MI_TOF_FILTER_DENOISE 对应 MiTofFilterDenoiseParam_t,MI_TOF_FILTER_FLYING_PIXEL 对应 MiTofFilterFlyPixelParam_t,MI_TOF_FILTER_DEALIASE_FLYPIXEL 对应MiTofDealiaseFlyPixelParams_t 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.10. MI_Tof_SetAutoExposure¶
-
功能
动态开关auto exposure
-
语法
MI_S32 MI_Tof_SetAutoExposure(MI_U8 channel, bool enable);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 enable 1:开AE 0:关AE 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.11. MI_Tof_GetAutoExposure¶
-
功能
动态开关auto exposure
-
语法
MI_S32 MI_Tof_GetAutoExposure(MI_U8 channel, bool *enable);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 enable 1:开AE 0:关AE 输出 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.12. MI_Tof_SetDebugParams¶
-
功能
设置演算法debug参数
-
语法
MI_S32 MI_Tof_SetDebugParams(MI_U8 channel, int* pDebugParams);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 pDebugParams pDebugParams[0]:设置debug level:0 – 关闭log打印1 – 演算法用golden raw data2 – 设置演算法debug level 为INFO4 – 设置演算法debug level为ERRORpDebugParams[1][2]:代表save data功能的画面某点坐标(x,y)。当为(-1,-1)时代表全画面;当为(-1,x)时(x>0),代表x列;当为(x,-1)时(x>0),代表x行;当为(x>0,y>0),代表某点;pDebugParams[3]:代表save data的frame numberpDebugParams[4]:代表save data哪个stage的data,BIT[1] == 1时,表示save RAW data;BIT[6] == 1时,表示dump depth data(binary);BIT[7] == 1时,表示dump PCL(txt);举例:save pcl data:tofdebug 0 -1 -1 1 192 输入 -
返回值
-
E_SUCCESS or 0 获取INZI Frame成功。
-
-1 获取失败,可能当前frame buffer中已经空或者channel创建
-
2.13. MI_Tof_SetAmplitudeFrameType¶
-
功能
动态控制amplitude使用high/low gain data计算。默认使用low gain。
-
语法
MI_S32 MI_Tof_ SetAmplitudeFrameType(MI_U8 channel, mi_tof_hdr_frame_type params);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 params Hdr frame type。参考mi_tof_hdr_frame_type 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.14. MI_Tof_SetCalibrationType¶
-
功能
动态开启/关闭calibration type。默认calibration type均开启。Debug接口。
-
语法
MI_S32 MI_Tof_SetCalibrationType(MI_U8 channel, uint32_t calib_type);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 calib_type 0:代表不做phase calibration。BIT[1]=1: 代表做wiggling calibration;BIT[2]=1: 代表做FPPN calibration;BIT[3]=1: 代表做temperature calibration; 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
举例
//case1 开启wiggling、fppn、温度校正 MI_SNR_PAD_ID_e eSnrPad = gSnrPad; MI_U32 calib_type = 7; MI_Tof_SetCalibrationType(eSnrPad, calib_type); //在case1基础上开启DLL 校正 MI_SNR_PAD_ID_e eSnrPad = gSnrPad; MI_U32 calib_type = 7 | (1<<4); //1<<4: 表示Dll校正 MI_Tof_SetCalibrationType(eSnrPad, calib_type);
2.15. MI_Tof_SetDebugLevel¶
-
功能
设置MI_TOF debug level。Debug接口。
-
语法
MI_S32 MI_Tof_SetDebugLevel(TofDebugLevel level,MI_U32 flag);
-
形参
参数名称 描述 输入/输出 TofDebugLevel Debug level。typedef enum 输入 Flag 设置演算法线程消耗的时间打印开关。0:代表不打印。BIT[0]=1: 代表打印计算phase和amplitude的时间;BIT[1]=1: 代表打印calibration的时间;BIT[2]=1: 代表打印filter、depth、点云的时间; 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.16. MI_Tof_RegisterDepthCallBack¶
-
功能
注册“Get TOF depth”的callback。
-
语法
MI_S32 MI_Tof_RegisterDepthCallBack(MI_U8 channel, MI_S32 (*Callback)(MI_U8 channel, mi_tof_INZI_data &depth));
-
形参
参数名称 描述 输入/输出 channel 通道Channel ID 输入 Depth INZI 亮度/深度数据的注册函数回调 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
依赖
- 头文件:PacketModule.h、mid_sys.h、mi_sys_datatype.h、tof_algorithm.h、TofChannelFrame.h
-
注意
拿INZI数据的方法有二:
-
法1:MI_Tof_GetTofResult/MI_Tof_ReleaseTofResult;
-
法2:MI_Tof_RegisterDepthCallBack/MI_Tof_UnRegisterDepthCallBack;
-
2.17. MI_Tof_UnRegisterDepthCallBack¶
-
功能
注销“Get TOF depth”的callback。
-
语法
MI_S32 MI_Tof_UnRegisterDepthCallBack(MI_U8 channel);
-
形参
参数名称 描述 输入/输出 channel 通道Channel ID 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
注意
拿INZI数据的方法有二,目前新的sdk 主要支持方法2.
-
法1:MI_Tof_GetTofResult/MI_Tof_ReleaseTofResult;
-
法2:MI_Tof_RegisterDepthCallBack/MI_Tof_UnRegisterDepthCallBack;
-
2.18. MI_Tof_ParseEmbedInfo¶
-
功能
Get the information from the embed line.
-
语法
MI_S32 MI_Tof_ParseEmbedInfo(MI_U8 channel, char* embed, MiTofEmbedInfo* info);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 embed 包尾buffer首地址 输入 info 包尾信息,比如frame number, quad number,etc. 输出 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
依赖
- 头文件:mi_parse_embed.h
2.19. MI_Tof_EnableInterferenceDeteced¶
-
功能
开启“多机对射时的干扰排除”功能。
-
语法
MI_S32 MI_Tof_EnableInterferenceDeteced(MI_U8 channel, MiTofInterferenceDetecedParams_t* pDectectdParams);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 pDectectdParams 输入Detect参数,参考struct MiTofInterferenceDetecedParams_t. 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
依赖
- 头文件:mid_sys.h、mi_sys_datatype.h、tof_algorithm.h
2.20. MI_Tof_DisableInterferenceDeteced¶
-
功能
关闭“多机对射时的干扰排除”功能。
-
语法
MI_S32 MI_Tof_DisableInterferenceDeteced(MI_U8 channel);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
-
依赖
- 头文件:tof_algorithm.h
2.21. MI_Tof_SetFlip¶
-
功能
设定不同的flip类型。
-
语法
MI_S32 MI_Tof_SetFlip(MI_U8 channel, mi_tof_flip_type type);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 Type Flip type 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.22. MI_Tof_SetIrThreshold¶
-
功能
设定amplitude threshold,小于该值的pixel,深度输出为0。
-
语法
MI_S32 MI_Tof_SetIrThreshold(MI_U8 channel, MI_U32 value);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 value 亮度值 (0到4095) 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.23. MI_Tof_SetAeParam¶
-
功能
设定AE 参数。
-
语法
MI_S32 MI_Tof_SetAeParam(MI_U8 channel, MiTofAeSdrParam_t* sdr, MiTofAeHdrParam_t* hdr);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 sdr sdr的AE 参数配置 输入 hdr hdr的AE 参数配置 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.24. MI_Tof_GetAeParam¶
-
功能
获取AE 参数。
-
语法
MI_S32 MI_Tof_GetAeParam(MI_U8 channel, MiTofAeSdrParam_t* sdr, MiTofAeHdrParam_t* hdr);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 sdr sdr的AE 参数配置 输出 hdr hdr的AE 参数配置 输出 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
2.25. MI_Tof_SetRotation¶
-
功能
设定Rotation类型。
-
语法
MI_S32 MI_Tof_SetRotation(MI_U8 channel, mi_tof_rotation_type type);
-
形参
参数名称 描述 输入/输出 Channel 通道Channel ID 输入 Type 旋转类型 输入 -
返回值
-
E_SUCCESS or 0成功。
-
-1 失败
-
3. 应用case API使用流程¶
3.1 方法一¶
MiTofParams_t tofInitParams;
MiTofSensorHwParams_t TofHwParams;
//1.set tofInitParams
MI_Tof_Init(MI_TOF_DEFAULT_CH, &tofInitParams);
while (1)
{
//2.Get vif raw data
//3.put raw to MI Tof algo
MI_Tof_PutRawIntoAlgo(MI_TOF_DEFAULT_CH, rawbuf, rawsize);
//4.get depth data
if (E_SUCCESS == MI_Tof_GetTofResult(MI_TOF_DEFAULT_CH, depth))
{
//5.depth data to do next
//6.release depth buf
MI_Tof_ReleaseTofResult(MI_TOF_DEFAULT_CH, depth);
}
}
3.2 方法二¶
MI_S32 Tof_GetDepth_Callback(MI_U8 channel, mi_tof_INZI_data &depth)
{
……
}
int main(int argc, char **argv)
{
MiTofParams_t tofInitParams;
MiTofSensorHwParams_t TofHwParams;
//1.set tofInitParams
MI_Tof_Init(MI_TOF_DEFAULT_CH, &tofInitParams);
//use callback to get depth result
MI_Tof_RegisterDepthCallBack(MI_TOF_DEFAULT_CH, Tof_GetDepth_Callback);
……
MI_Tof_UnRegisterDepthCallBack(MI_TOF_DEFAULT_CH);
}
-
说明:
1.上诉过程为MI Tof算法最基本的使用流程,具体细节实现可以参考mixer或者tof demo
2.第3步put raw数据到算法和第4步get depth数据可以放在不同的线程中进行,这样可以同时对多个raw数据进行算法处理,提高效率
4. TOF数据类型¶
数据类型定义
| 数据类型 | 定义 | |
|---|---|---|
| 1 | mi_tof_mod | 定义TOF计算步骤(Calc/Cali/Filter) |
| 2 | mi_tof_INZI_data | 定义TOF计算后Frame类型 |
| 3 | MiTofSensorHwParams_t | 定义Sensor HW描述,从Sensor Driver获取到转化而来 |
| 4 | MiTofCaliParams_t | 定义Calibratition参数 |
| 5 | MiTofFilterParams_t | 定义Filter参数 |
| 6 | MiTofAEParams_t | 定义AE自动曝光参数和函数回调 |
| 7 | MiTofParams_t | 定义TOF Channel初始化参数 |
| 8 | mi_tof_filter | 定义filter类型 |
| 9 | tof_pixel_size | 定义sensor 输出的RAW data里每个data单元的size,单位bit |
| 10 | tof_raw_format | 定义sensor 输出的Raw data format |
| 11 | tof_sensor_hdr_type | 定义HDR type |
| 12 | tof_iir_params | 定义iir filter 结构体 |
| 13 | tof_denoise_params | 定义denoise filter结构体 |
| 14 | tof_ae_sdr_params | 定义sdr下auto exposure 参数 |
| 15 | tof_ae_hdr_params | 定义hdr下auto exposure 参数 |
| 16 | mi_tof_hdr_frame_type | 定义使用high gain还是low gain来计算amplitude的方式 |
| 17 | MiTofEmbedInfo | 定义对外公开的包尾信息 |
| 18 | MiTofInterferenceDetecedParams_t | 定义开启“多机对射时的干扰排除”功能所需要的参数 |
| 19 | MiTofDllFilterParams_t | 定义Dll calibration software config params. |
| 20 | MiTofDllFitlerCode_t | 定义Dll calibration software config callback params. |
| 21 | MiTofDealiaseFlyPixelParams_t | 定义双频下开flying pixel filter需要的参数。 |
4.1. mi_tof_mod¶
-
说明
定义 TOF计算阶段
-
定义
typedef enum { MI_TOF_CALC = 0, MI_TOF_CALI, MI_TOF_FILTER, TOF_MOD_MAX, }mi_tof_mod; -
成员
成员 描述 MI_TOF_CALC Phase计算 MI_TOF_CALI Phase校正 MI_TOF_FILTER 对phase进行filter调优
4.2. mi_tof_INZI_data¶
-
说明
定义TOF计算后Frame类型,参考2.8.1. V4L2_PIX_FMT_INZI (‘INZI’) — The Linux Kernel documentation
-
定义
#pragma pack (4) typedef struct { MI_U64 pts; MI_U32 frameNum; MI_U16* ir; // 1 uint16_t per IR pixel float* depth; // 1 float per depth pixel float* pcl; // 3 float per depth pixel MI_U16* depthInt; // 1 int per depth pixel MI_S16* pclInt; // 3 int per depth pixel MI_U16 width; MI_U16 height; MI_U8* frameHeader;// 1Line Byte with frame info:depth_frame_header_info }mi_tof_INZI_data; #pragma pack () -
成员
成员 描述 pts 当前frame时间戳 frameNum 当前frame 序列(保留) Ir 亮度幅度值(0~4096) depth 浮点型深度Z轴距离 pcl 浮点型点云数据 depthInt 整型深度Z轴距离 pclInt 整型点云数据 width 分辨率宽度 height 分辨率高度 frameHeader pointer to one buffer with intergration-time and temperature, the buffer size is “width” Bytes -
注意
浮点型和整型depth/pcl数据,不能够同时获取到,默认获取浮点型。
MI_Tof_Init使能参数DepthIntNeed可以获取整型数据。
4.3. MiTofSensorHwParams_t¶
-
说明
Sensor HW描述或者HW参数
-
定义
typedef struct _MiTofRawBufInfo_t { uint16_t width; uint16_t height; tof_pixel_size pixel_size; tof_raw_format raw_format; tof_sensor_hdr_type hdr_type; bool dualFreq; uint16_t chip_id; uint8_t one_quad_one_footer; uint32_t mod_freq1; uint32_t mod_freq2; uint8_t ir_type; uint8_t vcsel_type; }MiTofSensorHwParams_t; -
成员
成员 描述 width Sensor分辨率宽度 height Sensor分辨率高度 pixel_size 像素占用bit数。 raw_format Sensor输出的raw data格式。0:A+B1: A-B hdr_type HDR类型:0:表示Normal mode。1:Pixel HDR mode。2:Time HDR mode dualFreq 是否支持双频,支持双频测试距离会更远 chip_id CHIP ID one_quad_one_footer 脚本是否是1quad 带1个包尾 mod_freq1 高频频率 mod_freq2 低频频率 ir_type ir 类型 vcsel_type vcsel的类型, 目前支持3011与JM2519 -
注意
这些请通过Sensor User API
MI_SNR_CustFunction(E_MI_SNR_PAD_ID_1, CMDID_GET_DEVICE_INFO, sizeof(tofCamerInfo), &tofCamerInfo, E_MI_SNR_CUSTDATA_TO_USER)获取
4.4. MiTofCaliParams_t¶
-
说明
TOF Calibratition参数
-
定义
typedef struct _MiTofCaliParams { char* caliImage; MI_U32 caliImageSZ; }MiTofCaliParams_t; -
成员
成员 描述 caliImage Calibration Image buffer地址 caliImageSZ Calibration Image size -
注意
caliImage可以不需要释放,MI_Tof_Uninit会释放
4.5. MiTofFilterParams_t¶
-
说明
filter参数
-
定义
typedef struct _MiTofFilterParams { MiTofFilterIirParam_t iirParams; MiTofFilterDenoiseParam_t denoiseParams; MiTofFilterFlyPixelParam_t flyPixelParams; MiTofDealiaseFlyPixelParams_t dealiaseFlyPixelParams; }MiTofFilterParams_t; -
成员
成员 描述 iirParams IIR Filter参数。 denoiseParams Denoise filter参数。 dealiaseFlyPixelParams 双频下flying pixel filter参数,参考MiTofDealiaseFlyPixelParams_t. flyPixelParams Fly pixel filter 参数
4.6. MiTofAEParams_t¶
-
说明
自动曝光参数
-
定义
typedef struct _MiTofAEParams { tof_ae_sdr_params sdrParams; tof_ae_hdr_params hdrParams; MI_S32 (*GetAETimeNs)(MI_U8 channel, MiTofIntergrationTime_t* stInttime); MI_S32 (*SetAETimeNs)(MI_U8 channel, MiTofIntergrationTime_t* stInttime); bool AutoExposure; }MiTofAEParams_t; -
成员
成员 描述 sdrParams SDR曝光策略参数。 hdrParams HDR曝光策略参数。 GetAETimeNs 获取当前Sensor曝光时间函数回调 SetAETimeNs 设置Sensor曝光时间函数回调 AutoExposure 使能自动曝光
4.7. MiTofParams_t¶
-
说明
TOF Channel初始化参数
-
定义
typedef struct _MiTofParams { MiTofSensorHwParams_t SensorHwParams; MiTofCaliParams_t mCaliParams; MiTofAEParams_t AEParams; MiTofFilterParams_t FilterParams; bool PclNeed; bool DepthIntNeed; mi_tof_hdr_frame_type AmplitudeType; MI_S32 (*GetConfigID)(MI_U8 channel,uint16_t* config_id_value); MI_S32 (*SetConfigID)(MI_U8 channel, uint16_t config_id_value); uint16_t amplitude_threshold; MiTofDllFilterParams_t mDllFilterParams; uint8_t amplitude_gain; //gamma curve 10==linear,setting range value 1-30,default 6, 0 = no fusion uint8_t amplitudeU8Need; //0: amplitude value u16; 1 : amplitude value u8 }MiTofParams_t; -
成员
成员 描述 SensorHwParams Sensor 硬件配置参数 mCaliParams 校正计算参数 AEParams 自动曝光参数 FilterParams Filter参数 PclNeed 使能点云算法 DepthIntNeed 使能获取int depth AmplitudeType 配置amplitude type。会在此阶段分配好对外提供的amplitude的buffer大小。 GetConfigID 从sensor drv get config ID,一般与SetConfigID一起,用来check frame是否有更新 SetConfigID 与上类同 amplitude_threshold 设置amplitude threshold.小于这个threshold的pixel为无效pixel. mDllFilterParams 设置Dll calibration filter 参数,比如gain, 设置越小,phase越平稳;设置越大,当前帧的dll code权重越大,当测量phase发生巨变时,追踪的速度越大。详请看4.19. amplitude_gain ir图输出效果控制参数:gamma curve 10==linear,setting range value 1-30,default 6, 0 = no fusion amplitudeU8Need 控制IR是否U8 输出, 默认是U16
4.8. mi_tof_filter¶
-
说明
定义 TOF filter 类型
-
定义
typedef enum { MI_TOF_FILTER_NONE = 0, MI_TOF_FILTER_IIR = 1 << 0, MI_TOF_FILTER_DENOISE = 1 << 1, MI_TOF_FILTER_FLYING_PIXEL = 1 << 2, MI_TOF_FILTER_DEALIASE_FLYPIXEL = 1 << 3, }mi_tof_filter; -
成员
成员 描述 MI_TOF_FILTER_NONE 没有tof filter MI_TOF_FILTER_IIR Tof iir filter. MI_TOF_FILTER_DENOISE Tof denoise filter(mode = 1),与“ MI_TOF_FILTER_FLYING_PIXEL”只是mode的区别,只能选其一。 MI_TOF_FILTER_FLYING_PIXEL Flying pixel filter(mode = 2). MI_TOF_FILTER_DEALIASE_FLYPIXEL 双频下可以开flying pixel filter
4.9. tof_pixel_size¶
-
说明
定义sensor 输出的RAW data里每个data单元 size,单位bit.
-
定义
typedef enum { TOF_PIXEL_SIZE_RAW12 = 12, TOF_PIXEL_SIZE_RAW16 = 16, TOF_PIXEL_SIZE_MAX = 0xFFFF, }tof_pixel_size; -
成员
成员 描述 TOF_PIXEL_SIZE_RAW12 每个data 12bit。如果Raw data format是下面几种,1个pixel是1个data,那么1个pixel是12bit:TOF_RAW_FORMAT_A_PLUS_BTOF_RAW_FORMAT_A_MINUS_B TOF_PIXEL_SIZE_RAW16 每个data 16bit。如果Raw data format是下面几种,1个pixel是1个data,那么1个pixel是16bit:TOF_RAW_FORMAT_A_PLUS_BTOF_RAW_FORMAT_A_MINUS_B
4.10. tof_raw_format¶
-
说明
定义sensor 输出的Raw data format
-
定义
typedef enum { TOF_RAW_FORMAT_A_PLUS_B, TOF_RAW_FORMAT_A_MINUS_B, TOF_RAW_FORMAT_NUM, }tof_raw_format; -
成员
成员 描述 TOF_RAW_FORMAT_A_PLUS_B 简称A+B mode。sensor只输出(A+B) DATA。 TOF_RAW_FORMAT_A_MINUS_B 简称A-B mode。sensor只输出(A-B) DATA
4.11. tof_sensor_hdr_type¶
-
说明
定义HDR type
-
定义
typedef enum { TOF_SENSOR_HDR_NONE, TOF_SENSOR_HDR_PIXEL, TOF_SENSOR_HDR_TIME, TOF_SENSOR_HDR_NUM, }tof_sensor_hdr_type; -
成员
成员 描述 TOF_SENSOR_HDR_NONE Normal mode。表不开启HDR case. TOF_SENSOR_HDR_PIXEL HDR mode。表pixel HDR case. TOF_SENSOR_HDR_TIME TIME HDR mode
4.12. MiTofFilterIirParam_t¶
-
说明
IR filter的相关参数
-
定义
typedef struct { bool enable; uint8_t gain; }MiTofFilterIirParam_t; -
成员
成员 描述 gain 用来调整IIR filter 的强度 [0~128] 值越大,参考前一帧越多,效果越明显0: off128: max level (default) -
注意
Default gain是128,如果信号很好,temporal noise很小,可以减少gain value。
4.13. MiTofFilterDenoiseParam_t;¶
-
说明
Denoise filter的相关定义
-
定义
typedef struct { bool enable; uint16_t lpf_th; uint16_t flypix_threshold; }MiTofFilterDenoiseParam_t; -
成员
成员 描述 enable 是否使能 lpf_th 调整范围(0~640)越大就会有越多的Pixel执行该filter滤波;Default :58*freq_ratio 比如100M*80M 290 flypix_threshold 调整范围(0~8192)越小越容易去做flying pixel correction;Default :1380*freq_ratio 比如100M*80M 6900 -
注意
gcd = CAL_GCD(mod1_freq, mod2_freq);
freq_ratio = max(mod1_freq, mod2_freq)/gcd;
4.14. MiTofFilterFlyPixelParam_t¶
-
说明
FlyPixelFliter的相关参数定义
-
定义
typedef struct { bool enable; uint16_t lpf_th; uint16_t flypix_gradient_th; uint16_t flypix_diff_sum_th; }MiTofFilterFlyPixelParam_t; -
成员
成员 描述 Enable 开关filter lpf_th 调整范围(0~1024)越大就会有越多的Pixel执行该filter滤波;Default :128*freq_ratio 比如100M*80M 40 flypix_gradient_th 调整范围(0~4096)越小越多的点会被当成flying pixel并被处理为无效点Default :680*freq_ratio 比如100M*80M 3400 flypix_diff_sum_th 调整范围(0~8192)越小越多的点会被当成flying pixel并被处理为无效点Default :1024*freq_ratio 比如100M*80M 5120 -
注意
gcd = CAL_GCD(mod1_freq, mod2_freq);
freq_ratio = max(mod1_freq, mod2_freq)/gcd;
4.15. MiTofDealiaseFlyPixelParams_t¶
-
说明
Dealiase Flypixel filter 参数
-
定义
typedef struct { bool enable; MI_U32 low_threshold; MI_U32 high_threshold; }MiTofDealiaseFlyPixelParams_t; -
成员
成员 描述 Enable 开关 low_threshold 调整范围(0~4086)大于low_threshold的Pixel判别为flying pixel并被处理为无效值Default:800 high_threshold 调整范围(0~4096)小于high_threshold的Pixel即判别为flying pixel并被处理为无效值Default:3200
4.16. tof_ae_sdr_params¶
-
说明
SDR曝光策略参数
-
定义
typedef struct _tof_ae_sdr_params { uint16_t black_level; uint16_t yth_low; uint16_t yth_high; uint16_t upper_cnt_limitH; uint16_t upper_cnt_limitL; uint32_t exp_limit_low; uint32_t exp_limit_high; uint32_t exp_step_slow; uint32_t exp_step_fast; }tof_ae_sdr_params; -
成员
成员 描述 black_level 当integration time 设成0 时, sensor 统计报的平均亮度 yth_low 调整integration time ,需要画面最小的平均亮度 yth_high 调整integration time ,需要画面最大的平均亮度 upper_cnt_limitH; 调整integration time ,可以接受最多的pixel counts 超过pixel upper threshold upper_cnt_limitL 调整integration time ,可以接受最少的pixel counts 超过pixel upper threshold exp_limit_low 调整integration time 的下限 [ns] exp_limit_high 调整integration time 的上限 [ns] exp_step_slow 每次调整integration time , 最短的间隔时间 [ns] (相隔两次的最小差值) exp_step_fast 每次调整integration time , 最长的间隔时间 [ns] (相隔两次的最大差值)
4.17. tof_ae_hdr_params¶
-
说明
HDR曝光策略参数
-
定义
typedef struct _tof_ae_hdr_params { uint16_t black_level; uint16_t yth_low; uint16_t yth_high; uint16_t upper_cnt_limitH; uint16_t upper_cnt_limitL; uint32_t exp_limit_low; uint32_t exp_limit_high; uint32_t exp_step_slow; uint32_t exp_step_fast; }tof_ae_hdr_params; -
成员
成员 描述 black_level 当integration time 设成0 时, sensor 统计报的平均亮度 yth_low 调整integration time ,需要画面最小的平均亮度 yth_high 调整integration time ,需要画面最大的平均亮度 upper_cnt_limitH; 调整integration time ,可以接受最多的pixel counts 超过pixel upper threshold upper_cnt_limitL 调整integration time ,可以接受最少的pixel counts 超过pixel upper threshold exp_limit_low 调整integration time 的下限 [ns] exp_limit_high 调整integration time 的上限 [ns] exp_step_slow 每次调整integration time , 最短的间隔时间 [ns] (相隔两次的最小差值) exp_step_fast 每次调整integration time , 最长的间隔时间 [ns] (相隔两次的最大差值)
4.18. mi_tof_hdr_frame_type¶
-
说明
定义使用high gain还是low gain来计算amplitude的方式
-
定义
typedef enum { MI_TOF_HDR_FRAME_HIGH_GAIN, MI_TOF_HDR_FRAME_LOW_GAIN, MI_TOF_HDR_FRAME_MIX, MI_TOF_HDR_FRAME_BOTH, MI_TOF_HDR_FRAME_NUM, } mi_tof_hdr_frame_type; -
成员
成员 描述 MI_TOF_HDR_FRAME_HIGH_GAIN 计算amplitude用high gain数据 MI_TOF_HDR_FRAME_LOW_GAIN 计算amplitude用low gain数据 MI_TOF_HDR_FRAME_MIX 目前效果等效于HDR_FRAME_LOW_GAIN MI_TOF_HDR_FRAME_BOTH 同时提供High gain和Low gain的amplitude。如需要此种amplitude数据,请在MI_Tof_Init时就配置好。不支持跟其他type动态切换。 MI_TOF_HDR_FRAME_NUM -
4.19. MiTofEmbedInfo¶
-
说明
定义对外公开的包尾信息
-
定义
typedef struct { uint32_t frame_num; uint32_t sub_frame_number; uint32_t quad_num; uint32_t amp_mean; uint32_t amp_mean_hdr; uint32_t amp_upper_cnt; uint32_t amp_upper_cnt_hdr; uint32_t intergration_time; int16_t vcsel_temperature; int16_t sensor_temperature; uint16_t config_id; tof_sensor_hdr_type hdr_type; uint32_t dllCode; }MiTofEmbedInfo; -
成员
成员 描述 frame_num 表示当前是第几帧 sub_frame_number 表示当前的sub frame数目 quad_num 表示当前是quad idx amp_mean 表示当前统计区域内high gain部分的平均亮度,AE需要的数据 amp_mean_hdr 表示当前统计区域内low gain部分的平均亮度,AE需要的数据 amp_upper_cnt 表示当前统计区域内high gain部分高于amp_threshhold的pixel数目,AE需要的数据 amp_upper_cnt_hdr 表示当前统计区域内low gain部分高于amp_threshhold的pixel数目,AE需要的数据 intergration_time 表示当前frame使用的intergration time,AE需要的数据 vcsel_temperature 表示当前driver IC的温度 sensor_temperature 表示当前sensor的温度 config_id 表示当前frame的config_id,一般用于check 具有buffer 缓冲的register设置是否生效 hdr_type 表示当前frame配置是否开启pixelhdr. dllCode 表示HW DLL lock的code value.
4.20. MiTofInterferenceDetecedParams_t¶
-
说明
定义开启“多机对射时的干扰排除”功能所需要的参数
-
定义
typedef struct MiTofInterferenceDetecedParams { MI_S32 (*SensorRestart)(MI_U8 channel); }MiTofInterferenceDetecedParams_t; -
成员
成员 描述 SensorRestart 回调函数指针:关闭shutter->重新设置config_id->shutter.
4.21. MiTofDllFilterParams_t¶
-
说明
定义Dll calibration software config callback params.
-
定义
typedef struct _MiTofDllFilterCode { MI_U16 filter_code; bool selectOn; }MiTofDllFitlerCode_t; -
成员
成员 描述 filter_code 当selectOn为1时,此值才有意义。 selectOn 0:用HW auto Dll;1: 切换到使用“software filter的 dll code”的方法
4.22. MiTofDllFitlerCode_t¶
-
说明
定义Dll calibration software config params.
-
定义
typedef struct _MiTofDllFilterParams { uint8_t filter_gain; //zero:disable dll sw config. non-zero: 8 is good,range:1~16. MI_S32 (*SetDllClibSwConfig)(MI_U8 channel, MiTofDllFitlerCode_t* stFilter_code); }MiTofDllFilterParams_t; -
成员
成员 描述 filter_gain 0:disable the dll calibration sw config function;Non-zero: [1~16]. Gain设置越小,phase越平稳;设置越大,当前帧的x-delay code权重越大,当测量phase发生巨变时,追踪的速度越大。 SetDllClibSwConfig 回调函数指针:用于控制sensor Drv设置相关register. -
注意
请务必根据capability决定要不要开启此功能
4.23. MiTofIntergrationTime_t¶
-
说明
定义积分时间
-
定义
typedef struct _MiTofIntergrationTime { MI_U32 normal_integration_time; //ns MI_U32 hdr_integration_time; //ns void *reserved; }MiTofIntergrationTime_t; -
成员
成员 描述 normal_integration_time normal积分时间 hdr_integration_time timehdr 积分时间
4.24. mi_tof_flip_type¶
-
说明
定义flip type
-
定义
typedef enum { MI_TOF_FLIP_NONE, MI_TOF_FLIP_H, MI_TOF_FLIP_V, MI_TOF_FLIP_HV, MI_TOF_FLIP_NUM, }mi_tof_flip_type; -
成员
成员 描述 MI_TOF_FLIP_NONE none MI_TOF_FLIP_H 水平方向flip MI_TOF_FLIP_V 垂直方向flip MI_TOF_FLIP_HV 水平与垂直方向一起flip MI_TOF_FLIP_NUM num
4.25. mi_tof_rotation_type¶
-
说明
定义rotation type.
-
定义
typedef enum { MI_TOF_ROTATION_0, MI_TOF_ROTATION_90, MI_TOF_ROTATION_180, MI_TOF_ROTATION_270, MI_TOF_ROTATION_NUM, }mi_tof_rotation_type; -
成员
成员 描述 MI_TOF_ROTATION_0 不做旋转 MI_TOF_ROTATION_90 顺时针90°旋转 MI_TOF_ROTATION_180 顺时针180°旋转 MI_TOF_ROTATION_270 顺时针270°旋转 MI_TOF_ROTATION_NUM Num