Loading src/main/java/com/elphel/imagej/cameras/CLTParameters.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -789,6 +789,7 @@ public class CLTParameters { public boolean gpu_save_ports_xy = false; // debug feature - save calculated ports X,Y to compare with Java-generated public boolean gpu_save_ports_xy = false; // debug feature - save calculated ports X,Y to compare with Java-generated public boolean gpu_show_jtextures = true; // debug feature - show Java-generated textures from non-overlapping in GPU (will not generate if false) public boolean gpu_show_jtextures = true; // debug feature - show Java-generated textures from non-overlapping in GPU (will not generate if false) public boolean gpu_show_extra = true; // show low-res data for macro public boolean gpu_show_extra = true; // show low-res data for macro public boolean gpu_show_geometry = true; // show geometry correction public boolean gpu_use_main = false; // accelerate tile processor for the main quad camera public boolean gpu_use_main = false; // accelerate tile processor for the main quad camera public boolean gpu_use_main_macro = false; // accelerate tile processor for the main quad camera in macro mode public boolean gpu_use_main_macro = false; // accelerate tile processor for the main quad camera in macro mode Loading Loading @@ -1591,6 +1592,7 @@ public class CLTParameters { properties.setProperty(prefix+"gpu_save_ports_xy", this.gpu_save_ports_xy +""); properties.setProperty(prefix+"gpu_save_ports_xy", this.gpu_save_ports_xy +""); properties.setProperty(prefix+"gpu_show_jtextures", this.gpu_show_jtextures +""); properties.setProperty(prefix+"gpu_show_jtextures", this.gpu_show_jtextures +""); properties.setProperty(prefix+"gpu_show_extra", this.gpu_show_extra +""); properties.setProperty(prefix+"gpu_show_extra", this.gpu_show_extra +""); properties.setProperty(prefix+"gpu_show_geometry", this.gpu_show_geometry +""); properties.setProperty(prefix+"gpu_use_main", this.gpu_use_main +""); properties.setProperty(prefix+"gpu_use_main", this.gpu_use_main +""); properties.setProperty(prefix+"gpu_use_main_macro", this.gpu_use_main_macro +""); properties.setProperty(prefix+"gpu_use_main_macro", this.gpu_use_main_macro +""); Loading Loading @@ -2377,6 +2379,7 @@ public class CLTParameters { if (properties.getProperty(prefix+"gpu_save_ports_xy")!=null) this.gpu_save_ports_xy=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_save_ports_xy")); if (properties.getProperty(prefix+"gpu_save_ports_xy")!=null) this.gpu_save_ports_xy=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_save_ports_xy")); if (properties.getProperty(prefix+"gpu_show_jtextures")!=null) this.gpu_show_jtextures=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_jtextures")); if (properties.getProperty(prefix+"gpu_show_jtextures")!=null) this.gpu_show_jtextures=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_jtextures")); if (properties.getProperty(prefix+"gpu_show_extra")!=null) this.gpu_show_extra=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_extra")); if (properties.getProperty(prefix+"gpu_show_extra")!=null) this.gpu_show_extra=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_extra")); if (properties.getProperty(prefix+"gpu_show_geometry")!=null) this.gpu_show_geometry=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_geometry")); if (properties.getProperty(prefix+"gpu_use_main")!=null) this.gpu_use_main=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main")); if (properties.getProperty(prefix+"gpu_use_main")!=null) this.gpu_use_main=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main")); if (properties.getProperty(prefix+"gpu_use_main_macro")!=null) this.gpu_use_main_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_macro")); if (properties.getProperty(prefix+"gpu_use_main_macro")!=null) this.gpu_use_main_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_macro")); Loading Loading @@ -3326,6 +3329,7 @@ public class CLTParameters { gd.addCheckbox ("Debug feature - save calculated ports X,Y to compare with Java-generated", this.gpu_save_ports_xy); gd.addCheckbox ("Debug feature - save calculated ports X,Y to compare with Java-generated", this.gpu_save_ports_xy); gd.addCheckbox ("Show Java-generated textures from non-overlapping in GPU (will not generate if false)", this.gpu_show_jtextures); gd.addCheckbox ("Show Java-generated textures from non-overlapping in GPU (will not generate if false)", this.gpu_show_jtextures); gd.addCheckbox ("Show low-res data for macro (will not generate if false)", this.gpu_show_extra); gd.addCheckbox ("Show low-res data for macro (will not generate if false)", this.gpu_show_extra); gd.addCheckbox ("Show per-tile geometry corrected tile coordinates and disparity derivatives", this.gpu_show_geometry); gd.addCheckbox ("Accelerate tile processor for the main quad camera", this.gpu_use_main); gd.addCheckbox ("Accelerate tile processor for the main quad camera", this.gpu_use_main); gd.addCheckbox ("Accelerate tile processor for the main quad camera in macro mode", this.gpu_use_main_macro); gd.addCheckbox ("Accelerate tile processor for the main quad camera in macro mode", this.gpu_use_main_macro); Loading Loading @@ -4085,6 +4089,7 @@ public class CLTParameters { this.gpu_save_ports_xy= gd.getNextBoolean(); this.gpu_save_ports_xy= gd.getNextBoolean(); this.gpu_show_jtextures= gd.getNextBoolean(); this.gpu_show_jtextures= gd.getNextBoolean(); this.gpu_show_extra= gd.getNextBoolean(); this.gpu_show_extra= gd.getNextBoolean(); this.gpu_show_geometry= gd.getNextBoolean(); this.gpu_use_main= gd.getNextBoolean(); this.gpu_use_main= gd.getNextBoolean(); this.gpu_use_main_macro= gd.getNextBoolean(); this.gpu_use_main_macro= gd.getNextBoolean(); Loading src/main/java/com/elphel/imagej/gpu/GPUTileProcessor.java +49 −2 Original line number Original line Diff line number Diff line Loading @@ -190,6 +190,38 @@ public class GPUTileProcessor { this.task = task; this.task = task; this.disp_dist = new float [NUM_CAMS][4]; this.disp_dist = new float [NUM_CAMS][4]; } } /** * Initialize from the float array (read from the GPU) * @param flt float array containig tasks data * @param indx task number to use */ public TpTask(float [] flt, int indx, boolean use_aux) { task = Float.floatToIntBits(flt[indx++]); int txy = Float.floatToIntBits(flt[indx++]); ty = txy >> 16; tx = txy & 0xffff; if (use_aux) { xy_aux = new float[NUM_CAMS][2]; for (int i = 0; i < NUM_CAMS; i++) { xy_aux[i][0] = flt[indx++]; xy_aux[i][1] = flt[indx++]; } } else { xy = new float[NUM_CAMS][2]; for (int i = 0; i < NUM_CAMS; i++) { xy[i][0] = flt[indx++]; xy[i][1] = flt[indx++]; } } target_disparity = flt[indx++]; disp_dist = new float [NUM_CAMS][4]; for (int i = 0; i < NUM_CAMS; i++) { for (int j = 0; j < 4; j++) { disp_dist[i][j] = flt[indx++]; } } } // convert this class instance to float array to match layout of the C struct // convert this class instance to float array to match layout of the C struct public float [] asFloatArray(boolean use_aux) { public float [] asFloatArray(boolean use_aux) { Loading Loading @@ -896,6 +928,19 @@ public class GPUTileProcessor { } } cuMemcpyHtoD(gpu_tasks, Pointer.to(ftasks), TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); cuMemcpyHtoD(gpu_tasks, Pointer.to(ftasks), TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); } } public TpTask [] getTasks (boolean use_aux) { float [] ftasks = new float [TPTASK_SIZE * num_task_tiles]; cuMemcpyDtoH(Pointer.to(ftasks), gpu_tasks, TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); TpTask [] tile_tasks = new TpTask[num_task_tiles]; for (int i = 0; i < num_task_tiles; i++) { tile_tasks[i] = new TpTask(ftasks, i* TPTASK_SIZE, use_aux); } return tile_tasks; } /* /* public void setCorrIndices(int [] corr_indices) public void setCorrIndices(int [] corr_indices) { { Loading Loading @@ -1364,6 +1409,7 @@ public class GPUTileProcessor { * @param tp_tasks array of tasks that contain masks of the required pairs * @param tp_tasks array of tasks that contain masks of the required pairs * @return each element has (tile_number << 8) | (pair_number & 0xff) * @return each element has (tile_number << 8) | (pair_number & 0xff) */ */ @Deprecated public int [] getCorrTasks( public int [] getCorrTasks( TpTask [] tp_tasks) { TpTask [] tp_tasks) { int tilesX = img_width / DTT_SIZE; int tilesX = img_width / DTT_SIZE; Loading @@ -1390,12 +1436,12 @@ public class GPUTileProcessor { } } return iarr; return iarr; } } /** /** * Prepare contents pointers for calculation of the texture tiles (RGBA, 16x16) * Prepare contents pointers for calculation of the texture tiles (RGBA, 16x16) * @param tp_tasks array of tasks that contain masks of the required pairs * @param tp_tasks array of tasks that contain masks of the required pairs * @return each element has (tile_number << 8) | (1 << LIST_TEXTURE_BIT) * @return each element has (tile_number << 8) | (1 << LIST_TEXTURE_BIT) */ */ @Deprecated public int [] getTextureTasks( public int [] getTextureTasks( TpTask [] tp_tasks) { TpTask [] tp_tasks) { int tilesX = img_width / DTT_SIZE; int tilesX = img_width / DTT_SIZE; Loading Loading @@ -2215,6 +2261,7 @@ public class GPUTileProcessor { return fimg; return fimg; } } @Deprecated public void getTileSubcamOffsets( public void getTileSubcamOffsets( final TpTask[] tp_tasks, // will use // modify to have offsets for 8 cameras final TpTask[] tp_tasks, // will use // modify to have offsets for 8 cameras final GeometryCorrection geometryCorrection_main, final GeometryCorrection geometryCorrection_main, Loading src/main/java/com/elphel/imagej/tileprocessor/GeometryCorrection.java +1 −37 Original line number Original line Diff line number Diff line Loading @@ -3052,21 +3052,13 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. * 5) return port center X and Y * 5) return port center X and Y * line_time * line_time */ */ double [] imu = null; double [] imu = null; if (disp_dist != null) { if (disp_dist != null) { imu = extrinsic_corr.getIMU(); // currently it is common for all channels imu = extrinsic_corr.getIMU(); // currently it is common for all channels if ((deriv_rots == null) && ((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0))){ if ((deriv_rots == null) && ((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0))){ // get deriv_rots - they are needed // if (use_rig_offsets) { // deriv_rots = extrinsic_corr.getRotDeriveMatrices(getRigMatrix); // } else { deriv_rots = extrinsic_corr.getRotDeriveMatrices(); deriv_rots = extrinsic_corr.getRotDeriveMatrices(); // } } } } } if ((disp_dist == null) && (pXYderiv != null)) { if ((disp_dist == null) && (pXYderiv != null)) { disp_dist = new double [numSensors][4]; disp_dist = new double [numSensors][4]; } } Loading Loading @@ -3097,7 +3089,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pYci0 = pYc - disparity * rXY[i][1]; double pYci0 = pYc - disparity * rXY[i][1]; // rectilinear, end of dealing with possibly other (master) camera, below all is for this camera distortions // rectilinear, end of dealing with possibly other (master) camera, below all is for this camera distortions // Convert a 2-d non-distorted vector to 3d at fl_pix distance in z direction // Convert a 2-d non-distorted vector to 3d at fl_pix distance in z direction double [][] avi = {{pXci0}, {pYci0},{fl_pix}}; double [][] avi = {{pXci0}, {pYci0},{fl_pix}}; Matrix vi = new Matrix(avi); // non-distorted sensor channel view vector in pixels (z -along the common axis) Matrix vi = new Matrix(avi); // non-distorted sensor channel view vector in pixels (z -along the common axis) Loading @@ -3111,20 +3102,10 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pXci = rvi.get(0, 0) * norm_z; double pXci = rvi.get(0, 0) * norm_z; double pYci = rvi.get(1, 0) * norm_z; double pYci = rvi.get(1, 0) * norm_z; // debug double norm_z_dbg = fl_pix/vi.get(2, 0); double pXci_dbg = vi.get(0, 0) * norm_z_dbg; double pYci_dbg = vi.get(1, 0) * norm_z_dbg; // Re-apply distortion // Re-apply distortion double rNDi = Math.sqrt(pXci*pXci + pYci*pYci); // in pixels double rNDi = Math.sqrt(pXci*pXci + pYci*pYci); // in pixels // Rdist/R=A8*R^7+A7*R^6+A6*R^5+A5*R^4+A*R^3+B*R^2+C*R+(1-A6-A7-A6-A5-A-B-C)"); // Rdist/R=A8*R^7+A7*R^6+A6*R^5+A5*R^4+A*R^3+B*R^2+C*R+(1-A6-A7-A6-A5-A-B-C)"); double ri = rNDi* ri_scale; // relative to distortion radius double ri = rNDi* ri_scale; // relative to distortion radius // double rD2rND = (1.0 - distortionA8 - distortionA7 - distortionA6 - distortionA5 - distortionA - distortionB - distortionC); double rNDi_dbg = Math.sqrt(pXci_dbg*pXci_dbg + pYci_dbg*pYci_dbg); // in pixels double ri_dbg = rNDi_dbg* ri_scale; // relative to distortion radius double rD2rND = 1.0; double rD2rND = 1.0; double rri = 1.0; double rri = 1.0; Loading @@ -3137,7 +3118,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pXid = pXci * rD2rND; double pXid = pXci * rD2rND; double pYid = pYci * rD2rND; double pYid = pYci * rD2rND; pXY[i][0] = pXid + this.pXY0[i][0]; pXY[i][0] = pXid + this.pXY0[i][0]; pXY[i][1] = pYid + this.pXY0[i][1]; pXY[i][1] = pYid + this.pXY0[i][1]; Loading Loading @@ -3173,7 +3153,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. } } } } double delta_t = 0.0; double delta_t = 0.0; // double [] imu = null; double [][] dpXci_pYci_imu_lin = new double[2][3]; // null double [][] dpXci_pYci_imu_lin = new double[2][3]; // null if (disp_dist != null) { if (disp_dist != null) { disp_dist[i] = new double [4]; // dx/d_disp, dx_d_ccw_disp disp_dist[i] = new double [4]; // dx/d_disp, dx_d_ccw_disp Loading @@ -3184,7 +3163,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. { 0.0, 0.0, 0.0}}; // what is last element??? { 0.0, 0.0, 0.0}}; // what is last element??? Matrix dd0 = new Matrix(add0); Matrix dd0 = new Matrix(add0); Matrix dd1 = rots[i].times(dd0).getMatrix(0, 1,0,1).times(norm_z); // get top left 2x2 sub-matrix Matrix dd1 = rots[i].times(dd0).getMatrix(0, 1,0,1).times(norm_z); // get top left 2x2 sub-matrix //// Matrix dd1 = dd0.getMatrix(0, 1,0,1); // get top left 2x2 sub-matrix // now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation) // now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation) // unity vector in the direction of radius // unity vector in the direction of radius double c_dist = pXci/rNDi; double c_dist = pXci/rNDi; Loading @@ -3206,12 +3184,7 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. disp_dist[i][1] = dd2.get(0, 1); disp_dist[i][1] = dd2.get(0, 1); disp_dist[i][2] = dd2.get(1, 0); // d_py/d_disp disp_dist[i][2] = dd2.get(1, 0); // d_py/d_disp disp_dist[i][3] = dd2.get(1, 1); disp_dist[i][3] = dd2.get(1, 1); // imu = extrinsic_corr.getIMU(i); // currently it is common for all channels // ERS linear does not yet use per-port rotations, probably not needed // ERS linear does not yet use per-port rotations, probably not needed // double [][] dpXci_pYci_imu_lin = new double[2][3]; // null if ((imu != null) &&((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0) ||(imu[3] != 0.0) ||(imu[4] != 0.0) ||(imu[5] != 0.0))) { if ((imu != null) &&((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0) ||(imu[3] != 0.0) ||(imu[4] != 0.0) ||(imu[5] != 0.0))) { delta_t = dd2.get(1, 0) * disparity * line_time; // positive for top cameras, negative - for bottom delta_t = dd2.get(1, 0) * disparity * line_time; // positive for top cameras, negative - for bottom double ers_Xci = delta_t* (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); double ers_Xci = delta_t* (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); Loading @@ -3229,16 +3202,12 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. } } pXY[i][0] += ers_Xci * rD2rND; // added correction to pixel X pXY[i][0] += ers_Xci * rD2rND; // added correction to pixel X pXY[i][1] += ers_Yci * rD2rND; // added correction to pixel Y pXY[i][1] += ers_Yci * rD2rND; // added correction to pixel Y } else { } else { imu = null; imu = null; } } // TODO: calculate derivatives of pX, pY by 3 imu omegas // TODO: calculate derivatives of pX, pY by 3 imu omegas } } if (pXYderiv != null) { if (pXYderiv != null) { pXYderiv[2 * i] = new double [CorrVector.LENGTH]; pXYderiv[2 * i] = new double [CorrVector.LENGTH]; pXYderiv[2 * i+1] = new double [CorrVector.LENGTH]; pXYderiv[2 * i+1] = new double [CorrVector.LENGTH]; Loading Loading @@ -3272,8 +3241,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. // assuming drD2rND_imu* is zero (rD2rND does not depend on imu_* // assuming drD2rND_imu* is zero (rD2rND does not depend on imu_* // hope it will not be needed, as derivatives are used only for filed calibration, handled differently // hope it will not be needed, as derivatives are used only for filed calibration, handled differently if (imu != null) { if (imu != null) { // dpX_d = delta_t * rD2rND * (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); // dpX_d = delta_t * rD2rND * (dpYci_dtilt * imu[0] + dpYci_dazimuth * imu[1] + dpYci_droll * imu[2]); pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpXci_dtilt; // * imu[0]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpXci_dtilt; // * imu[0]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpYci_dtilt; // * imu[0]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpYci_dtilt; // * imu[0]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+1] = delta_t * rD2rND * dpXci_dazimuth; // * imu[1]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+1] = delta_t * rD2rND * dpXci_dazimuth; // * imu[1]; Loading @@ -3285,9 +3252,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+4] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][1]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+4] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][1]; // * imu[5]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[0][2]; // * imu[5]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[0][2]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][2]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][2]; // * imu[5]; // TODO: Add linear egomotion } } // verify that d/dsym are well, symmetrical // verify that d/dsym are well, symmetrical Loading src/main/java/com/elphel/imagej/tileprocessor/ImageDttCPU.java +27 −2 Original line number Original line Diff line number Diff line Loading @@ -191,6 +191,13 @@ public class ImageDttCPU { "top-aux", "bottom-aux", "left_aux", "right-aux", "diagm-aux", "diago-aux", "hor-aux", "vert-aux", "top-aux", "bottom-aux", "left_aux", "right-aux", "diagm-aux", "diago-aux", "hor-aux", "vert-aux", "inter", "other", "dbg1"}; "inter", "other", "dbg1"}; static String [] GEOM_TITLES_DBG ={ "px0","py0","px1","py1","px2","py2","px3","py3", "dd0-0","dd0-1","dd0-2","dd0-3", "dd1-0","dd1-1","dd1-2","dd1-3", "dd2-0","dd2-1","dd2-2","dd2-3", "dd3-0","dd3-1","dd3-2","dd3-3"}; public static int ML_OTHER_TARGET = 0; // Offset to target disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_TARGET = 0; // Offset to target disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH = 2; // Offset to ground truth disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH = 2; // Offset to ground truth disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH_STRENGTH = 4; // Offset to ground truth confidence data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH_STRENGTH = 4; // Offset to ground truth confidence data in ML_OTHER_INDEX layer tile Loading Loading @@ -9596,6 +9603,7 @@ public class ImageDttCPU { final int tilesX=width/transform_size; final int tilesX=width/transform_size; final int tilesY=height/transform_size; final int tilesY=height/transform_size; final int nTilesInChn=tilesX*tilesY; final int nTilesInChn=tilesX*tilesY; final double [][] geom_dbg = new double [24][nTilesInChn]; // clt_data does not need to be for the whole image (no, it is used for textures) // clt_data does not need to be for the whole image (no, it is used for textures) final double [][][][][][][] clt_bidata = (keep_clt_data)? (new double[2][][][][][][]):null; final double [][][][][][][] clt_bidata = (keep_clt_data)? (new double[2][][][][][][]):null; if (clt_bidata != null) { if (clt_bidata != null) { Loading Loading @@ -9829,7 +9837,15 @@ public class ImageDttCPU { centerX, centerX, centerY, centerY, disparity_main); // + disparity_corr); disparity_main); // + disparity_corr); if (geom_dbg != null) { for (int i = 0; i < quad_main; i++) { geom_dbg[2 * i + 0][nTile] = centersXY_main[i][0]; // x geom_dbg[2 * i + 1][nTile] = centersXY_main[i][1]; // y for (int j = 0; j < 4; j++) { geom_dbg[2 * quad_main + 4 * i + j][nTile] = disp_dist_main[i][j]; } } } centersXY_aux = geometryCorrection_aux.getPortsCoordinatesAndDerivatives( centersXY_aux = geometryCorrection_aux.getPortsCoordinatesAndDerivatives( geometryCorrection_main, // GeometryCorrection gc_main, geometryCorrection_main, // GeometryCorrection gc_main, true, // boolean use_rig_offsets, true, // boolean use_rig_offsets, Loading Loading @@ -10327,6 +10343,15 @@ public class ImageDttCPU { }; }; } } startAndJoin(threads); startAndJoin(threads); if (geom_dbg != null) { (new ShowDoubleFloatArrays()).showArrays( geom_dbg, tilesX, tilesY, true, "geom_dbg", GEOM_TITLES_DBG); } // If it was low-texture mode, use lt_corr to average bi-quad inter-correlation between neighbor tiles and then calculate disparity/strength // If it was low-texture mode, use lt_corr to average bi-quad inter-correlation between neighbor tiles and then calculate disparity/strength if (lt_corr != null) { if (lt_corr != null) { Loading src/main/java/com/elphel/imagej/tileprocessor/QuadCLT.java +45 −0 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,8 @@ package com.elphel.imagej.tileprocessor; ** ** */ */ import static jcuda.driver.JCudaDriver.cuMemcpyDtoH; import java.awt.Rectangle; import java.awt.Rectangle; import java.io.DataOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileNotFoundException; Loading @@ -42,9 +44,12 @@ import com.elphel.imagej.common.ShowDoubleFloatArrays; import com.elphel.imagej.correction.CorrectionColorProc; import com.elphel.imagej.correction.CorrectionColorProc; import com.elphel.imagej.correction.EyesisCorrections; import com.elphel.imagej.correction.EyesisCorrections; import com.elphel.imagej.gpu.GPUTileProcessor; import com.elphel.imagej.gpu.GPUTileProcessor; import com.elphel.imagej.gpu.GPUTileProcessor.TpTask; import ij.ImagePlus; import ij.ImagePlus; import ij.ImageStack; import ij.ImageStack; import jcuda.Pointer; import jcuda.Sizeof; public class QuadCLT extends QuadCLTCPU { public class QuadCLT extends QuadCLTCPU { private GPUTileProcessor.GpuQuad gpuQuad = null; private GPUTileProcessor.GpuQuad gpuQuad = null; Loading Loading @@ -750,6 +755,46 @@ public class QuadCLT extends QuadCLTCPU { int tilesX = quadCLT_main.getGPU().getImageWidth() / quadCLT_main.getGPU().getDttSize(); int tilesX = quadCLT_main.getGPU().getImageWidth() / quadCLT_main.getGPU().getDttSize(); int tilesY = quadCLT_main.getGPU().getImageHeight() / quadCLT_main.getGPU().getDttSize(); int tilesY = quadCLT_main.getGPU().getImageHeight() / quadCLT_main.getGPU().getDttSize(); if (clt_parameters.gpu_show_geometry) { // GPUTileProcessor.TpTask [] tp_tasks = quadCLT_main.getGPU().getTasks (false); // boolean use_aux) double [][] geom_dbg = new double [ImageDtt.GEOM_TITLES_DBG.length][tilesX*tilesY]; int num_cams =GPUTileProcessor.NUM_CAMS; for (int nt = 0; nt < tp_tasks.length; nt++) { for (int i = 0; i < num_cams; i++) { GPUTileProcessor.TpTask task = tp_tasks[nt]; int nTile = task.ty * tilesX + task.tx; geom_dbg[2 * i + 0][nTile] = task.xy[i][0]; // x geom_dbg[2 * i + 1][nTile] = task.xy[i][1]; // y for (int j = 0; j < 4; j++) { geom_dbg[2 * num_cams + 4 * i + j][nTile] = task.disp_dist[i][j]; } } } (new ShowDoubleFloatArrays()).showArrays( geom_dbg, tilesX, tilesY, true, name+"-GEOM-DBG-D"+clt_parameters.disparity, ImageDtt.GEOM_TITLES_DBG); } /* public TpTask [] getTasks (boolean use_aux) { float [] ftasks = new float [TPTASK_SIZE * num_task_tiles]; cuMemcpyDtoH(Pointer.to(ftasks), gpu_tasks, TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); TpTask [] tile_tasks = new TpTask[num_task_tiles]; for (int i = 0; i < num_task_tiles; i++) { tile_tasks[i] = new TpTask(ftasks, i* TPTASK_SIZE, use_aux); } return tile_tasks; } */ // Read extra data for macro generation: 4 DIFFs, 4 of R, 4 of B, 4 of G // Read extra data for macro generation: 4 DIFFs, 4 of R, 4 of B, 4 of G // Available after gpu_diff_rgb_combo is generated in execTextures // Available after gpu_diff_rgb_combo is generated in execTextures Loading Loading
src/main/java/com/elphel/imagej/cameras/CLTParameters.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -789,6 +789,7 @@ public class CLTParameters { public boolean gpu_save_ports_xy = false; // debug feature - save calculated ports X,Y to compare with Java-generated public boolean gpu_save_ports_xy = false; // debug feature - save calculated ports X,Y to compare with Java-generated public boolean gpu_show_jtextures = true; // debug feature - show Java-generated textures from non-overlapping in GPU (will not generate if false) public boolean gpu_show_jtextures = true; // debug feature - show Java-generated textures from non-overlapping in GPU (will not generate if false) public boolean gpu_show_extra = true; // show low-res data for macro public boolean gpu_show_extra = true; // show low-res data for macro public boolean gpu_show_geometry = true; // show geometry correction public boolean gpu_use_main = false; // accelerate tile processor for the main quad camera public boolean gpu_use_main = false; // accelerate tile processor for the main quad camera public boolean gpu_use_main_macro = false; // accelerate tile processor for the main quad camera in macro mode public boolean gpu_use_main_macro = false; // accelerate tile processor for the main quad camera in macro mode Loading Loading @@ -1591,6 +1592,7 @@ public class CLTParameters { properties.setProperty(prefix+"gpu_save_ports_xy", this.gpu_save_ports_xy +""); properties.setProperty(prefix+"gpu_save_ports_xy", this.gpu_save_ports_xy +""); properties.setProperty(prefix+"gpu_show_jtextures", this.gpu_show_jtextures +""); properties.setProperty(prefix+"gpu_show_jtextures", this.gpu_show_jtextures +""); properties.setProperty(prefix+"gpu_show_extra", this.gpu_show_extra +""); properties.setProperty(prefix+"gpu_show_extra", this.gpu_show_extra +""); properties.setProperty(prefix+"gpu_show_geometry", this.gpu_show_geometry +""); properties.setProperty(prefix+"gpu_use_main", this.gpu_use_main +""); properties.setProperty(prefix+"gpu_use_main", this.gpu_use_main +""); properties.setProperty(prefix+"gpu_use_main_macro", this.gpu_use_main_macro +""); properties.setProperty(prefix+"gpu_use_main_macro", this.gpu_use_main_macro +""); Loading Loading @@ -2377,6 +2379,7 @@ public class CLTParameters { if (properties.getProperty(prefix+"gpu_save_ports_xy")!=null) this.gpu_save_ports_xy=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_save_ports_xy")); if (properties.getProperty(prefix+"gpu_save_ports_xy")!=null) this.gpu_save_ports_xy=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_save_ports_xy")); if (properties.getProperty(prefix+"gpu_show_jtextures")!=null) this.gpu_show_jtextures=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_jtextures")); if (properties.getProperty(prefix+"gpu_show_jtextures")!=null) this.gpu_show_jtextures=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_jtextures")); if (properties.getProperty(prefix+"gpu_show_extra")!=null) this.gpu_show_extra=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_extra")); if (properties.getProperty(prefix+"gpu_show_extra")!=null) this.gpu_show_extra=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_extra")); if (properties.getProperty(prefix+"gpu_show_geometry")!=null) this.gpu_show_geometry=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_geometry")); if (properties.getProperty(prefix+"gpu_use_main")!=null) this.gpu_use_main=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main")); if (properties.getProperty(prefix+"gpu_use_main")!=null) this.gpu_use_main=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main")); if (properties.getProperty(prefix+"gpu_use_main_macro")!=null) this.gpu_use_main_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_macro")); if (properties.getProperty(prefix+"gpu_use_main_macro")!=null) this.gpu_use_main_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_macro")); Loading Loading @@ -3326,6 +3329,7 @@ public class CLTParameters { gd.addCheckbox ("Debug feature - save calculated ports X,Y to compare with Java-generated", this.gpu_save_ports_xy); gd.addCheckbox ("Debug feature - save calculated ports X,Y to compare with Java-generated", this.gpu_save_ports_xy); gd.addCheckbox ("Show Java-generated textures from non-overlapping in GPU (will not generate if false)", this.gpu_show_jtextures); gd.addCheckbox ("Show Java-generated textures from non-overlapping in GPU (will not generate if false)", this.gpu_show_jtextures); gd.addCheckbox ("Show low-res data for macro (will not generate if false)", this.gpu_show_extra); gd.addCheckbox ("Show low-res data for macro (will not generate if false)", this.gpu_show_extra); gd.addCheckbox ("Show per-tile geometry corrected tile coordinates and disparity derivatives", this.gpu_show_geometry); gd.addCheckbox ("Accelerate tile processor for the main quad camera", this.gpu_use_main); gd.addCheckbox ("Accelerate tile processor for the main quad camera", this.gpu_use_main); gd.addCheckbox ("Accelerate tile processor for the main quad camera in macro mode", this.gpu_use_main_macro); gd.addCheckbox ("Accelerate tile processor for the main quad camera in macro mode", this.gpu_use_main_macro); Loading Loading @@ -4085,6 +4089,7 @@ public class CLTParameters { this.gpu_save_ports_xy= gd.getNextBoolean(); this.gpu_save_ports_xy= gd.getNextBoolean(); this.gpu_show_jtextures= gd.getNextBoolean(); this.gpu_show_jtextures= gd.getNextBoolean(); this.gpu_show_extra= gd.getNextBoolean(); this.gpu_show_extra= gd.getNextBoolean(); this.gpu_show_geometry= gd.getNextBoolean(); this.gpu_use_main= gd.getNextBoolean(); this.gpu_use_main= gd.getNextBoolean(); this.gpu_use_main_macro= gd.getNextBoolean(); this.gpu_use_main_macro= gd.getNextBoolean(); Loading
src/main/java/com/elphel/imagej/gpu/GPUTileProcessor.java +49 −2 Original line number Original line Diff line number Diff line Loading @@ -190,6 +190,38 @@ public class GPUTileProcessor { this.task = task; this.task = task; this.disp_dist = new float [NUM_CAMS][4]; this.disp_dist = new float [NUM_CAMS][4]; } } /** * Initialize from the float array (read from the GPU) * @param flt float array containig tasks data * @param indx task number to use */ public TpTask(float [] flt, int indx, boolean use_aux) { task = Float.floatToIntBits(flt[indx++]); int txy = Float.floatToIntBits(flt[indx++]); ty = txy >> 16; tx = txy & 0xffff; if (use_aux) { xy_aux = new float[NUM_CAMS][2]; for (int i = 0; i < NUM_CAMS; i++) { xy_aux[i][0] = flt[indx++]; xy_aux[i][1] = flt[indx++]; } } else { xy = new float[NUM_CAMS][2]; for (int i = 0; i < NUM_CAMS; i++) { xy[i][0] = flt[indx++]; xy[i][1] = flt[indx++]; } } target_disparity = flt[indx++]; disp_dist = new float [NUM_CAMS][4]; for (int i = 0; i < NUM_CAMS; i++) { for (int j = 0; j < 4; j++) { disp_dist[i][j] = flt[indx++]; } } } // convert this class instance to float array to match layout of the C struct // convert this class instance to float array to match layout of the C struct public float [] asFloatArray(boolean use_aux) { public float [] asFloatArray(boolean use_aux) { Loading Loading @@ -896,6 +928,19 @@ public class GPUTileProcessor { } } cuMemcpyHtoD(gpu_tasks, Pointer.to(ftasks), TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); cuMemcpyHtoD(gpu_tasks, Pointer.to(ftasks), TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); } } public TpTask [] getTasks (boolean use_aux) { float [] ftasks = new float [TPTASK_SIZE * num_task_tiles]; cuMemcpyDtoH(Pointer.to(ftasks), gpu_tasks, TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); TpTask [] tile_tasks = new TpTask[num_task_tiles]; for (int i = 0; i < num_task_tiles; i++) { tile_tasks[i] = new TpTask(ftasks, i* TPTASK_SIZE, use_aux); } return tile_tasks; } /* /* public void setCorrIndices(int [] corr_indices) public void setCorrIndices(int [] corr_indices) { { Loading Loading @@ -1364,6 +1409,7 @@ public class GPUTileProcessor { * @param tp_tasks array of tasks that contain masks of the required pairs * @param tp_tasks array of tasks that contain masks of the required pairs * @return each element has (tile_number << 8) | (pair_number & 0xff) * @return each element has (tile_number << 8) | (pair_number & 0xff) */ */ @Deprecated public int [] getCorrTasks( public int [] getCorrTasks( TpTask [] tp_tasks) { TpTask [] tp_tasks) { int tilesX = img_width / DTT_SIZE; int tilesX = img_width / DTT_SIZE; Loading @@ -1390,12 +1436,12 @@ public class GPUTileProcessor { } } return iarr; return iarr; } } /** /** * Prepare contents pointers for calculation of the texture tiles (RGBA, 16x16) * Prepare contents pointers for calculation of the texture tiles (RGBA, 16x16) * @param tp_tasks array of tasks that contain masks of the required pairs * @param tp_tasks array of tasks that contain masks of the required pairs * @return each element has (tile_number << 8) | (1 << LIST_TEXTURE_BIT) * @return each element has (tile_number << 8) | (1 << LIST_TEXTURE_BIT) */ */ @Deprecated public int [] getTextureTasks( public int [] getTextureTasks( TpTask [] tp_tasks) { TpTask [] tp_tasks) { int tilesX = img_width / DTT_SIZE; int tilesX = img_width / DTT_SIZE; Loading Loading @@ -2215,6 +2261,7 @@ public class GPUTileProcessor { return fimg; return fimg; } } @Deprecated public void getTileSubcamOffsets( public void getTileSubcamOffsets( final TpTask[] tp_tasks, // will use // modify to have offsets for 8 cameras final TpTask[] tp_tasks, // will use // modify to have offsets for 8 cameras final GeometryCorrection geometryCorrection_main, final GeometryCorrection geometryCorrection_main, Loading
src/main/java/com/elphel/imagej/tileprocessor/GeometryCorrection.java +1 −37 Original line number Original line Diff line number Diff line Loading @@ -3052,21 +3052,13 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. * 5) return port center X and Y * 5) return port center X and Y * line_time * line_time */ */ double [] imu = null; double [] imu = null; if (disp_dist != null) { if (disp_dist != null) { imu = extrinsic_corr.getIMU(); // currently it is common for all channels imu = extrinsic_corr.getIMU(); // currently it is common for all channels if ((deriv_rots == null) && ((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0))){ if ((deriv_rots == null) && ((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0))){ // get deriv_rots - they are needed // if (use_rig_offsets) { // deriv_rots = extrinsic_corr.getRotDeriveMatrices(getRigMatrix); // } else { deriv_rots = extrinsic_corr.getRotDeriveMatrices(); deriv_rots = extrinsic_corr.getRotDeriveMatrices(); // } } } } } if ((disp_dist == null) && (pXYderiv != null)) { if ((disp_dist == null) && (pXYderiv != null)) { disp_dist = new double [numSensors][4]; disp_dist = new double [numSensors][4]; } } Loading Loading @@ -3097,7 +3089,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pYci0 = pYc - disparity * rXY[i][1]; double pYci0 = pYc - disparity * rXY[i][1]; // rectilinear, end of dealing with possibly other (master) camera, below all is for this camera distortions // rectilinear, end of dealing with possibly other (master) camera, below all is for this camera distortions // Convert a 2-d non-distorted vector to 3d at fl_pix distance in z direction // Convert a 2-d non-distorted vector to 3d at fl_pix distance in z direction double [][] avi = {{pXci0}, {pYci0},{fl_pix}}; double [][] avi = {{pXci0}, {pYci0},{fl_pix}}; Matrix vi = new Matrix(avi); // non-distorted sensor channel view vector in pixels (z -along the common axis) Matrix vi = new Matrix(avi); // non-distorted sensor channel view vector in pixels (z -along the common axis) Loading @@ -3111,20 +3102,10 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pXci = rvi.get(0, 0) * norm_z; double pXci = rvi.get(0, 0) * norm_z; double pYci = rvi.get(1, 0) * norm_z; double pYci = rvi.get(1, 0) * norm_z; // debug double norm_z_dbg = fl_pix/vi.get(2, 0); double pXci_dbg = vi.get(0, 0) * norm_z_dbg; double pYci_dbg = vi.get(1, 0) * norm_z_dbg; // Re-apply distortion // Re-apply distortion double rNDi = Math.sqrt(pXci*pXci + pYci*pYci); // in pixels double rNDi = Math.sqrt(pXci*pXci + pYci*pYci); // in pixels // Rdist/R=A8*R^7+A7*R^6+A6*R^5+A5*R^4+A*R^3+B*R^2+C*R+(1-A6-A7-A6-A5-A-B-C)"); // Rdist/R=A8*R^7+A7*R^6+A6*R^5+A5*R^4+A*R^3+B*R^2+C*R+(1-A6-A7-A6-A5-A-B-C)"); double ri = rNDi* ri_scale; // relative to distortion radius double ri = rNDi* ri_scale; // relative to distortion radius // double rD2rND = (1.0 - distortionA8 - distortionA7 - distortionA6 - distortionA5 - distortionA - distortionB - distortionC); double rNDi_dbg = Math.sqrt(pXci_dbg*pXci_dbg + pYci_dbg*pYci_dbg); // in pixels double ri_dbg = rNDi_dbg* ri_scale; // relative to distortion radius double rD2rND = 1.0; double rD2rND = 1.0; double rri = 1.0; double rri = 1.0; Loading @@ -3137,7 +3118,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. double pXid = pXci * rD2rND; double pXid = pXci * rD2rND; double pYid = pYci * rD2rND; double pYid = pYci * rD2rND; pXY[i][0] = pXid + this.pXY0[i][0]; pXY[i][0] = pXid + this.pXY0[i][0]; pXY[i][1] = pYid + this.pXY0[i][1]; pXY[i][1] = pYid + this.pXY0[i][1]; Loading Loading @@ -3173,7 +3153,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. } } } } double delta_t = 0.0; double delta_t = 0.0; // double [] imu = null; double [][] dpXci_pYci_imu_lin = new double[2][3]; // null double [][] dpXci_pYci_imu_lin = new double[2][3]; // null if (disp_dist != null) { if (disp_dist != null) { disp_dist[i] = new double [4]; // dx/d_disp, dx_d_ccw_disp disp_dist[i] = new double [4]; // dx/d_disp, dx_d_ccw_disp Loading @@ -3184,7 +3163,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. { 0.0, 0.0, 0.0}}; // what is last element??? { 0.0, 0.0, 0.0}}; // what is last element??? Matrix dd0 = new Matrix(add0); Matrix dd0 = new Matrix(add0); Matrix dd1 = rots[i].times(dd0).getMatrix(0, 1,0,1).times(norm_z); // get top left 2x2 sub-matrix Matrix dd1 = rots[i].times(dd0).getMatrix(0, 1,0,1).times(norm_z); // get top left 2x2 sub-matrix //// Matrix dd1 = dd0.getMatrix(0, 1,0,1); // get top left 2x2 sub-matrix // now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation) // now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation) // unity vector in the direction of radius // unity vector in the direction of radius double c_dist = pXci/rNDi; double c_dist = pXci/rNDi; Loading @@ -3206,12 +3184,7 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. disp_dist[i][1] = dd2.get(0, 1); disp_dist[i][1] = dd2.get(0, 1); disp_dist[i][2] = dd2.get(1, 0); // d_py/d_disp disp_dist[i][2] = dd2.get(1, 0); // d_py/d_disp disp_dist[i][3] = dd2.get(1, 1); disp_dist[i][3] = dd2.get(1, 1); // imu = extrinsic_corr.getIMU(i); // currently it is common for all channels // ERS linear does not yet use per-port rotations, probably not needed // ERS linear does not yet use per-port rotations, probably not needed // double [][] dpXci_pYci_imu_lin = new double[2][3]; // null if ((imu != null) &&((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0) ||(imu[3] != 0.0) ||(imu[4] != 0.0) ||(imu[5] != 0.0))) { if ((imu != null) &&((imu[0] != 0.0) || (imu[1] != 0.0) ||(imu[2] != 0.0) ||(imu[3] != 0.0) ||(imu[4] != 0.0) ||(imu[5] != 0.0))) { delta_t = dd2.get(1, 0) * disparity * line_time; // positive for top cameras, negative - for bottom delta_t = dd2.get(1, 0) * disparity * line_time; // positive for top cameras, negative - for bottom double ers_Xci = delta_t* (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); double ers_Xci = delta_t* (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); Loading @@ -3229,16 +3202,12 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. } } pXY[i][0] += ers_Xci * rD2rND; // added correction to pixel X pXY[i][0] += ers_Xci * rD2rND; // added correction to pixel X pXY[i][1] += ers_Yci * rD2rND; // added correction to pixel Y pXY[i][1] += ers_Yci * rD2rND; // added correction to pixel Y } else { } else { imu = null; imu = null; } } // TODO: calculate derivatives of pX, pY by 3 imu omegas // TODO: calculate derivatives of pX, pY by 3 imu omegas } } if (pXYderiv != null) { if (pXYderiv != null) { pXYderiv[2 * i] = new double [CorrVector.LENGTH]; pXYderiv[2 * i] = new double [CorrVector.LENGTH]; pXYderiv[2 * i+1] = new double [CorrVector.LENGTH]; pXYderiv[2 * i+1] = new double [CorrVector.LENGTH]; Loading Loading @@ -3272,8 +3241,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. // assuming drD2rND_imu* is zero (rD2rND does not depend on imu_* // assuming drD2rND_imu* is zero (rD2rND does not depend on imu_* // hope it will not be needed, as derivatives are used only for filed calibration, handled differently // hope it will not be needed, as derivatives are used only for filed calibration, handled differently if (imu != null) { if (imu != null) { // dpX_d = delta_t * rD2rND * (dpXci_dtilt * imu[0] + dpXci_dazimuth * imu[1] + dpXci_droll * imu[2]); // dpX_d = delta_t * rD2rND * (dpYci_dtilt * imu[0] + dpYci_dazimuth * imu[1] + dpYci_droll * imu[2]); pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpXci_dtilt; // * imu[0]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpXci_dtilt; // * imu[0]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpYci_dtilt; // * imu[0]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+0] = delta_t * rD2rND * dpYci_dtilt; // * imu[0]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+1] = delta_t * rD2rND * dpXci_dazimuth; // * imu[1]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+1] = delta_t * rD2rND * dpXci_dazimuth; // * imu[1]; Loading @@ -3285,9 +3252,6 @@ matrix([[-0.125, -0.125, 0.125, 0.125, -0.125, 0.125, -0. , -0. , -0. pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+4] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][1]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+4] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][1]; // * imu[5]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[0][2]; // * imu[5]; pXYderiv[2 * i + 0][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[0][2]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][2]; // * imu[5]; pXYderiv[2 * i + 1][CorrVector.IMU_INDEX+5] = delta_t * rD2rND * dpXci_pYci_imu_lin[1][2]; // * imu[5]; // TODO: Add linear egomotion } } // verify that d/dsym are well, symmetrical // verify that d/dsym are well, symmetrical Loading
src/main/java/com/elphel/imagej/tileprocessor/ImageDttCPU.java +27 −2 Original line number Original line Diff line number Diff line Loading @@ -191,6 +191,13 @@ public class ImageDttCPU { "top-aux", "bottom-aux", "left_aux", "right-aux", "diagm-aux", "diago-aux", "hor-aux", "vert-aux", "top-aux", "bottom-aux", "left_aux", "right-aux", "diagm-aux", "diago-aux", "hor-aux", "vert-aux", "inter", "other", "dbg1"}; "inter", "other", "dbg1"}; static String [] GEOM_TITLES_DBG ={ "px0","py0","px1","py1","px2","py2","px3","py3", "dd0-0","dd0-1","dd0-2","dd0-3", "dd1-0","dd1-1","dd1-2","dd1-3", "dd2-0","dd2-1","dd2-2","dd2-3", "dd3-0","dd3-1","dd3-2","dd3-3"}; public static int ML_OTHER_TARGET = 0; // Offset to target disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_TARGET = 0; // Offset to target disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH = 2; // Offset to ground truth disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH = 2; // Offset to ground truth disparity data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH_STRENGTH = 4; // Offset to ground truth confidence data in ML_OTHER_INDEX layer tile public static int ML_OTHER_GTRUTH_STRENGTH = 4; // Offset to ground truth confidence data in ML_OTHER_INDEX layer tile Loading Loading @@ -9596,6 +9603,7 @@ public class ImageDttCPU { final int tilesX=width/transform_size; final int tilesX=width/transform_size; final int tilesY=height/transform_size; final int tilesY=height/transform_size; final int nTilesInChn=tilesX*tilesY; final int nTilesInChn=tilesX*tilesY; final double [][] geom_dbg = new double [24][nTilesInChn]; // clt_data does not need to be for the whole image (no, it is used for textures) // clt_data does not need to be for the whole image (no, it is used for textures) final double [][][][][][][] clt_bidata = (keep_clt_data)? (new double[2][][][][][][]):null; final double [][][][][][][] clt_bidata = (keep_clt_data)? (new double[2][][][][][][]):null; if (clt_bidata != null) { if (clt_bidata != null) { Loading Loading @@ -9829,7 +9837,15 @@ public class ImageDttCPU { centerX, centerX, centerY, centerY, disparity_main); // + disparity_corr); disparity_main); // + disparity_corr); if (geom_dbg != null) { for (int i = 0; i < quad_main; i++) { geom_dbg[2 * i + 0][nTile] = centersXY_main[i][0]; // x geom_dbg[2 * i + 1][nTile] = centersXY_main[i][1]; // y for (int j = 0; j < 4; j++) { geom_dbg[2 * quad_main + 4 * i + j][nTile] = disp_dist_main[i][j]; } } } centersXY_aux = geometryCorrection_aux.getPortsCoordinatesAndDerivatives( centersXY_aux = geometryCorrection_aux.getPortsCoordinatesAndDerivatives( geometryCorrection_main, // GeometryCorrection gc_main, geometryCorrection_main, // GeometryCorrection gc_main, true, // boolean use_rig_offsets, true, // boolean use_rig_offsets, Loading Loading @@ -10327,6 +10343,15 @@ public class ImageDttCPU { }; }; } } startAndJoin(threads); startAndJoin(threads); if (geom_dbg != null) { (new ShowDoubleFloatArrays()).showArrays( geom_dbg, tilesX, tilesY, true, "geom_dbg", GEOM_TITLES_DBG); } // If it was low-texture mode, use lt_corr to average bi-quad inter-correlation between neighbor tiles and then calculate disparity/strength // If it was low-texture mode, use lt_corr to average bi-quad inter-correlation between neighbor tiles and then calculate disparity/strength if (lt_corr != null) { if (lt_corr != null) { Loading
src/main/java/com/elphel/imagej/tileprocessor/QuadCLT.java +45 −0 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,8 @@ package com.elphel.imagej.tileprocessor; ** ** */ */ import static jcuda.driver.JCudaDriver.cuMemcpyDtoH; import java.awt.Rectangle; import java.awt.Rectangle; import java.io.DataOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileNotFoundException; Loading @@ -42,9 +44,12 @@ import com.elphel.imagej.common.ShowDoubleFloatArrays; import com.elphel.imagej.correction.CorrectionColorProc; import com.elphel.imagej.correction.CorrectionColorProc; import com.elphel.imagej.correction.EyesisCorrections; import com.elphel.imagej.correction.EyesisCorrections; import com.elphel.imagej.gpu.GPUTileProcessor; import com.elphel.imagej.gpu.GPUTileProcessor; import com.elphel.imagej.gpu.GPUTileProcessor.TpTask; import ij.ImagePlus; import ij.ImagePlus; import ij.ImageStack; import ij.ImageStack; import jcuda.Pointer; import jcuda.Sizeof; public class QuadCLT extends QuadCLTCPU { public class QuadCLT extends QuadCLTCPU { private GPUTileProcessor.GpuQuad gpuQuad = null; private GPUTileProcessor.GpuQuad gpuQuad = null; Loading Loading @@ -750,6 +755,46 @@ public class QuadCLT extends QuadCLTCPU { int tilesX = quadCLT_main.getGPU().getImageWidth() / quadCLT_main.getGPU().getDttSize(); int tilesX = quadCLT_main.getGPU().getImageWidth() / quadCLT_main.getGPU().getDttSize(); int tilesY = quadCLT_main.getGPU().getImageHeight() / quadCLT_main.getGPU().getDttSize(); int tilesY = quadCLT_main.getGPU().getImageHeight() / quadCLT_main.getGPU().getDttSize(); if (clt_parameters.gpu_show_geometry) { // GPUTileProcessor.TpTask [] tp_tasks = quadCLT_main.getGPU().getTasks (false); // boolean use_aux) double [][] geom_dbg = new double [ImageDtt.GEOM_TITLES_DBG.length][tilesX*tilesY]; int num_cams =GPUTileProcessor.NUM_CAMS; for (int nt = 0; nt < tp_tasks.length; nt++) { for (int i = 0; i < num_cams; i++) { GPUTileProcessor.TpTask task = tp_tasks[nt]; int nTile = task.ty * tilesX + task.tx; geom_dbg[2 * i + 0][nTile] = task.xy[i][0]; // x geom_dbg[2 * i + 1][nTile] = task.xy[i][1]; // y for (int j = 0; j < 4; j++) { geom_dbg[2 * num_cams + 4 * i + j][nTile] = task.disp_dist[i][j]; } } } (new ShowDoubleFloatArrays()).showArrays( geom_dbg, tilesX, tilesY, true, name+"-GEOM-DBG-D"+clt_parameters.disparity, ImageDtt.GEOM_TITLES_DBG); } /* public TpTask [] getTasks (boolean use_aux) { float [] ftasks = new float [TPTASK_SIZE * num_task_tiles]; cuMemcpyDtoH(Pointer.to(ftasks), gpu_tasks, TPTASK_SIZE * num_task_tiles * Sizeof.FLOAT); TpTask [] tile_tasks = new TpTask[num_task_tiles]; for (int i = 0; i < num_task_tiles; i++) { tile_tasks[i] = new TpTask(ftasks, i* TPTASK_SIZE, use_aux); } return tile_tasks; } */ // Read extra data for macro generation: 4 DIFFs, 4 of R, 4 of B, 4 of G // Read extra data for macro generation: 4 DIFFs, 4 of R, 4 of B, 4 of G // Available after gpu_diff_rgb_combo is generated in execTextures // Available after gpu_diff_rgb_combo is generated in execTextures Loading