hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "genMesh.h"
#include <iostream>
#include <math.h>
//#include <cmath>
 
/* FEC: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãFECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */
void genFecMeshInit(int srcW, int srcH, int dstW, int dstH, FecParams &fecParams, CameraCoeff &camCoeff)
{
   fecParams.srcW = srcW;
   fecParams.srcH = srcH;
   fecParams.dstW = dstW;
   fecParams.dstH = dstH;
   /* À©Õ¹¶ÔÆë */
   fecParams.srcW_ex = 32 * ((srcW + 31) / 32);
   fecParams.srcH_ex = 32 * ((srcH + 31) / 32);
   fecParams.dstW_ex = 32 * ((dstW + 31) / 32);
   fecParams.dstH_ex = 32 * ((dstH + 31) / 32);
   /* Ó³Éä±íµÄ²½³¤ */
   int meshStepW, meshStepH;
   if (dstW > 1920) { //32x16
       meshStepW = 32;
       meshStepH = 16;
   }
   else { //16x8
       meshStepW = 16;
       meshStepH = 8;
   }
   /* Ó³Éä±íµÄ¿í¸ß */
   fecParams.meshSizeW = (fecParams.dstW_ex + meshStepW - 1) / meshStepW + 1;//modify to mesh alligned to 32x32
   fecParams.meshSizeH = (fecParams.dstH_ex + meshStepH - 1) / meshStepH + 1;//modify to mesh alligned to 32x32
 
   /* mesh±í½µ²ÉÑùµÄ²½³¤ */
   fecParams.meshStepW = meshStepW;
   fecParams.meshStepH = meshStepH;
   //fecParams.meshStepW = double(dstW) / double(fecParams.meshSizeW);
   //fecParams.meshStepH = double(dstH) / double(fecParams.meshSizeH);
 
   /* MeshXYµÄ´óС */
   fecParams.meshSize1bin = fecParams.meshSizeW * fecParams.meshSizeH;
 
   /* ¶¨µãµÄС±íMeshXY */
   fecParams.pMeshXY = new unsigned short[fecParams.meshSize1bin * 2 * 2];
 
   /* ¼ÆËã4¸ömeshµÄÏà¹Ø²ÎÊý */
   unsigned short SpbMeshPNum = 128 / meshStepH * fecParams.meshSizeW;
   unsigned long MeshNumW;
   int LastSpbH;
   fecParams.SpbNum = (dstH + 128 - 1) / 128;
   MeshNumW = fecParams.dstW_ex / meshStepW;
   fecParams.MeshPointNumW = MeshNumW + 1;
   fecParams.SpbMeshPNumH = 128 / meshStepH + 1;//16x8 -> 17, 32x16 -> 9
   LastSpbH = (fecParams.dstH_ex % 128 == 0) ? 128 : (fecParams.dstH_ex % 128);//modify to mesh alligned to 32x32
   fecParams.LastSpbMeshPNumH = LastSpbH / meshStepH + 1;
   /* 4¸ömeshµÄ´óС */
   fecParams.meshSize4bin = (fecParams.SpbNum - 1) * fecParams.MeshPointNumW * fecParams.SpbMeshPNumH + fecParams.MeshPointNumW * fecParams.LastSpbMeshPNumH;
 
   /* Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */
   genFecPreCalcPart(fecParams, camCoeff);
}
 
/* FEC: ·´³õʼ»¯ */
void genFecMeshDeInit(FecParams &fecParams)
{
   delete[] fecParams.pMeshXY;
}
 
/* FEC: 4¸ömesh ÄÚ´æÉêÇë */
void mallocFecMesh(int meshSize, unsigned short **pMeshXI, unsigned char **pMeshXF, unsigned short **pMeshYI, unsigned char **pMeshYF)
{
   *pMeshXI = new unsigned short[meshSize];
   *pMeshXF = new unsigned char[meshSize];
   *pMeshYI = new unsigned short[meshSize];
   *pMeshYF = new unsigned char[meshSize];
}
 
/* FEC: 4¸ömesh ÄÚ´æÊÍ·Å */
void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF)
{
   delete[] pMeshXI;
   delete[] pMeshXF;
   delete[] pMeshYI;
   delete[] pMeshYF;
}
 
 
/* =============================================================================================================================================================================== */
 
 
/* LDCH: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãLDCHÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */
void genLdchMeshInit(int srcW, int srcH, int dstW, int dstH, LdchParams &ldchParams, CameraCoeff &camCoeff)
{
   ldchParams.srcW = srcW;
   ldchParams.srcH = srcH;
   ldchParams.dstW = dstW;
   ldchParams.dstH = dstH;
 
   int map_scale_bit_X = 4;
   int map_scale_bit_Y = 3;
   /* ¶¨µã»¯×óÒÆÎ»Êý */
   ldchParams.mapxFixBit = 4;
   if (dstW > 4096)
   {
       ldchParams.mapxFixBit = 3;
   }
   // mesh±íµÄ¿í, Èç2688->169
   ldchParams.meshSizeW = ((dstW + (1 << map_scale_bit_X) - 1) >> map_scale_bit_X) + 1;
   // mesh±íµÄ¸ß, Èç1520->191
   ldchParams.meshSizeH = ((dstH + (1 << map_scale_bit_Y) - 1) >> map_scale_bit_Y) + 1;
 
   /* mesh±í½µ²ÉÑùµÄ²½³¤ */
   //ldchParams.meshStepW = double(dstW) / double(ldchParams.meshSizeW - 1);/* ÕâÀï¼õ1ÐèÒªÓ²¼þÉÏÑé֤һϠ*/
   //ldchParams.meshStepH = double(dstH) / double(ldchParams.meshSizeH - 1);
   ldchParams.meshStepW = 16;
   ldchParams.meshStepH = 8;
 
   /* ¶ÔÆëºóµÄ¿í */
   int mapWidAlign = ((ldchParams.meshSizeW + 1) >> 1) << 1;//ÀýÈç, ·Ö±æÂÊ2688*1520, 169->170
   ldchParams.meshSize = mapWidAlign * ldchParams.meshSizeH;
 
   //ldchParams.meshSizeW = mapWidAlign;
 
   /* ¸¡µãµÄmeshÍø¸ñ */
   ldchParams.mapx = new double[ldchParams.meshSize];
   ldchParams.mapy = new double[ldchParams.meshSize];
 
   /* LDCH: Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */
   genLdchPreCalcPart(ldchParams, camCoeff);
 
   /* LDCH: ¼ÆËãLDCHÄܹ»Ð£ÕýµÄ×î´ó³Ì¶È */
   if (ldchParams.isLdchOld)
   {
       calcLdchMaxLevel(ldchParams, camCoeff);
   }
   else
   {
       ldchParams.maxLevel = 255;
   }
}
 
/* LDCH: ·´³õʼ»¯ */
void genLdchMeshDeInit(LdchParams &ldchParams)
{
   delete[] ldchParams.mapx;
   delete[] ldchParams.mapy;
}