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
147
148
 
/* 8kͼ--->2¸ö4kͼ£¬½øÐÐFEC·Ö¼¶Ð£Õý */
void test029()
{
   int srcW = 7680;
   int srcH = 4320;
   int dstW = 7680;
   int dstH = 4320;
   int margin = 256;
 
   /* È«Í¼8kÏà¹Ø²ÎÊý */
   CameraCoeff camCoeff;
   camCoeff.a0 = -4628.92834904855135391699150204658508300781250000000000;
   camCoeff.a2 = 0.00008439805632153267055031026222522427815420087427;
   camCoeff.a3 = -0.00000000947972529654520536345924537060744774485954;
   camCoeff.a4 = 0.00000000000276046059610868196196561020719728129884;
   camCoeff.cx = (srcW - 1.0) * 0.5;
   camCoeff.cy = (srcH - 1.0) * 0.5;
   FecParams fecParams;
   fecParams.correctX = 1;                                /* Ë®Æ½x·½ÏòУÕý: 1´ú±íУÕý, 0´ú±í²»Ð£Õý */
   fecParams.correctY = 1;                                /* ´¹Ö±y·½ÏòУÕý: 1´ú±íУÕý, 0´ú±í²»Ð£Õý */
   fecParams.saveMaxFovX = 1;                            /* ±£Áôˮƽx·½Ïò×î´óFOV: 1´ú±í±£Áô, 0´ú±í²»±£Áô */
   fecParams.isFecOld = 0;                                /* ÊÇ·ñ¾É°æFEC: 1´ú±íÊÇ£¬0´ú±í²»ÊÇ */
   fecParams.saveMesh4bin = 0;                            /* ÊÇ·ñ±£´æmeshxi,xf,yi,yf4¸öbinÎļþ: 1´ú±í±£´æ, 0´ú±í²»±£´æ */
   sprintf(fecParams.mesh4binPath, "../data_out/");    /* ±£´æmeshxi,xf,yi,yf4¸öbinÎļþµÄ¸ùĿ¼ */
 
   /* ×óͼ4kÏà¹Ø²ÎÊý */
   CameraCoeff camCoeff_left;
   FecParams fecParams_left;
   /* ÓÒͼ4kÏà¹Ø²ÎÊý */
   CameraCoeff camCoeff_right;
   FecParams fecParams_right;
   /* LDCHÏà¹Ø²ÎÊý³õʼ»¯ */
   genFecMeshInit8kTo4k(srcW, srcH, dstW, dstH, margin, camCoeff, camCoeff_left, camCoeff_right, fecParams, fecParams_left, fecParams_right);
   /* Ó³Éä±íbufferÉêÇë */
   unsigned short    *pMeshXI, *pMeshYI;                                                                                /* X, YÕûÊý²¿·Ö */
   unsigned char    *pMeshXF, *pMeshYF;                                                                                /* X, YСÊý²¿·Ö */
   mallocFecMesh(fecParams.meshSize4bin, &pMeshXI, &pMeshXF, &pMeshYI, &pMeshYF);                                    /* È«Í¼FECÓ³Éä±íbufferÉêÇë */
   unsigned short    *pMeshXI_left, *pMeshYI_left;                                                                    /* X, YÕûÊý²¿·Ö */
   unsigned char    *pMeshXF_left, *pMeshYF_left;                                                                    /* X, YСÊý²¿·Ö */
   mallocFecMesh(fecParams_left.meshSize4bin, &pMeshXI_left, &pMeshXF_left, &pMeshYI_left, &pMeshYF_left);            /* ×óͼFECÓ³Éä±íbufferÉêÇë */
   unsigned short    *pMeshXI_right, *pMeshYI_right;                                                                    /* X, YÕûÊý²¿·Ö */
   unsigned char    *pMeshXF_right, *pMeshYF_right;                                                                    /* X, YСÊý²¿·Ö */
   mallocFecMesh(fecParams_right.meshSize4bin, &pMeshXI_right, &pMeshXF_right, &pMeshYI_right, &pMeshYF_right);    /* ÓÒͼFECÓ³Éä±íbufferÉêÇë */
 
   /* ÊäÈëÊä³öͼÏñbufferÉêÇë */
   /* È«Í¼ */
   unsigned long srcSize = (srcW * srcH) > (dstW * dstH) ? (srcW * srcH) : (dstW * dstH);
   unsigned char *pImgY = new unsigned char[srcSize];
   unsigned char *pImgUV = new unsigned char[srcSize];
   unsigned char *pImgOut = new unsigned char[srcSize * 2];
   /* ×óͼ */
   int srcW_left = srcW * 0.5 + margin;
   int srcH_left = srcH;
   int dstW_left = srcW * 0.5 + margin;
   int dstH_left = srcH;
   unsigned long srcSize_left = (srcW_left * srcH_left) > (dstW_left * dstH_left) ? (srcW_left * srcH_left) : (dstW_left * dstH_left);
   unsigned char *pImgY_left = new unsigned char[srcSize_left];
   unsigned char *pImgUV_left = new unsigned char[srcSize_left];
   unsigned char *pImgOut_left = new unsigned char[srcSize_left * 2];
   /* ÓÒͼ */
   int srcW_right = srcW * 0.5 + margin;
   int srcH_right = srcH;
   int dstW_right = srcW * 0.5 + margin;
   int dstH_right = srcH;
   unsigned long srcSize_right = (srcW_right * srcH_right) > (dstW_right * dstH_right) ? (srcW_right * srcH_right) : (dstW_right * dstH_right);
   unsigned char *pImgY_right = new unsigned char[srcSize_right];
   unsigned char *pImgUV_right = new unsigned char[srcSize_right];
   unsigned char *pImgOut_right = new unsigned char[srcSize_right * 2];
 
   /* ¶ÁÈ¡ÊäÈëͼÏñ */
   char srcYuvPath[512] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_full_7680x4320_08.nv12";
   readYUV(srcYuvPath, srcW, srcH, 0, NULL, pImgY, pImgUV);
   char srcYuvPath_left[512] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_left_4096x4320_08.nv12";
   readYUV(srcYuvPath_left, srcW_left, srcH_left, 0, NULL, pImgY_left, pImgUV_left);
   char srcYuvPath_right[512] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_right_4096x4320_08.nv12";
   readYUV(srcYuvPath_right, srcW_right, srcH_right, 0, NULL, pImgY_right, pImgUV_right);
 
   /* Éú³ÉFECÓ³Éä±í²¢½øÐÐУÕý */
   int level = 0;                    /* level·¶Î§: 0-255 */
   int levelValue[] = { 0,64,128,192,255 };
   //for (level = 0; level <= 0; level = level + 1)
   for (int levelIdx = 0; levelIdx < 5; ++levelIdx)
   {
       level = levelValue[levelIdx];
       printf("level = %d\n", level);
 
       /* ×óͼ½øÐÐFECУÕý */
       bool success_left = genFECMeshNLevel(fecParams_left, camCoeff_left, level, pMeshXI_left, pMeshXF_left, pMeshYI_left, pMeshYF_left);                /* Éú³É¶ÔӦУÕýlevelµÄFECÓ³Éä±í */
       FEC_Cmodel_4bin(srcW_left, srcH_left, dstW_left, dstH_left, pImgY_left, pImgUV_left,
           pMeshXI_left, pMeshXF_left, pMeshYI_left, pMeshYF_left, pImgOut_left, 0, 0, 0, 0, 0, 0);                                                    /* µ÷ÓÃFEC */
       cv::Mat dstImgBGR_left;                                                                                                                            /* ±£´æ */
       NV12toRGB(pImgOut_left, dstW_left, dstH_left, dstImgBGR_left);
       char dstBmpPath_left[256];
       sprintf(dstBmpPath_left, "../data_out/fec_left_%dx%d_level%03d.bmp", dstW_left, dstH_left, level);
       cv::imwrite(dstBmpPath_left, dstImgBGR_left);
 
       /* ÓÒͼ½øÐÐFECУÕý */
       bool success_right = genFECMeshNLevel(fecParams_right, camCoeff_right, level, pMeshXI_right, pMeshXF_right, pMeshYI_right, pMeshYF_right);        /* Éú³É¶ÔӦУÕýlevelµÄFECÓ³Éä±í */
       FEC_Cmodel_4bin(srcW_right, srcH_right, dstW_right, dstH_right, pImgY_right, pImgUV_right,
           pMeshXI_right, pMeshXF_right, pMeshYI_right, pMeshYF_right, pImgOut_right, 0, 0, 0, 0, 0, 0);                                                /* µ÷ÓÃFEC */
       cv::Mat dstImgBGR_right;                                                                                                                        /* ±£´æ */
       NV12toRGB(pImgOut_right, dstW_right, dstH_right, dstImgBGR_right);
       char dstBmpPath_right[256];
       sprintf(dstBmpPath_right, "../data_out/fec_right_%dx%d_level%03d.bmp", dstW_right, dstH_right, level);
       cv::imwrite(dstBmpPath_right, dstImgBGR_right);
 
       /* ÑéÖ¤: È«Í¼½øÐÐFECУÕý */
       bool success_full = genFECMeshNLevel(fecParams, camCoeff, level, pMeshXI, pMeshXF, pMeshYI, pMeshYF);                                            /* Éú³É¶ÔӦУÕýlevelµÄFECÓ³Éä±í */
       FEC_Cmodel_4bin(srcW, srcH, dstW, dstH, pImgY, pImgUV,
           pMeshXI, pMeshXF, pMeshYI, pMeshYF, pImgOut, 0, 0, 0, 0, 0, 0);                                                                                /* µ÷ÓÃFEC */
       cv::Mat dstImgBGR_full;                                                                                                                            /* ±£´æ */
       NV12toRGB(pImgOut, dstW, dstH, dstImgBGR_full);
       char dstBmpPath_full[256];
       sprintf(dstBmpPath_full, "../data_out/fec_full_%dx%d_level%03d.bmp", dstW, dstH, level);
       cv::imwrite(dstBmpPath_full, dstImgBGR_full);
 
       /* ÑéÖ¤: ×óͼFEC½á¹û + ÓÒͼFEC½á¹û ---> Æ´½ÓµÄȫͼ½á¹û */
       cv::Mat dstImgBGR_stitch = cv::Mat(dstH, dstW, CV_8UC3);
       dstImgBGR_left(cv::Range(0, dstH_left), cv::Range(0, dstW_left - margin)).copyTo(dstImgBGR_stitch(cv::Range(0, dstH), cv::Range(0, dstW * 0.5)));
       dstImgBGR_right(cv::Range(0, dstH_left), cv::Range(margin, dstW_right)).copyTo(dstImgBGR_stitch(cv::Range(0, dstH), cv::Range(dstW * 0.5, dstW)));
       char dstBmpPath_stitch[256];
       sprintf(dstBmpPath_stitch, "../data_out/fec_stitch_%dx%d_level%03d.bmp", dstW, dstH, level);
       cv::imwrite(dstBmpPath_stitch, dstImgBGR_stitch);
   }
   /* È«Í¼Ïà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgY;
   delete[] pImgUV;
   delete[] pImgOut;
   freeFecMesh(pMeshXI, pMeshXF, pMeshYI, pMeshYF);                            /* ÄÚ´æÊÍ·Å */
   genFecMeshDeInit(fecParams);                                                /* ·´³õʼ»¯ */
 
   /* ×óͼÏà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgY_left;
   delete[] pImgUV_left;
   delete[] pImgOut_left;
   freeFecMesh(pMeshXI_left, pMeshXF_left, pMeshYI_left, pMeshYF_left);        /* ÄÚ´æÊÍ·Å */
   genFecMeshDeInit(fecParams_left);                                            /* ·´³õʼ»¯ */
 
   /* ÓÒͼÏà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgY_right;
   delete[] pImgUV_right;
   delete[] pImgOut_right;
   freeFecMesh(pMeshXI_right, pMeshXF_right, pMeshYI_right, pMeshYF_right);    /* ÄÚ´æÊÍ·Å */
   genFecMeshDeInit(fecParams_right);                                            /* ·´³õʼ»¯ */
 
 
}