首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++ for ROS2中查找ROS2示例

在C++ for ROS2中查找ROS2示例
EN

Stack Overflow用户
提问于 2021-01-28 10:35:42
回答 1查看 4.2K关注 0票数 2

我一直试图在C++中找到一些示例代码,以了解如何将cv_bridge用于ROS2,但是我得到的唯一示例是来自ROS1的示例。考虑到它使用的是sharedPtr而不是默认的。有人能通过分享如何完成cv_bridge教程中提到的类似任务来启发我吗?该教程正在订阅sensor_msgs::msg::Image,并将其转换为可以由openCV函数操作的内容?任何建议都很感谢,我在这封邮件中附上了我的代码。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2022-10-31 11:09:03

也许答案有点晚,但这似乎是一个常见的问题。

首先,要构建具有正确的OpenCV和CVBridge依赖项的包,需要将它们包含在CMakeList.txt中。

代码语言:javascript
复制
find_package(cv_bridge REQUIRED)
find_package(OpenCV REQUIRED)

add_subdirectory (../lib lib)

include_directories(
  include
  ${OpenCV_INCLUDE_DIRS}
)

并为您安装的每个目标包括:

代码语言:javascript
复制
ament_target_dependencies(node
  "rclcpp"
  "cv_bridge"
)
  
target_link_libraries(node
  ${OpenCV_LIBS}
)

接下来,在头文件中包括库:

代码语言:javascript
复制
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui.hpp>

最后使用cv桥(使用一些示例代码):

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65935364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档