ROS中使用opencv
在ROS中使用opencv的小例程
记录在ROS中学习使用opencv的过程
安装opencv
我们首先需要在ubuntu下安装ubuntu版本的opencv,
- 下载opencv的Linux版本,最好将contrib库也下载下来(同样是Linux版本),注意两者的兼容性,并安装好一些依赖库
- 参照网上教程安装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:程序参考