# /tof_depth image conversion problem

Source: https://forum.modalai.com/topic/4075/tof_depth-image-conversion-problem
Category: VOXL SDK and Software (https://forum.modalai.com/category/47/voxl-sdk-and-software)
Tags: ros
Posted: 2025-01-09 01:21:06 UTC by Judoor 0
Replies: 3 · Views: 2781

## Judoor 0 · 2025-01-09 01:21:06 UTC

Hello,
I would like to convert the depth image from mono8 to UC16 while maintaining accurate depth references.
Currently, I am doing this, but I am ending up with a flat image.
```
void depthCallback(const sensor_msgs::ImageConstPtr &msg)
     {
         try
         {

             // Convert the input ROS image to an OpenCV image
             cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::MONO8);

             // Create a new image in CV_16UC1 format
             cv::Mat converted_image;
             cv_ptr->image.convertTo(converted_image, CV_16UC1, 256.0); // Scale mono8 values to 16-bit

             // Publish the converted image
             cv_bridge::CvImage out_msg;
             out_msg.header = msg->header; // Keep the same header
             out_msg.encoding = sensor_msgs::image_encodings::TYPE_16UC1;
             out_msg.image = converted_image;
             depth_pub_.publish(out_msg.toImageMsg());
             // depth_pub_.publish(depth_msg);
         }
         catch (cv_bridge::Exception &e)
         {
             ROS_ERROR("CvBridge Error in depthCallback: %s", e.what());
         }
     }
```
Also, I want to mix it with an RGB image to get an RGBD image, I'm using the rgbdsync nodelet from rtabmap_ros. But I'm unable to make it work. Does someone already did that ?
Julien

## Reply by Judoor 0 · 2025-01-09 21:11:08 UTC

Can you help me with the depth image conversion ?

## Reply by Alex Kushleyev (ModalAI staff) · 2025-01-14 02:07:42 UTC (in reply to Judoor 0)

@Judoor-0 , can you please clarify what you mean a "flat image" ?

Also, it seems you can convert the type to MONO16 right in toCvCopy call. Take a look at the implementation, which will automatically re-scale the data (from MONO8 to MONO16), so you will not lose any information (because in this case you will be upscaling, that is going from 8 bit to 16 bit): https://github.com/strawlab/vision_opencv/blob/master/cv_bridge/src/cv_bridge.cpp#L174

So you can probably just have:
```
cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::MONO16);

// Publish the converted image
cv_bridge::CvImage out_msg;
out_msg.header = msg->header; // Keep the same header
out_msg.encoding = sensor_msgs::image_encodings::TYPE_16UC1;
out_msg.image = cv_ptr->image;
depth_pub_.publish(out_msg.toImageMsg());
```

or i think you can just do the following because toCvCopy will automatically copy the header and update the encoding for you:
```
cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::MONO16);
depth_pub_.publish(cv_ptr->toImageMsg());
```

I have not tried running it, but hopefully should point you in the right direction!

Alex

## Reply by Judoor 0 · 2025-01-14 08:15:46 UTC (in reply to Alex Kushleyev)

@Alex-Kushleyev thank you alex i'll try that
