zoukankan      html  css  js  c++  java
  • ROS_Opencv-摄像头图像发布和订阅

    图像读取

    01.opencv读入数据
     摄像头    cv::  VideoCapture()
     视频      cv::  VideoCapture()
     读取视频时可以传入视频路径,而读取摄像头传入的是index索引号
     图像数据集cv::   cv2.imread()
    
    02.摄像头挂载点
           ls /dev/video*
      或者 ls /dev  | grep video
         是否存在有效usb摄像头设备  dmesg | grep video
    03.摄像头内核驱动与Linux内核
      就是通过总线与硬件设备进行通信,控制硬件进去各种工作状态,获取器件相关寄存器的值,从而得到设备的状态
         V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动
        linux上的camera都 是按照v4l2框架来设计,它的地址位于Linux kernel 
        V4L2的核心源码位于 drivers/media/v4l2-core  
        V4L2支持三类设备:视频输入输出设备、VBI设备和radio设备
       在 Linux中,硬件的驱动程序,都是由内核支持的
       Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理、IO设备管理等等功能
    03.摄像头硬件结构和工作原理
        摄像头引脚作用&硬件连接
        摄像头模组,全称CameraCompact Module,简写为CCM。
           CCM 包含四大件: 镜头(lens)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)
         sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,
                  实现各种设备控制方法供上层调用并注册 v4l2_subdev
        接口: 
          USB接口 UVC,全称 USB Video Class 、是 USB-IF 定制的一套标准
          MIPI接口 MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的
    

    从Camera到ROS

    通过用openCV来捕获视频流
    在 cv_bridge::CvImage类中执行toImageMsg 将OpenCV图像转换为ROS消息的 
    发布ros消息
     CvImage类中执行的OpenCV图像转换为ROS消息的成员函数为 toImageMsg
        cv::Mat frame;
        std_msgs::Header header;
        header.seq = cnt;
        header.stamp = ros::Time::now(); 
        sensor_msgs::Image img_msg ;
        cv_bridge::CvImage  img_bridge = cv_bridge::CvImage(header, sensor_msgs::image_encodings::BGR8, frame);
        img_bridge.toImageMsg(img_msg); 
    

    从ROS中到opencv图像

    cv_bridge中的
     Convert a sensor_msgs::Image message to an OpenCV-compatible CvImage, copying the image data.
        toCvCopy  返回值是 CvImagePtr
         toCvShare 返回值是 CvImageConstPtr
     //toCvCopy函数会从ROS消息中拷贝一个图像数据
     cv_bridge::CvImagePtr image_ptr = cv_bridge::toCvCopy(RGB_image, sensor_msgs::image_encodings::RGB8);
     cv::Mat RGB_image= image_ptr->image;  
    其中
     typedef boost::shared_ptr<CvImage> CvImagePtr;
     typedef boost::shared_ptr<CvImage const> CvImageConstPtr;
     ROS中cv_bridge源码中执行转换的类为 CvImage,该类包含了OpenCV的Mat格式的图像、该消息的encoding以及ROS header
      CvImage
        std_msgs::Header header; //!< ROS header
        std::string encoding;    //!< Image encoding ("mono8", "bgr8", etc.)
        cv::Mat image;
    

    发布和订阅

    生产和消费 // 0.包含头文件 #include "ros/ros.h"
        //1.初始化 ROS 节点  ros::init(argc,argv,"talker"); //参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
        //2.实例化 ROS 句柄   ros::NodeHandle nh;    //该类封装了 ROS 中的一些常用功能
    
         //3.实例化 发布者 对象
         ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
         std_msgs::String msg;  + 构造消息== 组织被发布的数据,并编写逻辑发布数据
         pub.publish(msg);
    
         
         //3.实例化 订阅者 对象
            ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
            void doMsg(const std_msgs::String::ConstPtr& msg_p){ } 定义回调函数-处理订阅的消息(回调函数)
           设置循环调用回调函数
    
       image_transport 被用在image订阅和发布上 image_transport 默认的传输,通过ROS传输sensor_msgs/Image
    其他通信类型
        nh.advertiseService  nh.serviceClient
    

    显示器

     opencv显示
       cv2.imshow()
     接口的物理标准和通讯协议
     计算机显示接口
      显示器的 VGA、DVI 、HDMI 和 DP 接口 USB Type-C接口-连接主机和显示器的外部显示接口
       HDMI High-Definition Multimedia Interface   基于 TMDS 技术
       DP(Display Port)接口是HDMI接口的竞争对手    基于 LVDS 技术
        DP口定义了两种接头,全尺寸(Full Size)和迷你DP(Mini),两种接头皆是20针
       VGA接口也称为D-Sub接口。在CRT显示器时代,VGA接口是必备的。因为CRT是模拟设备,而VGA采用的也是模拟协议
       USB 3.1的接口来说,有Type-A、Type-B以及Type-C 
         Type C接口的好处在于可以正反插拔,部分Type C接口也同样具有数据、电力、信号传输的功能
       电1和雷电2外形上采用的是Mini DP的外形,而雷电3采用的是USB Type-C的外形
       大多数人来说网线可能只是用来连接网络的。但是其实网线还可以用给设备供电,如果采用HDBaseT协议甚至还能传送高清影音
     家庭影音设备
          模拟信号:复合信号Composite Video
          模拟信号:分量信号Component Video
          数字信号 DVI Digital Visual Interface:
    

    参考:

     cv_bridge用于ROS图像和OpenCV图像的转换 https://blog.csdn.net/bigdog_1027/article/details/79090571
  • 相关阅读:
    静态代理和动态代理
    Tomcat的作用思考及NIO的应用(要区分Java NIO和操作系统的NIO模型)
    破坏双亲委托机制的一些情况---Tomcat和JDBC,破坏后的安全问题
    springboot cache---本地缓存的使用
    springboot--异步执行的方法及定时执行的方法
    springboot--事务的使用
    数据结构--堆排序
    数据结构--树的非递归遍历
    最长公共子串的长度和构造
    2015 小结及其2016计划
  • 原文地址:https://www.cnblogs.com/ytwang/p/15344095.html
Copyright © 2011-2022 走看看