美文网首页
ros(c++)之cv_bridge库简单使用

ros(c++)之cv_bridge库简单使用

作者: 5john家安 | 来源:发表于2017-11-10 18:53 被阅读0次

结果

一个彩色视图窗口和一个灰色视图窗口

内部逻辑

订阅rgb/image_raw话题,利用cv_bridge将收到的sensor_msgs/image类型消息转为cv_bridge::CvImagePtr类型数据,其内部属性即有Mat格式图片数据,调用cvtColor函数将彩色Mat转为灰色Mat,最终展示两个窗口

源码

cpp

#include "ros/ros.h"
#include "image_transport/image_transport.h"
#include "opencv2/highgui/highgui.hpp"
#include "cv_bridge/cv_bridge.h"
#include "sensor_msgs/image_encodings.h"

void showColorGrayView(const sensor_msgs::ImageConstPtr msgImg)
{
  cv_bridge::CvImagePtr cvImgPtr;
  try{
    cvImgPtr=cv_bridge::toCvCopy(msgImg,sensor_msgs::image_encodings::BGR8);
  }
  catch(cv_bridge::Exception e){
    ROS_ERROR_STREAM("Cv_bridge Exception:"<<e.what());
    return;
  }
  cv::Mat cvColorImgMat=cvImgPtr->image;
  cv::Mat cvGrayImgMat;
  cv::cvtColor(cvColorImgMat,cvGrayImgMat,CV_BGR2GRAY);
  cv::imshow("colorview",cvColorImgMat);
  cv::imshow("grayview",cvGrayImgMat);
  cv::waitKey(5);
}
int main(int argc, char **argv)
{
  ros::init(argc, argv, "grayview");
  ros::NodeHandle nh;
  image_transport::ImageTransport it(nh);
  cv::namedWindow("colorview",cv::WINDOW_NORMAL);
  cv::moveWindow("colorview",100,100);
  cv::namedWindow("grayview",cv::WINDOW_NORMAL);
  cv::moveWindow("grayview",600,100);
  image_transport::Subscriber sub = it.subscribe("/rgb/image_raw", 1, showColorGrayView);
  ros::spin();

  return 0;
}

package.xml

<?xml version="1.0"?>
<package format="2">
  <name>graycamera</name>
  <version>0.1.0</version>
  <description>The graycamera package</description>
  <maintainer email="fivejohn@5john.cn">fivejohn</maintainer>
  <license>Apache 2.0</license>
  <author >fivejohn</author>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <exec_depend>roscpp</exec_depend>
</package>

CMakeList.txt

cmake_minimum_required(VERSION 2.8.3)
project(graycamera)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  image_transport
  cv_bridge
  sensor_msgs
)
catkin_package()
include_directories(
  ${catkin_INCLUDE_DIRS}
)
find_package(OpenCV)
include_directories(
  ${OpenCV_INCLUDE_DIRS}
)
add_executable(grayview src/grayview.cpp)
target_link_libraries(grayview
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
)

相关文章

  • ros(c++)之cv_bridge库简单使用

    结果 内部逻辑 订阅rgb/image_raw话题,利用cv_bridge将收到的sensor_msgs/imag...

  • ROS2 概念

    ROS2 中使用客户程序库名字是 rcl, rclcpp 是C++库,rclpy是python 库 ROS2 有个...

  • 问题汇总

    #include 描述:Arduino使用ros库是提示#include 错...

  • 使用到的部分相关网站

    Linux gmp类库的简单使用(一) gmp安装及使用摘要 CSHA1 - A C++ Class Implem...

  • Valgrind ROS 内存泄漏查找

    ROS中用到第三方库,在编译第三方库的时候,加上 -g 选项,以供调用该库时调试。 在编译ROS包的时候,使用如下...

  • GDB ROS调试

    ROS中用到第三方库,在编译第三方库的时候,加上 -g 选项,以供调用该库时调试。 在编译ROS包的时候,使用如下...

  • C++ 编写 ROS node

    引言 用 C++ 编写的 ROS node 程序本质上依然是 C++ 程序,只不过额外添加了 ROS 相关的内容,...

  • 编写第一个ROS程序-发布器(Publisher)

    在上一篇文章中我们安装好了ROS环境。本篇文章我们将熟悉ROS中的一些概念(Concept),并尝试使用C++来实...

  • ros系统入门笔记(三)

    roscpp ——ros提供给cpp的接口(client library) 用C++语言与ros系统的topic,...

  • STL的内存碎片(内存空洞)验证

    C++的STL库在使用过程中要留意内存碎片,可以用以下方式简单验证

网友评论

      本文标题:ros(c++)之cv_bridge库简单使用

      本文链接:https://www.haomeiwen.com/subject/ttcimxtx.html