|
@@ -0,0 +1,130 @@
|
|
|
|
+#include "avsFineTuningTool.hpp"
|
|
|
|
+#include "hi_mpi_sys.h"
|
|
|
|
+#include <iostream>
|
|
|
|
+#include <memory>
|
|
|
|
+#include <cstring>
|
|
|
|
+
|
|
|
|
+AvsFineTuningTool* AvsFineTuningTool::instance = nullptr;
|
|
|
|
+
|
|
|
|
+void AvsFineTuningTool::GenerateLutFile(int index)
|
|
|
|
+{
|
|
|
|
+ // Generate the LUT file
|
|
|
|
+
|
|
|
|
+ ot_avs_lut_generate_input *lut_input = new ot_avs_lut_generate_input();
|
|
|
|
+ td_s32 i;
|
|
|
|
+ td_s32 ret = 0;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /*************************************************************************** */
|
|
|
|
+ // Create a new LUT mask
|
|
|
|
+ ot_avs_lut_mask *lut_mask = new ot_avs_lut_mask();
|
|
|
|
+
|
|
|
|
+ lut_mask->input_yuv_mask_flag = TD_FALSE; // input yuv mask flag
|
|
|
|
+ lut_mask->same_mask_flag = TD_TRUE; // if this is true , all the mask define will be the same as the first one
|
|
|
|
+ for(i = 0; i < m_cameraNumber; i++) {
|
|
|
|
+ lut_mask->mask_define[i].mask_shape = OT_AVS_MASK_SHAPE_RECT;
|
|
|
|
+ lut_mask->mask_define[i].offset_h = 0;
|
|
|
|
+ lut_mask->mask_define[i].offset_v = 0;
|
|
|
|
+ lut_mask->mask_define[i].half_major_axis = g_width / 2; /* half 2 */
|
|
|
|
+ lut_mask->mask_define[i].half_minor_axis = g_height / 2; /* half 2 */
|
|
|
|
+ }
|
|
|
|
+ std::cout << "mask param is done" << std::endl;
|
|
|
|
+
|
|
|
|
+ /*************************************************************************** */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ td_char out_lut[MAX_CAMERA_NUM][FILE_MAX_LEN]; /* 2 */
|
|
|
|
+ td_u64 lut_output[MAX_CAMERA_NUM]{0}; /* 2 */
|
|
|
|
+ FILE *lut_file = NULL;
|
|
|
|
+
|
|
|
|
+ td_s32 cal_size =0;
|
|
|
|
+ //char calibrationPath[OT_AVS_CALIBRATION_FILE_LEN] = "./calibration/4eye_2688x1520.cal";
|
|
|
|
+ //std::memcpy(g_cal_file,calibrationPath,OT_AVS_CALIBRATION_FILE_LEN);
|
|
|
|
+ cal_size = getCalFileLong("./calibration/4eye_2688x1520.cal");
|
|
|
|
+ if(cal_size == 0) {
|
|
|
|
+ printf("getCalFileLong failed\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = readCalFile("./calibration/4eye_2688x1520.cal",g_cal_file,cal_size);
|
|
|
|
+ if(ret != TD_SUCCESS) {
|
|
|
|
+ printf("readCalFile failed\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ ret = hi_mpi_sys_mmz_alloc(&g_avs_lut_addr, &m_avsLut, NULL, NULL, OT_AVS_LUT_SIZE*m_cameraNumber*sizeof(char));
|
|
|
|
+ if(ret != TD_SUCCESS) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ std::cout << "LUT mmz alloc is done" << std::endl;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < m_cameraNumber; i++) {
|
|
|
|
+ lut_output[i] = (td_u64)(td_uintptr_t)m_avsLut + i * OT_AVS_LUT_SIZE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = hi_mpi_sys_mmz_alloc(&g_avs_mask_addr, &m_avsMask, NULL, NULL, g_width * g_height * sizeof(td_u16));
|
|
|
|
+ if(ret != TD_SUCCESS) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for(i = 0; i < m_cameraNumber; i++) {
|
|
|
|
+ lut_mask->mask_addr[i] = (td_u64)(td_uintptr_t)m_avsMask;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ std::cout << "Mask mmz alloc is done" << std::endl;
|
|
|
|
+
|
|
|
|
+ /*************************************************************************** */
|
|
|
|
+ // Create a new LUT fine tuning
|
|
|
|
+
|
|
|
|
+ m_fine_tuning_cfg.fine_tuning_en = TD_TRUE; // trun on fine tuning
|
|
|
|
+ for(i = 0; i < m_cameraNumber; i++) {
|
|
|
|
+ if(i == index)
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].adjust_en = TD_TRUE;
|
|
|
|
+ else
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].adjust_en = TD_FALSE;
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].pitch = m_finePackages[i].pitch * 100;
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].yaw = m_finePackages[i].yaw * 100;
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].roll = m_finePackages[i].roll* 100;
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].offset_x = m_finePackages[i].offsetX * 100;
|
|
|
|
+ m_fine_tuning_cfg.adjust[i].offset_y = m_finePackages[i].offsetY * 100;
|
|
|
|
+ }
|
|
|
|
+ lut_input->fine_tuning_cfg = m_fine_tuning_cfg;
|
|
|
|
+ lut_input->lut_accuracy = OT_AVS_LUT_ACCURACY_HIGH; // accuracy configure
|
|
|
|
+ lut_input->type = OT_AVS_TYPE_AVSP; // use AVSP
|
|
|
|
+ lut_input->stitch_distance = m_StitchingDistance; // set stitching distance
|
|
|
|
+ lut_input->mask = lut_mask; // set mask
|
|
|
|
+ lut_input->file_input_addr = (td_u64)(td_uintptr_t)g_cal_file; // set cal file address
|
|
|
|
+
|
|
|
|
+ /*************************************************************************** */
|
|
|
|
+
|
|
|
|
+ ot_avs_status status;
|
|
|
|
+
|
|
|
|
+ status = hi_mpi_avs_lut_generate(lut_input,lut_output);
|
|
|
|
+
|
|
|
|
+ if(status != OT_AVS_STATUS_OK) {
|
|
|
|
+ printf("hi_mpi_avs_lut_generate failed\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ writeLutFile(index,m_SaveAVSPPath,OT_AVS_LUT_SIZE,lut_output);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void AvsFineTuningTool::FreeResources()
|
|
|
|
+{
|
|
|
|
+ td_s32 ret = TD_SUCCESS;
|
|
|
|
+ if (g_avs_lut_addr != 0) {
|
|
|
|
+ ret = hi_mpi_sys_mmz_free(g_avs_lut_addr, NULL);
|
|
|
|
+ if(ret != TD_SUCCESS) {
|
|
|
|
+ printf("hi_mpi_sys_mmz_free failed\n");}
|
|
|
|
+ }
|
|
|
|
+ if(g_avs_mask_addr != 0)
|
|
|
|
+ {
|
|
|
|
+ ret = hi_mpi_sys_mmz_free(g_avs_mask_addr, NULL);
|
|
|
|
+ if(ret != TD_SUCCESS) {
|
|
|
|
+ printf("hi_mpi_sys_mmz_free failed\n");}
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|