...
|
...
|
@@ -44,86 +44,66 @@ T_JZsdkReturnCode IRC_ParamInit(int height, int width, int frameRate) |
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
|
功能:IRC数据预处理
|
|
|
参数:U8_t *rawData, int dataSize, U16_t **returnData, unsigned int *returnDataSize, struct IRC_param *dealInfo
|
|
|
返回值:T_JZsdkReturnCode
|
|
|
备注:
|
|
|
|
|
|
*/
|
|
|
static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, U16_t *returnData, unsigned int *returnDataSize, struct IRC_param *dealInfo)
|
|
|
static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *rawSize, struct IRC_param *dealInfo)
|
|
|
{
|
|
|
T_JZsdkReturnCode ret;
|
|
|
|
|
|
//无图像
|
|
|
if (rawData == NULL || dealInfo == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("irc数据预处理失败,参数错误");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
//合成像素,u8转换合并成u16
|
|
|
ret = JZsdk_Merge_U8_to_U16_byReverse(rawData, dataSize, returnData, returnDataSize);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS || *returnDataSize != dealInfo->PixelNum)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("像素合成失败, ret:0x%x dataSize:%d returnDataSize:%d PixelNum:%d", ret, dataSize,*returnDataSize, dealInfo->PixelNum);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//数据检查
|
|
|
for (int i = 0; i < *returnDataSize; i++)
|
|
|
for (int i = 0; i < *rawSize; i++)
|
|
|
{
|
|
|
if (returnData[i] > dealInfo->ExpectedMax)
|
|
|
if (rawData[i] > dealInfo->ExpectedMax)
|
|
|
{
|
|
|
returnData[i] = dealInfo->ExpectedMax;
|
|
|
rawData[i] = dealInfo->ExpectedMax;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
手动盲点纠正部分
|
|
|
手动盲点纠正默认打开
|
|
|
*/
|
|
|
/*************************************手动盲点部分******************************************************************/
|
|
|
|
|
|
//手动盲点处理
|
|
|
if (dealInfo->BlindNum > 0)
|
|
|
{
|
|
|
JZsdk_CutBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->Blind, dealInfo->BlindNum,dealInfo->BadPixelExtern, 1);
|
|
|
JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->Blind, dealInfo->BlindNum,dealInfo->BadPixelExtern, 1);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
自动盲点纠正部分
|
|
|
*/
|
|
|
/*************************************自动盲点部分******************************************************************/
|
|
|
//如果自动盲点纠正已打开
|
|
|
if (dealInfo->AutoBadPixelReset == JZ_FLAGCODE_ON)
|
|
|
{
|
|
|
JZsdk_RawCheckisBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, &dealInfo->BadPixelNum);
|
|
|
//检查自动盲点的位置
|
|
|
JZsdk_RawCheckisBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, &dealInfo->BadPixelNum);
|
|
|
|
|
|
//关闭自动盲点校正
|
|
|
dealInfo->AutoBadPixelReset = JZ_FLAGCODE_OFF;
|
|
|
}
|
|
|
|
|
|
//盲元纠正
|
|
|
//如果自动盲点校正已打开
|
|
|
if (dealInfo->AutoBadPixel_flag == JZ_FLAGCODE_ON)
|
|
|
{
|
|
|
JZsdk_CutBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);
|
|
|
//对数据进行自动盲点校正
|
|
|
JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
两点纠正部分
|
|
|
*/
|
|
|
//如果开启了低温循环标定
|
|
|
/*************************************两点纠正部分******************************************************************/
|
|
|
//如果开启了低温循环标定,计算低温循环数据
|
|
|
if (dealInfo->LowT_flag != JZ_FLAGCODE_OFF)
|
|
|
{
|
|
|
IRC_LowT_CycleCalibration(returnData, dealInfo);
|
|
|
IRC_LowT_CycleCalibration(rawData, dealInfo);
|
|
|
}
|
|
|
|
|
|
//如果开启了高温循环标定
|
|
|
|
|
|
//如果开启了高温循环标定,计算高温循环数据
|
|
|
if (dealInfo->HighT_flag != JZ_FLAGCODE_OFF)
|
|
|
{
|
|
|
IRC_HighT_CycleCalibration(returnData, dealInfo);
|
|
|
IRC_HighT_CycleCalibration(rawData, dealInfo);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
单点纠正部分
|
|
|
*/
|
|
|
|
|
|
/*************************************单点纠正部分******************************************************************/
|
|
|
//单点校正spc如果未进行过数据的标定,则进行一次
|
|
|
if (dealInfo->FirstSPC_flag == JZ_FLAGCODE_OFF)
|
|
|
{
|
...
|
...
|
@@ -155,7 +135,7 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, |
|
|
{
|
|
|
JZSDK_LOG_INFO("SPC重置标定");
|
|
|
|
|
|
memcpy(dealInfo->SPC_Mark_Data, returnData, dealInfo->PixelNum * sizeof(U16_t));
|
|
|
memcpy(dealInfo->SPC_Mark_Data, rawData, dealInfo->PixelNum * sizeof(U16_t));
|
|
|
|
|
|
//保存spc标定点
|
|
|
IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
|
...
|
...
|
@@ -163,25 +143,8 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, |
|
|
dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF;
|
|
|
}
|
|
|
|
|
|
//备注:这部分使用我们自己的库才要这样做
|
|
|
//如果开启了spc单点校正
|
|
|
if(dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC && dealInfo->DealWay == IRC_DEALMODE_JZSDK)
|
|
|
{
|
|
|
//计算spc参数(后续要改成只计算一次,总不能每帧都计算吧)
|
|
|
if (dealInfo->SPC_mode == 0 && dealInfo->LowT_NineFrame_Avg != NULL)
|
|
|
{
|
|
|
IRC_SPC_ParamCorrect(dealInfo, dealInfo->LowT_NineFrame_Avg);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);
|
|
|
}
|
|
|
}
|
|
|
/*************************************气体增强部分,标记气体增图像图像******************************************************************/
|
|
|
|
|
|
/*
|
|
|
气体增强部分
|
|
|
标记气体增图像图像
|
|
|
*/
|
|
|
//如果开启气体增强时,未标记过气体画面,则标记
|
|
|
if (dealInfo->OutputPixelColorMode == 2 && dealInfo->First_DGCE_flag == JZ_FLAGCODE_OFF)
|
|
|
{
|
...
|
...
|
@@ -194,14 +157,13 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, |
|
|
if (dealInfo->DGCE_ResetFlag == JZ_FLAGCODE_ON)
|
|
|
{
|
|
|
JZSDK_LOG_INFO("气体增强重置标定");
|
|
|
memcpy(dealInfo->DGCE_Mark_Data, returnData, dealInfo->PixelNum * sizeof(U16_t));
|
|
|
memcpy(dealInfo->DGCE_Mark_Data, rawData, dealInfo->PixelNum * sizeof(U16_t));
|
|
|
dealInfo->DGCE_ResetFlag = JZ_FLAGCODE_OFF;
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
|
|
|
{
|
|
|
return (x + y*width);
|
...
|
...
|
@@ -398,35 +360,33 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param |
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
功能:IRC 帧处理
|
|
|
参数:
|
|
|
返回值:T_JZsdkReturnCode
|
|
|
备注:
|
|
|
/****************************
|
|
|
|
|
|
*/
|
|
|
T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize)
|
|
|
{
|
|
|
//1、数据预处理(将红外相机的8位数据,合成为16位数据,移除盲点,并记录标定点)
|
|
|
U16_t *U16_data = (U16_t *)malloc(dataSize/2 * sizeof(U16_t));
|
|
|
unsigned int U16_dataSize = 0;
|
|
|
IRC_data_PreliminaryDeal(rawData , dataSize, U16_data, &U16_dataSize, g_IRC_Param);
|
|
|
功能:IRC 帧处理
|
|
|
参数:
|
|
|
返回值:T_JZsdkReturnCode
|
|
|
备注:
|
|
|
|
|
|
//printf("预处理完成\n");
|
|
|
* *************/
|
|
|
T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize)
|
|
|
{
|
|
|
//1、数据预处理(移除数据的盲点,并记录标定数据)
|
|
|
IRC_data_PreliminaryDeal(rawData , &dataSize, g_IRC_Param);
|
|
|
|
|
|
//2、数据前处理,将原始数据和16位数据 合成为rgb数据
|
|
|
U8_t *RGB_data = NULL;
|
|
|
unsigned int RGB_dataSize = 0;
|
|
|
|
|
|
//选择前处理的方式
|
|
|
switch (g_IRC_Param->DealWay)
|
|
|
{
|
|
|
case IRC_DEALMODE_KTLIB:
|
|
|
KtLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
|
|
|
KtLib_DataDeal(rawData, dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
|
|
|
break;
|
|
|
|
|
|
case IRC_DEALMODE_JZSDK:
|
|
|
JZIrcLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
|
|
|
JZIrcLib_DataDeal(rawData, dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
|
|
|
break;
|
|
|
|
|
|
default:
|
...
|
...
|
@@ -434,8 +394,6 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u |
|
|
break;
|
|
|
}
|
|
|
|
|
|
//printf("前处理完成\n");
|
|
|
|
|
|
//3、数据后处理,在rgb数据上,进行图像处理
|
|
|
IRC_Postdeal(RGB_data, g_IRC_Param);
|
|
|
|
...
|
...
|
@@ -458,7 +416,6 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u |
|
|
}
|
|
|
|
|
|
//printf("输出yuv\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
/*****************
|
...
|
...
|
@@ -467,18 +424,12 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u |
|
|
* 如果码流类型要求为rgb888
|
|
|
*
|
|
|
* **********************/
|
|
|
if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_RGB888)
|
|
|
else if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_RGB888)
|
|
|
{
|
|
|
*outData = RGB_data;
|
|
|
*outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3;
|
|
|
}
|
|
|
|
|
|
//5、数据释放
|
|
|
if (U16_data != NULL)
|
|
|
{
|
|
|
JZsdk_Free((void *)U16_data);
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
...
|
...
|
@@ -980,7 +931,7 @@ static T_JZsdkReturnCode IRC_Set_HighTempData(struct IRC_param *dealInfo) |
|
|
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_INFO("外置高温数据录入成功");
|
|
|
return ret;
|
|
|
dealInfo->Factory_HighT_Mark_Data_flag = JZ_FLAGCODE_ON;
|
|
|
}
|
|
|
|
|
|
//失败了录入 本地数据
|
...
|
...
|
@@ -989,11 +940,11 @@ static T_JZsdkReturnCode IRC_Set_HighTempData(struct IRC_param *dealInfo) |
|
|
{
|
|
|
JZSDK_LOG_ERROR("没有本地高温数据数据,打开录入标志");
|
|
|
dealInfo->HighT_flag = JZ_FLAGCODE_ON; //打开录入标志
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
JZSDK_LOG_INFO("本地高温数据录入成功");
|
|
|
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_INFO("本地高温数据录入成功");
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
...
|
...
|
@@ -1010,7 +961,7 @@ static T_JZsdkReturnCode IRC_Set_LowTempData(struct IRC_param *dealInfo) |
|
|
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_INFO("外置低温数据录入成功");
|
|
|
return ret;
|
|
|
dealInfo->Factory_LowT_Mark_Data_flag = JZ_FLAGCODE_ON;
|
|
|
}
|
|
|
|
|
|
//失败了录入 本地数据
|
...
|
...
|
@@ -1020,8 +971,10 @@ static T_JZsdkReturnCode IRC_Set_LowTempData(struct IRC_param *dealInfo) |
|
|
JZSDK_LOG_ERROR("没有本地低温数据数据,打开录入标志");
|
|
|
dealInfo->LowT_flag = JZ_FLAGCODE_ON; //打开录入标志
|
|
|
}
|
|
|
|
|
|
JZSDK_LOG_INFO("本地低温数据录入成功");
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_INFO("本地低温数据录入成功");
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
...
|
...
|
@@ -1155,20 +1108,33 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in |
|
|
JZSDK_LOG_ERROR("SPC_Mark_Data注册失败");
|
|
|
}
|
|
|
|
|
|
//填入本地高温数据
|
|
|
ret = IRC_Set_HighTempData(IrcDealCfg);
|
|
|
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
IrcDealCfg->Factory_HighT_Mark_Data = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t));
|
|
|
if (IrcDealCfg->Factory_HighT_Mark_Data == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_INFO("本地高温数据 0:%d 1:%d 2:%d", IrcDealCfg->HighT_NineFrame_Avg[2550], IrcDealCfg->HighT_NineFrame_Avg[2551], IrcDealCfg->HighT_NineFrame_Avg[2552]);
|
|
|
JZSDK_LOG_ERROR("Factory_HighT_Mark_Data注册失败");
|
|
|
}
|
|
|
|
|
|
IrcDealCfg->Factory_HighT_Mark_Data_flag = JZ_FLAGCODE_OFF;
|
|
|
|
|
|
//填入低温数据
|
|
|
ret = IRC_Set_LowTempData(IrcDealCfg);
|
|
|
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
IrcDealCfg->Factory_LowT_Mark_Data = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t));
|
|
|
if (IrcDealCfg->Factory_LowT_Mark_Data == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_INFO("本地低温数据 0:%d 1:%d 2:%d", IrcDealCfg->LowT_NineFrame_Avg[2550], IrcDealCfg->LowT_NineFrame_Avg[2551], IrcDealCfg->LowT_NineFrame_Avg[2552]);
|
|
|
JZSDK_LOG_ERROR("Factory_LowT_Mark_Data注册失败");
|
|
|
}
|
|
|
IrcDealCfg->Factory_LowT_Mark_Data_flag = JZ_FLAGCODE_OFF;
|
|
|
|
|
|
/*******************************************************************************************
|
|
|
*
|
|
|
* 加载文件数据
|
|
|
*
|
|
|
*
|
|
|
**********************************************************************************************/
|
|
|
|
|
|
|
|
|
//填入高温数据
|
|
|
IRC_Set_HighTempData(IrcDealCfg);
|
|
|
|
|
|
//填入低温数据
|
|
|
IRC_Set_LowTempData(IrcDealCfg);
|
|
|
|
|
|
//获取markdata的本地数据
|
|
|
ret = IRC_LocalFrame_DataRead(SPC_MARK_DATA, IrcDealCfg);
|
...
|
...
|
|