我一直在尝试在 C++ 中找到一些示例代码,以深入了解如何在 ROS2 中使用 cv_bridge,但是我得到的唯一示例是来自 ROS1 的示例。鉴于它使用sharedPtr而不是默认的。任何人都可以通过分享如何执行 cv_bridge 教程中所述的类似任务来启发我,该任务是从sensor_msgs::msg::Image 订阅并将其转换为可以由 openCV 函数操作的东西吗?感谢任何建议,我在这封邮件中附上了我的代码。
#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;
}
最佳答案
也许答案有点晚了,但这似乎是一个常见问题
首先,要使用 OpenCV 和 CVBridge 的正确依赖项构建包,您需要将它们包含在 CMakeList.txt
find_package(cv_bridge REQUIRED)
find_package(OpenCV REQUIRED)
add_subdirectory (../lib lib)
include_directories(
include
${OpenCV_INCLUDE_DIRS}
)
并包含您安装的每个目标:
ament_target_dependencies(node
"rclcpp"
"cv_bridge"
)
target_link_libraries(node
${OpenCV_LIBS}
)
接下来将库包含在您的头文件中:
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui.hpp>
最后使用 cv 桥(带有一些示例代码):
cv_bridge::CvImagePtr cv_ptr;
cv_ptr = cv_bridge::toCvCopy(request->depth_image, request->depth_image.encoding);
cv::patchNaNs(cv_ptr->image, 0.0);
// Datatype depends on your camera image encoding!
if (cv_ptr->image.at<float>(row, col) >= 0.001)
{
depth = cv_ptr->image.at<float>(row, col);
return true;
}
关于c++ - 寻找 ROS2 的 C++ 中的 cv_bridge 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65935364/