/* * 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); /* =============================================================================================================================================================================== */ /* LDCH + FEC(scale)--³õʼ»¯: 1£©LDCHµÄͼÏñ¿í¸ß: ldchW, ldchH, Èç: 3840*2160 2£©¶ÔÊäÈëFECµÄͼÏñ×öËõ·Å, Èç: 3840*2160 --> Ëõ·Åµ½1920*1080 i)×öËõ·ÅºóµÄFECµÄͼÏñ¿í¸ß: fecW, fecH */ void genScaleMeshInit(int ldchW, int ldchH, int fecW, int fecH, LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2); /* LDCH + FEC(scale)--·´³õʼ»¯ */ void genScaleMeshDeInit(LdchParams &ldchParams, FecParams &fecParams); /* LDCH + FEC(scale)--mesh ÄÚ´æÉêÇë */ void mallocScaleMesh(int ldchMeshSize, unsigned short **pLdchMeshX, int fecMeshSize, unsigned short **pFecMeshXI, unsigned char **pFecMeshXF, unsigned short **pFecMeshYI, unsigned char **pFecMeshYF); /* LDCH + FEC(scale)--mesh ÄÚ´æÊÍ·Å */ void freeScaleMesh(unsigned short *pLdchMeshX, unsigned short *pFecMeshXI, unsigned char *pFecMeshXF, unsigned short *pFecMeshYI, unsigned char *pFecMeshYF); /* LDCH + FEC(scale): º¯Êý¹¦ÄÜ: Éú³ÉmeshÓ³Éä±í, ÓÃÓÚISPµÄLDCH(x·½Ïò)ºÍFEC(y·½Ïò) ÊäÈë: 1£©LDCH&FECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: LdchParams &ldchParams, FecParams &fecParams 2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff 3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%) Êä³ö: 1£©bool ÊÇ·ñ³É¹¦Éú³É 2£©LDCHÓ³Éä±í: pMeshX 3£©FECÓ³Éä±í: pMeshXI, pMeshXF, pMeshYI, pMeshYF */ bool genScaleMeshNLevel(LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2, int level, unsigned short *pMeshX, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF); /* =============================================================================================================================================================================== */ /* LDCH + FEC(crop + scale)--³õʼ»¯: ÊäÈë: 1£©LDCHµÄͼÏñ¿í¸ß: ldchW, ldchH, Èç: 3840*2160 2£©¶ÔÊäÈëFECµÄͼÏñÏÈÔÚÈÎÒâλÖÃ(pW,pH)cropµÃµ½ÈÎÒâsize(roiW*roiH), ÔÙ×öËõ·Å, Èç: 3840*2160 --> ÔÚ(100,100)µã´¦½øÐÐcropµÃµ½(1600*900) --> Ëõ·Åµ½1920*1080 i) cropµÄÆðʼµãλÖÃ: pW, pH ii) cropÇøÓòµÄ¿í¸ß: roiW, roiH iii)×öËõ·ÅºóµÄFECµÄͼÏñ¿í¸ß: fecW, fecH */ void genCropScaleMeshInit(int ldchW, int ldchH, double pW, double pH, int roiW, int roiH, int fecW, int fecH, LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2); /* LDCH + FEC(crop + scale)--·´³õʼ»¯ */ void genCropScaleMeshDeInit(LdchParams &ldchParams, FecParams &fecParams); /* LDCH + FEC(crop + scale)--mesh ÄÚ´æÉêÇë */ void mallocCropScaleMesh(int ldchMeshSize, unsigned short **pLdchMeshX, int fecMeshSize, unsigned short **pFecMeshXI, unsigned char **pFecMeshXF, unsigned short **pFecMeshYI, unsigned char **pFecMeshYF); /* LDCH + FEC(crop + scale)--mesh ÄÚ´æÊÍ·Å */ void freeCropScaleMesh(unsigned short *pLdchMeshX, unsigned short *pFecMeshXI, unsigned char *pFecMeshXF, unsigned short *pFecMeshYI, unsigned char *pFecMeshYF); /* LDCH + FEC(crop + scale): º¯Êý¹¦ÄÜ: Éú³ÉmeshÓ³Éä±í, ÓÃÓÚISPµÄLDCH(x·½Ïò)ºÍFEC(y·½Ïò) ÊäÈë: 1£©LDCH&FECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: LdchParams &ldchParams, FecParams &fecParams 2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff 3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%) Êä³ö: 1£©bool ÊÇ·ñ³É¹¦Éú³É 2£©LDCHÓ³Éä±í: pMeshX 3£©FECÓ³Éä±í: pMeshXI, pMeshXF, pMeshYI, pMeshYF */ bool genCropScaleMeshNLevel(LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2, int level, unsigned short *pMeshX, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF); #endif // !__GENMESH_H__