Introduction
cv_bridge helps connect ROS images with OpenCV so you can easily work with camera data in your robot programs.
cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(ros_image_msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } cv::Mat image = cv_ptr->image;
toCvCopy to convert ROS image messages to OpenCV images safely.BGR8 to match OpenCV's expected format.cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(ros_image_msg, sensor_msgs::image_encodings::MONO8);
cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(ros_image_msg, sensor_msgs::image_encodings::BGR8);
cv_bridge::CvImage cv_image; cv_image.image = cv::Mat::zeros(480, 640, CV_8UC3); cv_image.encoding = sensor_msgs::image_encodings::BGR8; image_pub.publish(cv_image.toImageMsg());
#include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/opencv.hpp> void imageCallback(const sensor_msgs::ImageConstPtr& msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } cv::Mat gray; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); cv::imshow("Gray Image", gray); cv::waitKey(30); } int main(int argc, char** argv) { ros::init(argc, argv, "cv_bridge_example"); ros::NodeHandle nh; cv::namedWindow("Gray Image", cv::WINDOW_AUTOSIZE); ros::Subscriber sub = nh.subscribe("camera/image", 1, imageCallback); ros::spin(); cv::destroyWindow("Gray Image"); return 0; }
cv_bridge in ROS?ros_img to an OpenCV image using cv_bridge in C++?cv_bridge::toCvCopy returning a CvImagePtr pointer with the ROS image and encoding.cv_bridge::toCvCopy with the ROS image and encoding BGR8, returning a pointer.cv_bridge::CvImagePtr cv_ptr;
try {
cv_ptr = cv_bridge::toCvCopy(ros_img, sensor_msgs::image_encodings::MONO8);
std::cout << cv_ptr->image.type() << std::endl;
} catch (cv_bridge::Exception& e) {
std::cout << "Conversion failed" << std::endl;
}cv_ptr->image.type()type() method returns an integer code; for CV_8UC1 it is 0, so the output will be 0.cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(ros_img);
cv::Mat img = cv_ptr->image;
cv::imshow("Image", img);
cv::waitKey(30);toCvCopy function requires specifying the image encoding to correctly convert the ROS image.toCvCopy is called without the encoding argument, which will cause a compilation or runtime error.BGR8 ensures a color image in OpenCV, then converting to grayscale with cvtColor is reliable.Pass the test and this pattern moves unknown