zoukankan      html  css  js  c++  java
  • 在ROS下使用openCV

    1.建立ROS工作环境

    mkdir -p ~/catkin_ws/src        //建立项目目录,同时生成src文件夹
    cd ~/catkin_ws/             //进入项目目录
    catkin_make         //编译项目,即使什么文件也没有也可以编译
    

    2.建立包

    本例中包名为“opencvExercise”

    cd ~/catkin_ws/src  
    catkin_create_pkg opencvExercise std_msgs rospy roscpp cv_bridge sensor_msgs image_transport
    

    3.源代码封装

    #include <ros/ros.h>
    #include<image_transport/image_transport.h>
    #include<cv_bridge/cv_bridge.h>
    #include<sensor_msgs/image_encodings.h>
    #include<opencv2/opencv.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    
    #include<stdio.h>
    #include<math.h>
    #include<vector>
    using namespace std;
    
    cv_bridge::CvImagePtr cv_ptr;
    using namespace cv;
    
    class ImageConverter
    {
    private:
        ros::NodeHandle nh_;
        //用于将msg信息转换为openCV中的Mat数据
        image_transport::ImageTransport it_;
        //订阅摄像头发布的信息
        image_transport::Subscriber image_sub_;
    public:
        ImageConverter()
        : it_(nh_)
        {
            //设置订阅摄像机
            image_sub_ = it_.subscribe("/usb_cam/image_raw", 1, &ImageConverter::imageCb, this);
        }
    
        ~ImageConverter(){
        }
    
        //收到摄像机后的回调函数
        void imageCb(const sensor_msgs::ImageConstPtr& msg){
            try{
                //将收到的消息使用cv_bridge转移到全局变量图像指针cv_ptr中,其成员变量image就是Mat型的图片
                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;
            }
            //处理图片信息
            myCode();
        }
        //你的代码可以移植在此处
        int myCode(){   
            Mat img=cv_ptr->image;
            cv::imshow("win",img);
            return 0;
        }
    };
    
    int main(int argc, char** argv)
    {
        ros::init(argc, argv, "image_converter");
        ImageConverter ic;
        //循环等待
        ros::spin();
        return 0;
    }
    

    需要注意的是ROS中发布的消息是不支持图片的,所以需要image_transport的支持。但是这个包和openCV的格式不兼容,所以需要cv_bridge做格式变换。最后照相机发布的消息类型是sensor_msgs包中的。

    4.CMakeLists.txt

    添加在文件末尾

    FIND_PACKAGE( OpenCV REQUIRED )
    AUX_SOURCE_DIRECTORY(src/. DIR_SRCS)
    ADD_EXECUTABLE(cylinder ${DIR_SRCS}  )
    target_link_libraries(cylinder ${catkin_LIBRARIES}) 
    target_link_libraries(cylinder ${OpenCV_LIBRARIES} )
    
  • 相关阅读:
    入门MySQL——基础语句篇
    装饰者模式
    (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter
    (18)IO流之字节缓冲路
    (17)IO中的异常处理
    (16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream
    (15)IO流之File
    (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
    (13)正则表达式
    (12)泛型
  • 原文地址:https://www.cnblogs.com/sgdd123/p/8419964.html
Copyright © 2011-2022 走看看