圖像讀取
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