/tof_depth image conversion problem
-
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 -
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 -
@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
-
@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
Reading along? Create a free ModalAI Forum account to join in.
With an account you can reply, ask your own question, get an email when a ModalAI engineer answers, and mark the reply that solved it. Your place in each thread is saved between visits.
Questions about VOXL, Flight Core, ESCs and ModalAI drones are answered here by the engineers who build them.
Register Login