在ROS中用openCV显示摄像头并发布图像数据

在ROS中用openCV显示摄像头并发布图像数据

  • 前言
  • 使用C++实现
    • CMakeLists.txt配置
  • 使用python实现
  • ROS使用openCV进行图片接收,并显示
  • 客官!如果觉得有用,给俺点赞支持下呗!

前言

自己也是刚开始学习ros和openCV,经常会踩很多坑,比如这次在ros中使用openCV,按照很多博客写的,最后要么死机,要么黑框。对此,经过请教学长,终于调通,分享给大家以供参考。

使用C++实现

#include 
#include 
#include   // 将ROS下的sensor_msgs/Image消息类型转化为cv::Mat数据类型
#include  // ROS下对图像进行处理
#include  // 用来发布和订阅图像信息

#include 
#include 
#include 
#include 

int main(int argc, char** argv)
{
    ros::init(argc, argv, "imageGet_node");  // ros初始化,定义节点名为imageGet_node
    ros::NodeHandle nh;                      // 定义ros句柄
    image_transport::ImageTransport it(nh);  //  类似ROS句柄
    image_transport::Publisher image_pub = it.advertise("/cameraImage", 1);   // 发布话题名/cameraImage

    ros::Rate loop_rate(200);   // 设置刷新频率,Hz

    cv::Mat imageRaw;  // 原始图像保存
    cv::VideoCapture capture(0);   // 创建摄像头捕获,并打开摄像头0(一般是0,2....)

    if(capture.isOpened() == 0)      // 如果摄像头没有打开
    {
        std::cout << "Read camera failed!" << std::endl;
        return -1;
    }

    while(nh.ok())
    {
        capture.read(imageRaw);          // 读取当前图像到imageRaw
        cv::imshow("veiwer", imageRaw);  // 将图像输出到窗口
        sensor_msgs::ImagePtr  msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imageRaw).toImageMsg();  // 图像格式转换
        image_pub.publish(msg);         // 发布图像信息
        ros::spinOnce();                // 没什么卵用,格式像样
        loop_rate.sleep();              // 照应上面设置的频率
        if(cv::waitKey(2) >= 0)         // 延时ms,按下任何键退出(必须要有waitKey,不然是看不到图像的)
            break;        
    }
}

一定要注意,waitKey()必须要有,且不为0,其他大多博客这点都没有,导致出错

CMakeLists.txt配置

添加(最后两个的image_Get是生成可执行文件的名字,根据自己来设定):

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(image_Get src/image_Get.cpp)
target_link_libraries(image_Get ${catkin_LIBRARIES} ${OpenCV_LIBS})

使用python实现

未完待续

ROS使用openCV进行图片接收,并显示

参考本人博客:订阅部分

客官!如果觉得有用,给俺点赞支持下呗!

欢迎留言讨论,指出不足和建议!

你可能感兴趣的:(ubuntu_ros)