@@ -53,19 +53,19 @@ def __init__(self, data_dir: Path, topic: str, format_fn=None):
53
53
self .metadata ["topic" ] = topic
54
54
self .metadata ["num_messages" ] = 0
55
55
56
- def push_back (self , data : Union [PointCloudXf , Image , Imu ], timestamp ):
56
+ def push_back (self , data : Union [PointCloudXf , Image , Imu ], timestamp , * args , ** kwargs ):
57
57
if "msg_type" not in self .metadata :
58
58
self .metadata ["msg_type" ] = data .__class__ .__name__
59
59
60
60
if self .metadata ["msg_type" ] != data .__class__ .__name__ :
61
61
raise RuntimeError (
62
62
f"TopicHandler is bound to { self .metadata ['msg_type' ]} . Cannot handle data of type { type (data )} " )
63
63
64
- self .save_fn [self .metadata ["msg_type" ]](data , timestamp )
64
+ self .save_fn [self .metadata ["msg_type" ]](data , timestamp , * args , ** kwargs )
65
65
self .timestamps .append (timestamp )
66
66
self .metadata ["num_messages" ] += 1
67
67
68
- def _save_cloud (self , data : PointCloudXf , timestamp ):
68
+ def _save_cloud (self , data : PointCloudXf , timestamp , * args , ** kwargs ):
69
69
dest_path = self .data_f / Path (self .format_fn (self .metadata ["num_messages" ]) + ".bin" )
70
70
# Save fields to metadata to recover it later.
71
71
# We assume fields to remain constant through data of this topic
@@ -78,16 +78,28 @@ def _save_cloud(self, data: PointCloudXf, timestamp):
78
78
with open (self .data_f / ".dtype.pkl" , "wb" ) as f :
79
79
pickle .dump (data .points .dtype , f )
80
80
81
- data .points .tofile (dest_path )
81
+ if "pcloud_kitti_format" in kwargs :
82
+ if kwargs .get ("pcloud_kitti_format" ):
83
+ clip_points = np .stack ([data .points ["x" ], data .points ["y" ], data .points ["z" ], data .points ["intensity" ]],
84
+ axis = 1 )
85
+ clip_points .tofile (dest_path )
86
+ else :
87
+ data .points .tofile (dest_path )
82
88
83
- def _save_image (self , data : Image , timestamp : float ):
89
+ def _save_image (self , data : Image , timestamp : float , * args , ** kwargs ):
84
90
dest_path = self .data_f / Path (self .format_fn (self .metadata ["num_messages" ]) + ".png" )
91
+
92
+ if "rgb_convert" in kwargs :
93
+ if kwargs .get ("rgb_convert" ):
94
+ data .image = cv2 .cvtColor (data .image , cv2 .COLOR_BAYER_RG2RGB )
95
+ data .encoding = "rgb8"
96
+
85
97
if not "encoding" in self .metadata .keys ():
86
98
self .metadata ["encoding" ] = data .encoding
87
99
88
100
cv2 .imwrite (str (dest_path ), data .image )
89
101
90
- def _save_imu (self , data : Imu , timestamp : float ):
102
+ def _save_imu (self , data : Imu , timestamp : float , * args , ** kwargs ):
91
103
if not self .imu_dest :
92
104
self .imu_dest = (self .data_f / "imu.txt" ).open ("w" )
93
105
self .imu_dest .write (IMU_CSV_HEADER )
@@ -109,10 +121,12 @@ def close(self):
109
121
110
122
111
123
class KittiWriter :
112
- def __init__ (self , data_dir : Path ):
124
+ def __init__ (self , data_dir : Path , rgb_convert : bool = True , pcloud_kitti_format : bool = True , * args , ** kwargs ):
113
125
data_dir .mkdir (parents = True , exist_ok = True )
114
126
self .destination_dir = data_dir
115
127
self .data_handles = {}
128
+ self .rgb_convert = rgb_convert
129
+ self .pcloud_kitti_format = pcloud_kitti_format
116
130
117
131
def __enter__ (self ):
118
132
return self
@@ -127,8 +141,9 @@ def publish(self, timestamp, topic: str, message: Union[PointCloudXf, Image, Imu
127
141
self .data_handles [topic ] = KittiTopicHandler (self .destination_dir / Path (handle_dir ), topic ,
128
142
lambda x : f"{ x :010d} " )
129
143
130
- self .data_handles [topic ].push_back (message , timestamp )
144
+ self .data_handles [topic ].push_back (message , timestamp , rgb_convert = self .rgb_convert ,
145
+ pcloud_kitti_format = self .pcloud_kitti_format )
131
146
132
147
def __exit__ (self , exc_type , exc_val , exc_tb ):
133
148
for handle in self .data_handles :
134
- self .data_handles [handle ].close ()
149
+ self .data_handles [handle ].close ()
0 commit comments