|
21 | 21 | #define LOG_PERIOD_S 10 |
22 | 22 | #define NODE_NAME "sc" |
23 | 23 |
|
| 24 | +bool isMono(const ST::ColorFrame &visFrame) |
| 25 | +{ |
| 26 | + return visFrame.width() * visFrame.height() == visFrame.rgbSize(); |
| 27 | +} |
| 28 | + |
| 29 | +std::string getEncoding(const ST::ColorFrame &visFrame) |
| 30 | +{ |
| 31 | + return isMono(visFrame) ? sensor_msgs::image_encodings::MONO8 : sensor_msgs::image_encodings::RGB8; |
| 32 | +} |
| 33 | + |
24 | 34 | struct SessionDelegate : ST::CaptureSessionDelegate { |
25 | 35 | private: |
26 | 36 | std::mutex lock; |
@@ -198,25 +208,16 @@ struct SessionDelegate : ST::CaptureSessionDelegate { |
198 | 208 | return; |
199 | 209 | } |
200 | 210 |
|
201 | | - cv::Mat img(visFrame.height(), visFrame.width(), CV_8UC1); |
| 211 | + const std::string encoding = getEncoding(visFrame); |
202 | 212 |
|
203 | | - const uint8_t* buf = visFrame.rgbData(); |
204 | | - |
205 | | - for(int y = 0; y < visFrame.height(); y++) |
206 | | - { |
207 | | - for(int x = 0; x < visFrame.width(); x++) |
208 | | - { |
209 | | - std::size_t pixelOffset = (y * visFrame.width()) + x; |
210 | | - img.at<uchar>(y, x) = buf[pixelOffset]; |
211 | | - } |
212 | | - } |
| 213 | + cv::Mat img(visFrame.height(), visFrame.width(), cv_bridge::getCvType(encoding), static_cast<void*>(const_cast<uint8_t*>(visFrame.rgbData()))); |
213 | 214 |
|
214 | 215 | std_msgs::Header header; |
215 | 216 | header.frame_id = frame_id_; |
216 | 217 | // TODO: convert timstamp to ROS time |
217 | 218 | // header.stamp = infraredFrame.timestamp(); |
218 | 219 |
|
219 | | - sensor_msgs::ImagePtr msg = cv_bridge::CvImage(header, "mono8", img).toImageMsg(); |
| 220 | + sensor_msgs::ImagePtr msg = cv_bridge::CvImage(header, encoding, img).toImageMsg(); |
220 | 221 | vis_pub_.publish(msg); |
221 | 222 |
|
222 | 223 | sensor_msgs::CameraInfo cam_info; |
|
0 commit comments