/* * 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__