/* 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); /* ·´³õʼ»¯ */ }