思路:
(1)使用opencv讀取本地圖像
(2)調用cv_bridge::CvImage().toImageMsg()將本地圖像發送給rviz顯示
1.使用opencv讀取本地圖像並發布圖像消息
(1)利用catkin新建一個工程叫rosopencv,並進行初始化
mkdir -p rosopencv/src cd rosopencv/src catkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_transport cd .. catkin_make source ./devel/setup.bash
(2)編輯主函數代碼
在rosopencv包文件夾src目錄下創建rosopencv.cpp
主函數rosopencv.cpp內容如下
#include <ros/ros.h> #include <image_transport/image_transport.h> #include <opencv2/highgui/highgui.hpp> #include <cv_bridge/cv_bridge.h> #include <stdio.h> int main(int argc, char** argv) { ros::init(argc, argv, "image_publisher"); ros::NodeHandle nh; image_transport::ImageTransport it(nh); image_transport::Publisher pub = it.advertise("camera/image", 1); cv::Mat image = cv::imread("~/rosopencv/test.jpg", CV_LOAD_IMAGE_COLOR); if(image.empty()){ printf("open error\n"); } sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg(); ros::Rate loop_rate(5); while (nh.ok()) { pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } }
(3)編輯CmakeLists.txt
cmake_minimum_required(VERSION 3.0.2) project(rosopencv) find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp sensor_msgs std_msgs ) catkin_package( INCLUDE_DIRS include # LIBRARIES rosopencv CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs # DEPENDS system_lib ) include_directories( include ${catkin_INCLUDE_DIRS} ) add_executable(${PROJECT_NAME}_node src/rosopencv.cpp)
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} )
2編譯和運行
編譯
-
cd ~ /rosopencv
-
catkin_make
打開一個終端運行 roscore
另外一個終端工作空間運行
source devel/setup.bash
rosrun rosopencv rosopencv_node
3.在rviz 中顯示
rviz
左邊點擊add
選中image
在image的topic選項中選
/camera/image
即可顯示圖片