图像读取
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