/* * Copyright (c) 2020 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef __GENMESH_H__ #define __GENMESH_H__ #define INV_POLY_COEFF_NUM 21 /* 多项式系数个数, 最高次数(INV_POLY_COEFF_NUM-1)次 */ enum RKALGO_LDCH_VERSION_E { RKALGO_LDCH_VERSION_0 = 0, /* old version: for rv1109,rv1126,rk356x,rk3588 */ RKALGO_LDCH_VERSION_1 = 1, /* new version: for 1106,rk3562 */ RKALGO_LDCH_VERSION_BUTT }; /* 相机参数 */ struct CameraCoeff { double cx, cy; /* 镜头的光心 */ double a0, a2, a3, a4; /* 镜头的畸变系数 */ double c, d, e; /* 内参[c d;e 1] */ double sf; /* sf控制视角, sf越大视角越大 */ /* level = 0时的rho-tanTheta多项式拟合 */ int invPolyTanNum0; /* 拟合后的系数个数 */ double invPolyTanCoeff0[INV_POLY_COEFF_NUM]; /* 多项式系数, 最高次数(INV_POLY_COEFF_NUM-1)次 */ /* level = 0时的rho-cotTheta多项式拟合 */ int invPolyCotNum0; /* 拟合后的系数个数 */ double invPolyCotCoeff0[INV_POLY_COEFF_NUM]; /* 多项式系数, 最高次数(INV_POLY_COEFF_NUM-1)次 */ /* level = 255时的rho-tanTheta多项式拟合 */ int invPolyTanNum255; /* 拟合后的系数个数 */ double invPolyTanCoeff255[INV_POLY_COEFF_NUM]; /* 多项式系数, 最高次数(INV_POLY_COEFF_NUM-1)次 */ /* level = 255时的rho-cotTheta多项式拟合 */ int invPolyCotNum255; /* 拟合后的系数个数 */ double invPolyCotCoeff255[INV_POLY_COEFF_NUM]; /* 多项式系数, 最高次数(INV_POLY_COEFF_NUM-1)次 */ }; /* 生成FEC映射表相关的参数 */ struct FecParams { int correctX; /* 水平x方向校正: 1代表校正, 0代表不校正 */ int correctY; /* 垂直y方向校正: 1代表校正, 0代表不校正 */ int saveMaxFovX; /* 保留水平x方向最大FOV: 1代表保留, 0代表不保留 */ int isFecOld; /* 是否旧版FEC: 1代表是,0代表不是 */ int saveMesh4bin; /* 是否保存meshxi,xf,yi,yf4个bin文件:1代表保存, 0代表不保存 */ char mesh4binPath[256]; /* 保存meshxi,xf,yi,yf4个bin文件的路径 */ int srcW, srcH, dstW, dstH; /* 输入输出图像的分辨率 */ int srcW_ex, srcH_ex, dstW_ex, dstH_ex; /* 扩展后的输入输出分辨率 */ double cropStepW[2000], cropStepH[2000]; double cropStartW[2000], cropStartH[2000]; int meshSizeW, meshSizeH; double meshStepW, meshStepH; int meshSize1bin; int meshSize4bin; unsigned short SpbNum; unsigned long MeshPointNumW; unsigned short SpbMeshPNumH; unsigned short LastSpbMeshPNumH; unsigned short *pMeshXY; }; /* 生成LDCH映射表相关的参数 */ struct LdchParams { int saveMaxFovX; /* 保留水平x方向最大FOV: 1代表保留, 0代表不保留 */ RKALGO_LDCH_VERSION_E enLdchVersion; /* LDCH版本 */ int saveMeshX; /* 是否保存MeshX.bin文件: 1代表保存, 0代表不保存 */ char meshPath[256]; /* 保存MeshX.bin文件的路径 */ int srcW, srcH, dstW, dstH; /* 输入输出图像的分辨率 */ int meshSizeW, meshSizeH; double meshStepW, meshStepH; int mapxFixBit; /* 定点化左移位数 */ int meshSize; int maxLevel; double *mapx; double *mapy; }; /* =============================================================================================================================================================================== */ /* FEC: 初始化, 根据图像输出分辨率, 计算FEC映射表的相关参数, 申请需要的buffer */ void genFecMeshInit(int srcW, int srcH, int dstW, int dstH, FecParams &fecParams, CameraCoeff &camCoeff); /* FEC: 反初始化 */ void genFecMeshDeInit(FecParams &fecParams); /* FEC: 预先计算的部分: 浮点未校正的小表和level=0,level=255的多项式参数 */ void genFecPreCalcPart(FecParams &fecParams, CameraCoeff &camCoeff); /* FEC: 4个mesh 内存申请 */ void mallocFecMesh(int meshSize, unsigned short **pMeshXI, unsigned char **pMeshXF, unsigned short **pMeshYI, unsigned char **pMeshYF); /* FEC: 4个mesh 内存释放 */ void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF); /* 函数功能: 生成不同校正程度的mesh映射表, 用于ISP的FEC模块 输入: 1)FEC映射表的相关参数, 申请需要的buffer: FecParams &fecParams 2)相机标定参数: CameraCoeff &camCoeff 3)需要校正的程度: level(0-255: 0表示校正程度为0%, 255表示校正程度为100%) 输出: 1)bool 是否成功生成 2)pMeshXI, pMeshXF, pMeshYI, pMeshYF */ bool genFECMeshNLevel(FecParams &fecParams, CameraCoeff &camCoeff, int level, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF); /* =============================================================================================================================================================================== */ /* LDCH: 初始化, 根据图像输出分辨率, 计算LDCH映射表的相关参数, 申请需要的buffer */ void genLdchMeshInit(int srcW, int srcH, int dstW, int dstH, LdchParams &ldchParams, CameraCoeff &camCoeff); /* LDCH: 反初始化 */ void genLdchMeshDeInit(LdchParams &ldchParams); /* LDCH: 预先计算的部分: 浮点未校正的小表和level=0,level=255的多项式参数 */ void genLdchPreCalcPart(LdchParams &ldchParams, CameraCoeff &camCoeff); /* LDCH: 计算LDCH能够校正的最大程度 */ void calcLdchMaxLevel(LdchParams &ldchParams, CameraCoeff &camCoeff); /* 函数功能: 生成不同校正程度的mesh映射表, 用于ISP的LDCH模块 输入: 1)LDCH映射表的相关参数, 申请需要的buffer: LdchParams &ldchParams 2)相机标定参数: CameraCoeff &camCoeff 3)需要校正的程度: level(0-255: 0表示校正程度为0%, 255表示校正程度为100%) 输出: 1)bool 是否成功生成 2)pMeshX */ bool genLDCMeshNLevel(LdchParams &ldchParams, CameraCoeff &camCoeff, int level, unsigned short *pMeshX); /* =============================================================================================================================================================================== */ /* 输出图像的ROI区域相关参数 */ struct RoiParams { int startW; /* ROI区域的起始点 */ int startH; int roiW; /* ROI区域的宽高 */ int roiH; }; /* 根据输出图像的ROI参数,对FEC mesh进行裁剪, 得到最终需求的尺寸 */ bool cropFecMesh(FecParams &fecParams, RoiParams &roiParams, int level, unsigned short *pCropMeshXI, unsigned char *pCropMeshXF, unsigned short *pCropMeshYI, unsigned char *pCropMeshYF); /* 根据输出图像的ROI参数,对LDCH mesh进行裁剪, 得到最终需求的尺寸 */ bool cropLdchMesh(LdchParams &ldchParams, RoiParams &roiParams, int level, unsigned short *pMeshX, unsigned short *pRoiMeshX); /* FEC: 初始化, 用于8k ---> 2个4k */ void genFecMeshInit8kTo4k(int srcW, int srcH, int dstW, int dstH, int margin, CameraCoeff &camCoeff, CameraCoeff &camCoeff_left, CameraCoeff &camCoeff_right, FecParams &fecParams, FecParams &fecParams_left, FecParams &fecParams_right); /* LDCH: 8k ---> 2个4k */ void genLdchMeshInit8kTo4k(int srcW, int srcH, int dstW, int dstH, int margin, CameraCoeff &camCoeff, CameraCoeff &camCoeff_left, CameraCoeff &camCoeff_right, LdchParams &ldchParams, LdchParams &ldchParams_left, LdchParams &ldchParams_right); #endif // !__GENMESH_H__