#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <ros/ros.h>
#include <sensor_msgs/image_encodings.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "pub_cam_node");
ros::NodeHandle nh;
cv::VideoCapture capture(0); //0为读取摄像头,“video.format"为读取本地视频
if (!capture.isOpened()) {
ROS_ERROR_STREAM("Failed to open video device\n");
ros::shutdown();
}
//image_transport负责订阅和发布
image_transport::ImageTransport it(nh);
image_transport::Publisher pub_image = it.advertise("camera", 1);
cv::Mat image;//Mat为OpenCV里定义的图像类
while (ros::ok()) {
capture >> image; //载入
if (image.empty()) {
ROS_ERROR_STREAM("Failed to capture image!");
ros::shutdown();
}
//将图像从cv::Mat类型转化成sensor_msgs/Image类型并发布
pub_image.publish(cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg());//将图像从sensor_msgs/Image类型转化成cv::Mat类型
cv::imshow("camera", image);
cv::waitKey(3); // opencv刷新图像 3ms
ros::spin();
}
}
仅仅就这样是会报错的,你还需要更改cmake
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
cv_bridge
image_transport
std_msgs
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
find_package(OpenCV 3 REQUIRED)
find_package(OpenCV REQUIRED)
find_package(PkgConfig REQUIRED)
include_directories(
include
${catkin_INCLUDE_DIRS}
${hiredis_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(251up src/251up.cpp src/ConfigFile.c)
target_link_libraries(
251up
${catkin_LIBRARIES}
${hiredis_LIBRARIES}
${OpenCV_LIBRARIES}
)
还需要更改package.xml
<build_depend>image_transport</build_depend>
<run_depend>image_transport</run_depend>