1+ import pykitti
2+ import numpy as np
3+ import argparse
4+ import os
5+ # import matplotlib
6+ # matplotlib.use('agg')
7+ from matplotlib import pyplot as plt
8+ from cv_tools import *
9+
10+
11+ os .chdir (os .path .dirname (__file__ ))
12+
13+ def str2bool (s :str ) -> bool :
14+ if s .isdigit ():
15+ if float (s ) > 0 :
16+ return True
17+ else :
18+ return False
19+ if s .lower () == "false" :
20+ return False
21+ else :
22+ return True
23+ def options ():
24+ parser = argparse .ArgumentParser ()
25+ kitti_parser = parser .add_argument_group ()
26+ kitti_parser .add_argument ("--base_dir" ,type = str ,default = "/data/DATA/data_odometry/dataset/" )
27+ kitti_parser .add_argument ("--seq" ,type = int ,default = 4 ,choices = [i for i in range (11 )])
28+ kitti_parser .add_argument ("--index_i" ,type = int ,default = 0 )
29+
30+ io_parser = parser .add_argument_group ()
31+ io_parser .add_argument ("--skip_pts" ,type = int ,default = 1 )
32+ io_parser .add_argument ("--gt_TCL_file" ,type = str ,default = "../KITTI-{:02d}/calib_res/gt_calib_{:02d}.txt" )
33+ io_parser .add_argument ("--pred_TCL_file" ,type = str ,default = "../KITTI-{:02d}/calib_res/iba_global_pl_{:02d}.txt" )
34+ io_parser .add_argument ("--dpi" ,type = int ,default = 100 )
35+
36+ arg_parser = parser .add_argument_group ()
37+ arg_parser .add_argument ("--view" ,type = str2bool ,default = False )
38+ arg_parser .add_argument ("--save_path" ,type = str ,default = "../fig/04/proj_04_combine.png" )
39+ args = parser .parse_args ()
40+ args .seq_id = "%02d" % args .seq
41+ if args .skip_pts <= 0 :
42+ args .skip_pts = 1
43+ args .gt_TCL_file = args .gt_TCL_file .format (args .seq , args .seq )
44+ args .pred_TCL_file = args .pred_TCL_file .format (args .seq , args .seq )
45+ return args
46+
47+ if __name__ == "__main__" :
48+ args = options ()
49+ dataStruct = pykitti .odometry (args .base_dir , args .seq_id )
50+ calibStruct = dataStruct .calib
51+ # extran = calibStruct.T_cam0_velo
52+ extran_raw = np .loadtxt (args .pred_TCL_file )
53+ extran = np .eye (4 )
54+ extran [:3 ,:] = extran_raw [:12 ].reshape (3 ,4 )
55+ gt_extran_raw = np .loadtxt (args .gt_TCL_file )
56+ gt_extran = np .eye (4 )
57+ gt_extran [:3 ,:] = gt_extran_raw [:12 ].reshape (3 ,4 )
58+ src_pcd_arr = dataStruct .get_velo (args .index_i )[::args .skip_pts ,:3 ] # [N, 3]
59+ src_img = np .array (dataStruct .get_cam0 (args .index_i )) # [H, W, 3]
60+ img_shape = src_img .shape [:2 ]
61+ intran = calibStruct .K_cam0
62+ plt .figure (figsize = (12 ,7.6 ),dpi = args .dpi ,tight_layout = True )
63+ plt .subplot (2 ,1 ,1 )
64+ proj_src , src_rev_idx = npproj (src_pcd_arr , extran , intran , img_shape )
65+ range_src = src_pcd_arr [:,- 1 ][src_rev_idx ]
66+ plt .imshow (src_img ,cmap = "Greys_r" )
67+ plt .scatter (proj_src [:,0 ],proj_src [:,1 ],marker = '.' ,s = 2.25 ,c = range_src ,cmap = 'rainbow_r' ,alpha = 0.8 )
68+ plt .axis ([0 ,img_shape [1 ],img_shape [0 ],0 ])
69+ plt .axis ('off' )
70+ plt .tight_layout (pad = 0 )
71+ plt .subplot (2 ,1 ,2 )
72+ proj_src , src_rev_idx = npproj (src_pcd_arr , gt_extran , intran , img_shape )
73+ range_src = src_pcd_arr [:,- 1 ][src_rev_idx ]
74+ plt .imshow (src_img ,cmap = "Greys_r" )
75+ plt .scatter (proj_src [:,0 ],proj_src [:,1 ],marker = '.' ,s = 2.25 ,c = range_src ,cmap = 'rainbow_r' ,alpha = 0.8 )
76+ plt .axis ([0 ,img_shape [1 ],img_shape [0 ],0 ])
77+ plt .axis ('off' )
78+ plt .tight_layout (pad = 0 )
79+ if args .view :
80+ plt .show ()
81+ plt .savefig (args .save_path )
82+
83+
84+
0 commit comments