ROS中使用opencv

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28306361/article/details/85142192

在ROS中使用opencv的小例程

记录在ROS中学习使用opencv的过程

安装opencv

我们首先需要在ubuntu下安装ubuntu版本的opencv,

  1. 下载opencv的Linux版本,最好将contrib库也下载下来(同样是Linux版本),注意两者的兼容性,并安装好一些依赖库
  2. 参照网上教程安装GUI版本的cmake,以及后续的opencv编译。在第一次点完configure之后在上面的配置窗口找到OPENCV_EXTRA_MODULE_PATH,将opencv_contrib库中mudules的路径加入进去,然后再configure,无问题后generate。
    然后按照博客教程编译,make install后在/usr/local/lib中可以看到装好的opencv库文件(注意改路径),以及contrib库中的各种库文件,具体的安装代码如下:
sudo apt-get install cmake

sudo apt-get install cmake-qt-gui
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
sudo cmake-gui

cd opencv_source/mybuild/

sudo make -j4
sudo make install
配置库路径
sudo gedit /etc/ld.so.conf.d/opencv.conf
添加opencv库的安装路径:
/usr/local/lib

sudo ldconfig

sudo gedit /etc/bash.bashrc

添加PKG_CONFIG_PATH变量:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

建立OpenCV测试程序

准备工作

很喜欢这段话,作者将ROS中的各个概念解释地很清楚,工作空间(work space)是ROS中非常重要的一个概念,可以把工作空间理解为一个大的工厂,里面的分成几个大的生产车间(package),每一个生产车间中会有若干个具有不同技能的工人(node)。当工厂运转时,每个车间中的工人node同时工作,他们通过话题(topic)进行信息沟通。各个大的车间之间也存在这互相依赖的关系,共同组成一个有机的整体。
我们新建一个工作空间(和我们之间建立的工作空间catkin_ws一样)

mkdir -p ros_opencv/src

然后初始化工作空间(和我们之前做的一样,再来一遍)

 cd ros_opencv/src
 catkin_init_workspace

在src文件夹下创建package,功能包的名字叫做opencv_test

 catkin_create_pkg opencv_test sensor_msgs cv_bridge roscpp std_msgs image_transport

注意这一步很多网上的教程加上了opencv库,可能是ROS里面装的OpenCV,我推测如果是用自己安装的opencv库的话。后面是不用加的。我没加反而后面编译成功了。
修改opencv_test目录下的CMakeLists.txt
主要在find_package加上

find_package(OpenCV REQUIRED)

以及最后面加上

include_directories(include ${OpenCV_INCLUDE_DIRS})
include_directories(include ${catkin_INCLUDE_DIRS})
 
add_executable(opencv_test_node src/opencv_test_node.cpp)
target_link_libraries(opencv_test_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
add_dependencies(opencv_test_node opencv_test_gencpp)

然后你需要下载一张图片放在一个已知的位置,为读取图片做准备

程序

说了这么多,可以上主程序了

#include <ros/ros.h>
#include <stdio.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
 
static const char WINDOW[] = "Image window";
static void help()
{
    printf("\nThis program demonstrates converting OpenCV Image to ROS Image messages  \n"
        );
 
}
 
int main(int argc, char** argv)
{
  help();
  ros::init(argc, argv, "image_converter");
 
  //Reading an image from the file
  cv::Mat cv_image = cv::imread("/home/vlt/Pictures/1.jpg");
  if(cv_image.empty() )
    {
        ROS_ERROR("Read the picture failed!");
        return -1;
    }
 
  //Convert OpenCV image to ROS message
  ros::NodeHandle node;
  image_transport::ImageTransport transport(node);
  image_transport::Publisher image_pub; 
  image_pub=transport.advertise("OutImage", 1);
  ros::Time time=ros::Time::now(); 
 
  cv_bridge::CvImage cvi;
  cvi.header.stamp = time;
  cvi.header.frame_id = "image";
  cvi.encoding = "bgr8";
  cvi.image = cv_image;
 
  sensor_msgs::Image im;
  cvi.toImageMsg(im);
  image_pub.publish(im);
  ROS_INFO("Converted Successfully!");
 
  //Show the image
  cv::namedWindow(WINDOW);
  cv::imshow(WINDOW,cv_image);
  cv::waitKey(0);
 
  ros::spin();
  return 0;
}

后面还需要编译

cd ros_opencv
catkin_make

编译成功大概是这样的
编译成功!
之后就可以运行了

roscore
source devel/setup.bash
rosrun opencv_test opencv_test_node

运行成功就可以出现漂亮的小仙女啦!
在这里插入图片描述
OK!祝大家也运行成功!

参考链接
1:需要用到OpenCV依赖库的CMakeLists注意事项
2:ROS初级教程cmake cmakelist.txt的编写教程,让你看懂一大堆cmakelist里面写的是什么
3:程序参考

猜你喜欢

转载自blog.csdn.net/qq_28306361/article/details/85142192
今日推荐