一、说明
锅盖是什么
锅盖的类型有哪些
二、去锅盖处理流程
去锅盖算法首先需要采集一份锅盖模板数据,该模板数据用户可以自定义保存,方便后面的开机重启直接导入使用。去锅盖处理包含两个历程:保存锅盖模板;去锅盖处理。
保存锅盖模板:
( 1 ) 打开采集锅盖模板开关。使用操作类型 ITA_POTCOVER_SET_CALMODEL 。
( 2 ) 对着均匀面采集数据用来计算锅盖模板。
( 3 ) 保 存 锅 盖 模 板 数 据 , 用 户 自 定 义 保 存 。 使 用 操 作 类 型
ITA_POTCOVER_GET_MODEL 。
去锅盖处理:
( 1 ) 重启或者开机时,首先导入事先保存的锅盖模板。使用操作类型ITA_POTCOVER_SET_MODEL。
( 2 ) 设置去锅盖算法类型。使用操作类型 ITA_POTCOVER_SET_ALGOTYPE 。
( 3 ) 打开去锅盖算法开关。使用操作类型 ITA_POTCOVER_SET 。
锅盖算法选择依据:
( 1 ) 如 果 锅 盖 任 何 情 况 下 都 有 且 严 重 程 序 差 不 多 , 就 选 择 第 一 种 ITA_POTCOVER_FIX;
( 2 ) 如果锅盖冷机没有,热机有,选择第二种 ITA_POTCOVER_VAR1 。
( 3 ) 如果锅盖打快门会消失,然后慢慢出现,就选择第三种 ITA_POTCOVER_VAR2。
三、代码
3.1 ITA的去锅盖API及接口类型说明
/**
* @brief: 去锅盖操作。
* @param: HANDLE_T instance ITA实例。
* @param: ITA_GUOGAI_OP_TYPE type 用户去锅盖的操作类型。
* @param: void *param 参数值,传地址。类型参考ITA_POTCOVER_OP_TYPE的注释。
* @return: 返回值类型:ITA_RESULT。成功,返回ITA_OK;失败,返回值<0,参考ERROR.h。
**/
ITA_API ITA_RESULT ITA_PotCoverRestrain(HANDLE_T instance, ITA_POTCOVER_OP_TYPE type, void* para);typedef enum ITAPotCoverType
{ITA_POTCOVER_GET_MODEL,//获取锅盖模板数据。用户可以自己进行保存,方便后面使用。参数类型:ITA_POTCOVER_MODEL_DATAITA_POTCOVER_SET_MODEL,//设置锅盖模板数据。参数类型:ITA_POTCOVER_MODEL_DATAITA_POTCOVER_SET_CALMODEL,//设置计算锅盖模板开关,参数类型:ITA_SWITCH,默认值是ITA_DISABLE。ITA_POTCOVER_GET_CALMODEL,//获取计算锅盖模型开关,参数类型:ITA_SWITCHITA_POTCOVER_SET_ALGOTYPE,//设置锅盖算法类型,参数类型:ITA_POTCOVER_ALGO_TYPE,默认值是ITA_POTCOVER_FIX。ITA_POTCOVER_GET_ALGOTYPE,//获取锅盖算法类型,参数类型:ITA_POTCOVER_ALGO_TYPE。ITA_POTCOVER_SET,//设置锅盖算法开关,参数类型:ITA_SWITCH,默认值是ITA_DISABLE。ITA_POTCOVER_GET//获取锅盖算法开关,参数类型:ITA_SWITCH。
}ITA_POTCOVER_OP_TYPE;
3.2 isp框架中的实现逻辑和函数封装
GSDT_RET INFRA_PLAT_PotCover_Set(IN INT PipeNr)
{INFRA_VREG_S *pstVreg = ISP_INFRA_Get_VregInfo(PipeNr);HANDLE_T hInfra = pstVreg->stPlatInfo.hInfra;ITA_SWITCH para1 = ITA_ENABLE;int width = 256;int height = 192;int len = width * height;//锅盖模板数据对象short* modelData = (short*)malloc(len * sizeof(short));memset(modelData, 0, len * sizeof(short));ITAPotcoverModelData model_data;memset(&model_data, 0, sizeof(ITAPotcoverModelData));model_data.width = width;model_data.height = height;model_data.modelData = modelData;//使用标定数据FILE *fpRaw;fpRaw = fopen("/data/guogaiModel.raw", "rb");if (NULL == fpRaw){ISP_Err("open /data/guogaiModel.raw faild.");}fread(model_data.modelData, sizeof(short), len, fpRaw);fclose(fpRaw);//1.打开采集锅盖模板开关ITA_PotCoverRestrain(hInfra, ITA_POTCOVER_SET_CALMODEL, ¶1);ITA_PotCoverRestrain(hInfra, ITA_POTCOVER_GET_CALMODEL, ¶1);//2.开机时,导入保存锅盖模板数据。ITA_PotCoverRestrain(hInfra, ITA_POTCOVER_SET_MODEL, &model_data);//3.设置去锅盖算法类型,这里默认使用算法int type = ITA_POTCOVER_VAR2;ITA_PotCoverRestrain(hInfra, ITA_POTCOVER_SET_ALGOTYPE, &type);//4.打开去锅盖算法开关ITA_PotCoverRestrain(hInfra, ITA_POTCOVER_SET, ¶1);return GSDT_R_SUCCESS;
}
3.2 isp框架中的功能调用
GSDT_RET INFRA_PLAT_Init(IN INT PipeNr)
{
...
...
...// //显示debug信息ITA_SWITCH itaParam = ITA_ENABLE;ITA_Debugger(pstPlatInfo->hInfra, ITA_SET_DEBUGGING, &itaParam);// //log中显示算法耗时BOOL bParam = BOOL_TRUE;ITA_Debugger(pstPlatInfo->hInfra, ITA_SET_ALGORCOSTTIME, &bParam);// //neon加速ITA_Accelerate(pstPlatInfo->hInfra, ITA_ACCELERATE_NEON);format = ITA_RGBA8888;ret = ITA_ImageControl(pstPlatInfo->hInfra, ITA_SET_FORMAT, (void *)&format);// //伪彩功能Ret = INFRA_PLAT_ALG_FalseColor_Init();// //INFRA_PLAT_CfgUpdate(PipeNr);// // 去锅盖Ret = INFRA_PLAT_PotCover_Set(PipeNr);INFRA_PLAT_DRV_TempAdcInit(PipeNr);return GSDT_R_SUCCESS;
}
3.3 main函数
int main(int argc, char *argv[])
{...stReg.stInfraReg.pfn_send_data = get_yuv;stReg.stInfraReg.pfn_send_hist = get_hist;ISP_Function_Start();ISP_Function_Register(&stReg);
...while(1){if (vs_mal_vii_pipe_frame_acquire(0, &src_frame, &frame_num, 1000) == VS_SUCCESS){// printf("%s %d rece frame id %d\n", __FUNCTION__, __LINE__, src_frame.frame.id);stFrame.id = src_frame.frame.id;stFrame.timestamp = src_frame.frame.pts;src_frame.frame.virt_addr[0] = (vs_uint64_t)vs_mal_sys_mmap(src_frame.frame.phys_addr[0], src_frame.frame.width * src_frame.frame.height * 2);stFrame.virFrameAddr[0] = (VOID *)src_frame.frame.virt_addr[0];// fwrite(stFrame.virFrameAddr[0], 256*192*2, 1, fpRaw);// fflush(fpRaw);ret = ISP_INFRA_ReceiveData(1, &stFrame);if (ret) printf("%s %d ret %d\n", __FUNCTION__, __LINE__, ret);vs_mal_sys_unmap(src_frame.frame.virt_addr[0], src_frame.frame.width * src_frame.frame.height * 2);stFrame.virFrameAddr[0] = NULL;vs_mal_vii_pipe_frame_release(0, &src_frame, frame_num);}else{usleep(1000*10);}}ISP_Function_Exit();
}