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