Skip to content

Commit 3a1a7b7

Browse files
committed
allow resizing inputs when republishing (#28)
1 parent 949fecb commit 3a1a7b7

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

hydra_ros/include/hydra_ros/active_window/reconstruction_visualizer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
#include <sensor_msgs/msg/image.hpp>
4646
#include <sensor_msgs/msg/point_cloud2.hpp>
4747

48+
#include "hydra_ros/utils/input_data_to_messages.h"
49+
4850
namespace hydra {
4951

5052
class ReconstructionVisualizer : public ActiveWindowModule::Sink {
@@ -68,6 +70,7 @@ class ReconstructionVisualizer : public ActiveWindowModule::Sink {
6870
visualizer::RangeColormap::Config colormap;
6971
visualizer::CategoricalColormap::Config label_colormap;
7072
config::VirtualConfig<MeshColoring> mesh_coloring;
73+
DisplayConfig image_display;
7174
} const config;
7275

7376
explicit ReconstructionVisualizer(const Config& config);

hydra_ros/include/hydra_ros/utils/input_data_to_messages.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,34 @@ namespace hydra {
4545
struct InputData;
4646
using CmapFunc = std::function<spark_dsg::Color(uint32_t)>;
4747

48+
struct DisplayConfig {
49+
float width_scale = 1.0f;
50+
float height_scale = 1.0f;
51+
};
52+
53+
void declare_config(DisplayConfig& config);
54+
4855
/**
4956
* @brief Make a colored image for the current labels in the input data
5057
*/
5158
sensor_msgs::msg::Image::SharedPtr makeImage(const std_msgs::msg::Header& header,
5259
const InputData& sensor_data,
53-
const CmapFunc& colormap);
60+
const CmapFunc& colormap,
61+
const DisplayConfig& config = {});
5462

5563
/**
5664
* @brief Copy the current depth image to ros
5765
*/
5866
sensor_msgs::msg::Image::SharedPtr makeDepthImage(const std_msgs::msg::Header& header,
59-
const InputData& sensor_data);
67+
const InputData& sensor_data,
68+
const DisplayConfig& config = {});
69+
70+
/**
71+
* @brief Copy the current range image to ros
72+
*/
73+
sensor_msgs::msg::Image::SharedPtr makeRangeImage(const std_msgs::msg::Header& header,
74+
const InputData& sensor_data,
75+
const DisplayConfig& config = {});
6076

6177
/**
6278
* @brief Convert the input pointcloud to a ROS type

hydra_ros/src/active_window/reconstruction_visualizer.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
#include <tf2_eigen/tf2_eigen.hpp>
4545

4646
#include "hydra_ros/common.h"
47-
#include "hydra_ros/utils/input_data_to_messages.h"
4847
#include "hydra_ros/visualizer/voxel_drawing.h"
4948

5049
namespace hydra {
@@ -102,6 +101,7 @@ void declare_config(ReconstructionVisualizer::Config& config) {
102101
field(config.filter_points_by_range, "filter_points_by_range");
103102
field(config.colormap, "colormap");
104103
field(config.label_colormap, "label_colormap");
104+
field(config.image_display, "image_display");
105105
config.mesh_coloring.setOptional();
106106
field(config.mesh_coloring, "mesh_coloring");
107107
}
@@ -187,12 +187,18 @@ void ReconstructionVisualizer::call(uint64_t timestamp_ns,
187187

188188
const auto sensor_name = output.sensor_data->getSensor().name;
189189
image_pubs_.publish(sensor_name + "/labels", [&]() {
190-
return makeImage(header, *output.sensor_data, [this](uint32_t label) {
191-
return label_colormap_(label);
192-
});
190+
return makeImage(
191+
header,
192+
*output.sensor_data,
193+
[this](uint32_t label) { return label_colormap_(label); },
194+
config.image_display);
195+
});
196+
image_pubs_.publish(sensor_name + "/depth", [&]() {
197+
return makeDepthImage(header, *output.sensor_data, config.image_display);
198+
});
199+
image_pubs_.publish(sensor_name + "/range", [&]() {
200+
return makeRangeImage(header, *output.sensor_data, config.image_display);
193201
});
194-
image_pubs_.publish(sensor_name + "/depth",
195-
[&]() { return makeDepthImage(header, *output.sensor_data); });
196202
cloud_pubs_.publish(sensor_name + "/pointcloud", [&]() {
197203
return makeCloud(header, *output.sensor_data, config.filter_points_by_range);
198204
});

hydra_ros/src/utils/input_data_to_messages.cpp

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* -------------------------------------------------------------------------- */
3535
#include "hydra_ros/utils/input_data_to_messages.h"
3636

37+
#include <config_utilities/config.h>
3738
#include <hydra/input/input_data.h>
3839

3940
#include <cv_bridge/cv_bridge.hpp>
@@ -59,36 +60,70 @@ PointField makeField(const std::string& name,
5960
return field;
6061
}
6162

63+
cv::Mat showImage(const cv::Mat& input, const DisplayConfig& config) {
64+
if (config.width_scale == 1.0f && config.height_scale == 1.0f) {
65+
return input;
66+
}
67+
68+
cv::Mat output;
69+
cv::resize(input,
70+
output,
71+
cv::Size(),
72+
config.width_scale,
73+
config.height_scale,
74+
cv::INTER_NEAREST);
75+
return output;
76+
}
77+
6278
} // namespace
6379

80+
void declare_config(DisplayConfig& config) {
81+
using namespace config;
82+
name("DisplayConfig");
83+
field(config.width_scale, "width_scale");
84+
field(config.height_scale, "height_scale");
85+
}
86+
6487
Image::SharedPtr makeImage(const std_msgs::msg::Header& header,
6588
const InputData& sensor_data,
66-
const CmapFunc& colormap) {
89+
const CmapFunc& colormap,
90+
const DisplayConfig& config) {
6791
const auto& labels = sensor_data.label_image;
6892
cv_bridge::CvImagePtr msg(new cv_bridge::CvImage());
6993
msg->header = header;
7094
msg->encoding = "rgb8";
71-
msg->image = cv::Mat(labels.rows, labels.cols, CV_8UC3);
95+
cv::Mat img(labels.rows, labels.cols, CV_8UC3);
7296
for (int r = 0; r < labels.rows; ++r) {
7397
for (int c = 0; c < labels.cols; ++c) {
74-
auto pixel = msg->image.ptr<uint8_t>(r, c);
98+
auto pixel = img.ptr<uint8_t>(r, c);
7599
const auto color = colormap(labels.at<int>(r, c));
76100
*pixel = color.r;
77101
*(pixel + 1) = color.g;
78102
*(pixel + 2) = color.b;
79103
}
80104
}
81105

106+
msg->image = showImage(img, config);
82107
return msg->toImageMsg();
83108
}
84109

85110
Image::SharedPtr makeDepthImage(const std_msgs::msg::Header& header,
86-
const InputData& sensor_data) {
87-
const auto& depth = sensor_data.depth_image;
111+
const InputData& sensor_data,
112+
const DisplayConfig& config) {
113+
cv_bridge::CvImagePtr msg(new cv_bridge::CvImage());
114+
msg->header = header;
115+
msg->encoding = "32FC1";
116+
msg->image = showImage(sensor_data.depth_image, config);
117+
return msg->toImageMsg();
118+
}
119+
120+
Image::SharedPtr makeRangeImage(const std_msgs::msg::Header& header,
121+
const InputData& sensor_data,
122+
const DisplayConfig& config) {
88123
cv_bridge::CvImagePtr msg(new cv_bridge::CvImage());
89124
msg->header = header;
90125
msg->encoding = "32FC1";
91-
msg->image = depth;
126+
msg->image = showImage(sensor_data.range_image, config);
92127
return msg->toImageMsg();
93128
}
94129

0 commit comments

Comments
 (0)