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
 
/* 8kͼ--->2¸ö4kͼ£¬½øÐÐLDCH·Ö¼¶Ð£Õý */
void test030()
{
   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;
   LdchParams ldchParams;
   ldchParams.saveMaxFovX = 0;                                            /* ±£Áôˮƽx·½Ïò×î´óFOV: 1´ú±í±£Áô, 0´ú±í²»±£Áô */
   ldchParams.isLdchOld = 1;                                            /* ÊÇ·ñ¾É°æLDCH: 1´ú±íÊÇ£¬0´ú±í²»ÊÇ */
   ldchParams.saveMeshX = 1;                                            /* ÊÇ·ñ±£´æMeshX.binÎļþ: 1´ú±í±£´æ, 0´ú±í²»±£´æ */
   sprintf(ldchParams.meshPath, "../data_out/");                        /* ±£´æMeshX.binÎļþµÄ¸ùĿ¼ */
   /* ×óͼ4kÏà¹Ø²ÎÊý */
   CameraCoeff camCoeff_left;
   LdchParams ldchParams_left;
   /* ÓÒͼ4kÏà¹Ø²ÎÊý */
   CameraCoeff camCoeff_right;
   LdchParams ldchParams_right;
   /* LDCHÏà¹Ø²ÎÊý³õʼ»¯ */
   genLdchMeshInit8kTo4k(srcW, srcH, dstW, dstH, margin, camCoeff, camCoeff_left, camCoeff_right, ldchParams, ldchParams_left, ldchParams_right);
   /* Ó³Éä±íbufferÉêÇë */
   unsigned short *pMeshX = new unsigned short[ldchParams.meshSize];                            /* È«Í¼ */
   unsigned short *pMeshX_left = new unsigned short[ldchParams_left.meshSize];                    /* ×óͼ */
   unsigned short *pMeshX_right = new unsigned short[ldchParams_right.meshSize];                /* ÓÒͼ */
 
   /* ÊäÈëÊä³öͼÏñbufferÉêÇë */
   /* È«Í¼ */
   unsigned long srcSize = (srcW * srcH) > (dstW * dstH) ? (srcW * srcH) : (dstW * dstH);
   unsigned short *pImgIn = new unsigned short[srcSize * 3];
   unsigned short *pImgOut = new unsigned short[srcSize * 3];
   /* ×óͼ */
   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 short *pImgIn_left = new unsigned short[srcSize_left * 3];
   unsigned short *pImgOut_left = new unsigned short[srcSize_left * 3];
   /* ÓÒͼ */
   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 short *pImgIn_right = new unsigned short[srcSize_right * 3];
   unsigned short *pImgOut_right = new unsigned short[srcSize_right * 3];
 
   /* ¶ÁÈ¡ÊäÈëͼÏñ */
   char srcBGRPath[256] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_full_7680x4320_08.bmp";
   readRGBforLDCH(srcBGRPath, srcW, srcH, pImgIn);
   char srcBGRPath_left[256] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_left_4096x4320_08.bmp";
   readRGBforLDCH(srcBGRPath_left, srcW_left, srcH_left, pImgIn_left);
   char srcBGRPath_right[256] = "../data_in/image/group_023_imx415_2.8mm_7680x4320_half/imx415_2.8mm_right_4096x4320_08.bmp";
   readRGBforLDCH(srcBGRPath_right, srcW_right, srcH_right, pImgIn_right);
 
   /* Éú³ÉLDCHÓ³Éä±í²¢½øÐÐУÕý */
   int level = 0;                /* level·¶Î§: 0-255 */
   int levelValue[] = { 0,64,128,192,255 };
   //for (level = 0; level <= 255; level = level + 1)
   for (int levelIdx = 0; levelIdx < 5; ++levelIdx)
   {
       level = levelValue[levelIdx];
       printf("level = %d\n", level);
 
       /* ×óͼ½øÐÐLDCHУÕý */
       bool success_left = genLDCMeshNLevel(ldchParams_left, camCoeff_left, level, pMeshX_left);                    /* Éú³É¶ÔӦУÕýlevelµÄLDCHÓ³Éä±í */
       LDCH_Cmodel(dstW_left, dstH_left, pImgIn_left, pImgOut_left, pMeshX_left);                                    /* µ÷ÓÃLDCH_Cmodel */
       cv::Mat dstImgBGR_left;
       ldchOut2Mat(dstW_left, dstH_left, 8, pImgOut_left, dstImgBGR_left);                                            /* LDCHÊä³ö½á¹ûתΪcv::Mat¸ñʽ */
       char dstBmpPath_left[256];                                                                                    /* ±£´æ */
       sprintf(dstBmpPath_left, "../data_out/ldch_left_%dx%d_level%03d.bmp", dstW_left, dstH_left, level);
       cv::imwrite(dstBmpPath_left, dstImgBGR_left);
 
       /* ÓÒͼ½øÐÐLDCHУÕý */
       bool success_right = genLDCMeshNLevel(ldchParams_right, camCoeff_right, level, pMeshX_right);                /* Éú³É¶ÔӦУÕýlevelµÄLDCHÓ³Éä±í */
       LDCH_Cmodel(dstW_right, dstH_right, pImgIn_right, pImgOut_right, pMeshX_right);                                /* µ÷ÓÃLDCH_Cmodel */
       cv::Mat dstImgBGR_right;
       ldchOut2Mat(dstW_right, dstH_right, 8, pImgOut_right, dstImgBGR_right);                                        /* LDCHÊä³ö½á¹ûתΪcv::Mat¸ñʽ */
       char dstBmpPath_right[256];                                                                                    /* ±£´æ */
       sprintf(dstBmpPath_right, "../data_out/ldch_right_%dx%d_level%03d.bmp", dstW_right, dstH_right, level);
       cv::imwrite(dstBmpPath_right, dstImgBGR_right);
 
       /* ÑéÖ¤: È«Í¼½øÐÐLDCHУÕý */
       bool success_full = genLDCMeshNLevel(ldchParams, camCoeff, level, pMeshX);                                    /* Éú³É¶ÔӦУÕýlevelµÄLDCHÓ³Éä±í */
       LDCH_Cmodel(dstW, dstH, pImgIn, pImgOut, pMeshX);                                                            /* µ÷ÓÃLDCH_Cmodel */
       cv::Mat dstImgBGR_full;
       ldchOut2Mat(dstW, dstH, 8, pImgOut, dstImgBGR_full);                                                        /* LDCHÊä³ö½á¹ûתΪcv::Mat¸ñʽ */
       char dstBmpPath_full[256];                                                                                    /* ±£´æ */
       sprintf(dstBmpPath_full, "../data_out/ldch_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/ldch_stitch_%dx%d_level%03d.bmp", dstW, dstH, level);
       cv::imwrite(dstBmpPath_stitch, dstImgBGR_stitch);
   }
   /* È«Í¼Ïà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgIn;                        /* ÄÚ´æÊÍ·Å */
   delete[] pImgOut;
   delete[] pMeshX;
   genLdchMeshDeInit(ldchParams);            /* ·´³õʼ»¯ */
 
   /* ×óͼÏà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgIn_left;                    /* ÄÚ´æÊÍ·Å */
   delete[] pImgOut_left;
   delete[] pMeshX_left;
   genLdchMeshDeInit(ldchParams_left);        /* ·´³õʼ»¯ */
 
   /* ÓÒͼÏà¹ØÄÚ´æÊͷźͷ´³õʼ»¯ */
   delete[] pImgIn_right;                    /* ÄÚ´æÊÍ·Å */
   delete[] pImgOut_right;
   delete[] pMeshX_right;
   genLdchMeshDeInit(ldchParams_right);    /* ·´³õʼ»¯ */
}