按照ros创建功能包步骤进行:ROS学习笔记(一):创建工作空间和功能包
mkdir -p ~/catkin_ws/src#创建工作空间
cd ~/catkin_ws/#初始化
catkin_make
gedit ~/.bashrc
source ~/catkin_ws/devel/setup.bash#add
source ~/.bashrc
catkin_create_pkg videoTotopic roscpp image_transport opencv2 cv_bridge#创建功能包
#更改文件内容
catkin_make
roscore
rosrun videototopic videototopic /home/kobosp/SLAM_YOLO/a.mp4
文件结构如下
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <sstream>
#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
ros::init(argc,argv,"videototopic");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);//发布图片需要用到image_transport
image_transport::Publisher pub = it.advertise("/usb_cam/image_raw", 1);
if(argc)
cout<<argv[1]<<endl;
ros::Rate loop_rate(30);
//string path = "/home/liwb/Documents/output/";
//path = path + argv[1];//用户自己添加视频文件名字
string path = argv[1];
VideoCapture cap(path);//open video from the path
if(!cap.isOpened()){
std::cout<<"open video failed!"<<std::endl;
return -1;
}
else
std::cout<<"open video success!"<<std::endl;
Mat frame;//this is an image
bool isSuccess = true;
while(nh.ok()){
isSuccess = cap.read(frame);
if(!isSuccess){//if the video ends, then break
std::cout<<"video ends"<<std::endl;
break;
}
//将opencv的图片转换成ros的sensor_msgs,然后才能发布。
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
cmake_minimum_required(VERSION 3.0.2)
project(videototopic)
SET(OpenCV_DIR /usr/local/share/OpenCV)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
OpenCV
)
catkin_package(
)
include_directories(
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(videototopic src/videototopic.cpp)
target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
${OpenCV_LIBS}
)