Skip to content

Commit c6280ef

Browse files
committed
Add feature to blur (for privacy) and rectify raw images in make_minimal_rosbag.py script
1 parent eded127 commit c6280ef

File tree

2 files changed

+65
-3
lines changed

2 files changed

+65
-3
lines changed

package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@
2525
<exec_depend>rviz_continuous_point_cloud</exec_depend>
2626
<exec_depend>rviz_colorize_point_cloud_by_label</exec_depend>
2727
<exec_depend>rosbag_panel</exec_depend>
28+
<exec_depend>cv_bridge</exec_depend>
2829

2930
</package>

scripts/make_minimal_rosbag.py

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,68 @@
22

33
import argparse
44

5+
import cv2 as cv
6+
import numpy as np
57
import progressbar
8+
from cv_bridge import CvBridge
9+
from image_geometry import PinholeCameraModel
610

711
import rosbag
812

9-
topic_whitelist = ['/tf', '/tf_static', '/bus/vls128_roof/eth_scan/bus_to_host', '/bus/os32_left/lidar_packets',
10-
'/bus/os32_right/lidar_packets']
13+
14+
def generate_rectify_map(cam_model):
15+
pixel_coordinate_mapping = np.ndarray(shape=(cam_model.height, cam_model.width, 2), dtype="float32")
16+
cv.initUndistortRectifyMap(cam_model.full_K, cam_model.D, cam_model.R, cam_model.full_P,
17+
(cam_model.width, cam_model.height), cv.CV_32FC2, pixel_coordinate_mapping, None)
18+
19+
# account for region of interest (roi)
20+
pixel_coordinate_mapping = pixel_coordinate_mapping[
21+
cam_model.raw_roi.y_offset:cam_model.raw_roi.y_offset + cam_model.raw_roi.height,
22+
cam_model.raw_roi.x_offset:cam_model.raw_roi.x_offset + cam_model.raw_roi.width]
23+
pixel_coordinate_mapping -= np.array([cam_model.raw_roi.x_offset, cam_model.raw_roi.y_offset])
24+
return pixel_coordinate_mapping
25+
26+
27+
def debayer_blur_and_rectify_image(msg_image, topic):
28+
cv_image = open_cv_bridge.imgmsg_to_cv2(msg_image, desired_encoding='rgb8')
29+
cv_image = cv.GaussianBlur(cv_image, (41, 41), 0)
30+
# try to rectify image if camera info is already available
31+
try:
32+
cv_image_rectified = cv.remap(cv_image, rectify_maps[topic], None, cv.INTER_CUBIC)
33+
except KeyError:
34+
cv_image_rectified = cv_image
35+
out = open_cv_bridge.cv2_to_imgmsg(cv_image_rectified, encoding="rgb8")
36+
out.header = msg_image.header
37+
return out
38+
39+
40+
topic_whitelist = [
41+
'/tf',
42+
'/tf_static',
43+
'/bus/vls128_roof/eth_scan/bus_to_host',
44+
'/bus/os32_left/lidar_packets',
45+
'/bus/os32_right/lidar_packets',
46+
'/sensor/camera/surround/front/image_raw',
47+
'/sensor/camera/surround/front/camera_info'
48+
]
49+
50+
# window_name = 'Remap demo'
51+
# cv.namedWindow(window_name)
1152

1253
parser = argparse.ArgumentParser(description='Creates minimal rosbag')
1354
parser.add_argument('--input_bag', type=str, help='specify input bag', required=True)
1455
parser.add_argument('--output_bag', type=str, help='specify output bag', required=True)
1556
parser.add_argument('--start_time', type=str, help='specify start time relative to bag start', default=0)
1657
parser.add_argument('--end_time', type=str, help='specify end time relative to bag start', default=-1)
58+
parser.add_argument('--blur_image', action='store_true')
1759
args = parser.parse_args()
1860

1961
start = float(args.start_time)
2062
end = float(args.end_time)
2163

64+
open_cv_bridge = CvBridge()
65+
rectify_maps = dict()
66+
2267
record_stamp_of_first_msg = None
2368
latched_messages_before_start = []
2469

@@ -34,6 +79,22 @@
3479

3580
# check if topic is in whitelist
3681
if m.topic in topic_whitelist:
82+
83+
# generate rectify map from camera info in order to be able to rectify the raw image later
84+
if args.blur_image and m.connection_header['type'] == b'sensor_msgs/CameraInfo' and m.topic not in rectify_maps:
85+
model = PinholeCameraModel()
86+
model.fromCameraInfo(m.message)
87+
rectify_maps[m.topic.replace("/camera_info", "")] = generate_rectify_map(model)
88+
89+
# check if image and whether it should be blurred
90+
if args.blur_image and m.connection_header['type'] == b'sensor_msgs/Image' and m.topic.endswith(
91+
'image_raw'):
92+
msg = debayer_blur_and_rectify_image(m.message, m.topic.replace("/image_raw", ""))
93+
topic = m.topic[:-9] + "image_rect_color"
94+
else:
95+
msg = m.message
96+
topic = m.topic
97+
3798
if t_rel < start and 'latching' in m.connection_header and m.connection_header['latching'] == b'1':
3899
# latched message before start; save and insert it later
39100
latched_messages_before_start.append(m)
@@ -45,4 +106,4 @@
45106
connection_header=m_latched.connection_header) # using timestamp of m to avoid gap
46107

47108
# write message
48-
output_bag.write(m.topic, m.message, m.timestamp, connection_header=m.connection_header)
109+
output_bag.write(topic, msg, m.timestamp, connection_header=m.connection_header)

0 commit comments

Comments
 (0)