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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM