I have been trying to find some sample codes in C++ to gain insight on how to use cv_bridge for ROS2 however the only examples i'm getting are the ones coming from ROS1. Given that it uses sharedPtr instead of the default ones. Can anyone enlighten me by sharing how to do the similar task said in the cv_bridge tutorials which is subscribing from sensor_msgs::msg::Image and convert it to something that can be manipulated by openCV functions? Any advice is appreciated and I attached my code in this mail.
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "sensor_msgs/msg/image.hpp"
#include <image_transport/image_transport.hpp>
#include <memory>
#include "cv_bridge/cv_bridge.h"
#include <opencv2/opencv.hpp>
// #include <sensor_msgs/msg/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using std::placeholders::_1;
class MinimalSubscriber : public rclcpp::Node
{
public:
MinimalSubscriber()
: Node("minimal_subscriber")
{
subscription_ = this->create_subscription<sensor_msgs::msg::Image>(
"topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
}
private:
void topic_callback(const sensor_msgs::msg::Image::SharedPtr msg) const
{
cv_bridge::CvImagePtr cv_ptr;
cv_ptr = cv_bridge::toCvCopy(msg,'BGR8' );
if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
}
rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalSubscriber>());
rclcpp::shutdown();
return 0;
}
question from:
https://stackoverflow.com/questions/65935364/looking-for-cv-bridge-example-in-c-for-ros2 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…