#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> 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐