操作步驟
1:利用catkin新建一個workspace叫ros_opencv,並進行初始化
1 $ mkdir -p ros_opencv/src 2 $ cd ros_opencv/src 3 $ catkin_init_workspace
2:進入src目錄,新建一個package叫opencv_test
1 $ catkin_create_pkg opencv_test sensor_msgs opencv2 cv_bridge roscpp std_msgs image_transport
3:修改opencv_test目錄下CMakeLists.txt文件,代碼如下
1 cmake_minimum_required(VERSION 2.8.3) 2 project(opencv_test) 3 4 ## Find catkin macros and libraries 5 6 find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp sensor_msgs std_msgs) 7 find_package(OpenCV REQUIRED) 8 9 ## Declare a catkin package 10 catkin_package() 11 12 ## Include directories, 13 ## Add target and link libraries 14 15 include_directories(include ${OpenCV_INCLUDE_DIRS}) 16 include_directories(include ${catkin_INCLUDE_DIRS}) 17 18 add_executable(opencv_test_node src/opencv_test_node.cpp) 19 target_link_libraries(opencv_test_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}) 20 add_dependencies(opencv_test_node opencv_test_gencpp)
4:在src下添加源代碼
1 #include <ros/ros.h> 2 #include <stdio.h> 3 #include <image_transport/image_transport.h> 4 #include <cv_bridge/cv_bridge.h> 5 #include <sensor_msgs/image_encodings.h> 6 #include <opencv2/imgproc/imgproc.hpp> 7 #include <opencv2/highgui/highgui.hpp> 8 9 static const char WINDOW[] = "Image window"; 10 static void help() 11 { 12 printf("\nThis program demonstrates converting OpenCV Image to ROS Image messages \n" 13 ); 14 15 } 16 17 int main(int argc, char** argv) 18 { 19 help(); 20 ros::init(argc, argv, "image_converter"); 21 22 //Reading an image from the file 23 cv::Mat cv_image = cv::imread(image directory); 24 if(cv_image.empty() ) 25 { 26 ROS_ERROR("Read the picture failed!"); 27 return -1; 28 } 29 30 //Convert OpenCV image to ROS message 31 ros::NodeHandle node; 32 image_transport::ImageTransport transport(node); 33 image_transport::Publisher image_pub; 34 image_pub=transport.advertise("OutImage", 1); 35 ros::Time time=ros::Time::now(); 36 37 cv_bridge::CvImage cvi; 38 cvi.header.stamp = time; 39 cvi.header.frame_id = "image"; 40 cvi.encoding = "bgr8"; 41 cvi.image = cv_image; 42 43 sensor_msgs::Image im; 44 cvi.toImageMsg(im); 45 image_pub.publish(im); 46 ROS_INFO("Converted Successfully!"); 47 48 //Show the image 49 cv::namedWindow(WINDOW); 50 cv::imshow(WINDOW,cv_image); 51 cv::waitKey(0); 52 53 ros::spin(); 54 return 0; 55 }
5:在ros_opencv目錄下進行 catkin_make
1 $ catkin_make
6:運行
1 $ roscore 2 #open a new terminal 3 $ source devel/setup.bash
4 $ rosrun opencv_test opencv_test_node
注意的地方
- 因為最新推出的ros版本中默認使用的是catkin(一種類似與cmake的工程構建工具,不過仍然兼容原來的構建方式rosbuild),因此在參考相關的學習資料時要特別注意兩者的區別,比如說像指令和CMakeLists.txt中的代碼等;
- 運行時,在輸入rosrun之前,要先 source devel/setup.bash,不然會出現無法找到package之類的錯誤;
參考資料
- 《Converting between ROS images and OpenCV images (C++)》
- 《ROS tutorial》
- 《How to make ROS and Opencv work together》
Steven Meng
2013.5.12