/*
|
* 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)´Î */
|
|
/* Ïà»ú²ÎÊý */
|
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´ú±í²»±£Áô */
|
int isLdchOld; /* ÊÇ·ñ¾É°æLDCH: 1´ú±íÊÇ£¬0´ú±í²»ÊÇ */
|
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__
|