时间紧迫!
昨天清点一下任务,发现剩下的一个月能完成的任务屈指可数。
今天和31两天争取把图像视频,跨平台,滤波和卷积看完!
关于codecs的注释
cv::imwrite()是为图像文件定制,非常依赖处理图像文件的库,这些库通常叫做codecs
Windows下:默认使用opencv自带的编解码库
OS X/Linux:默认使用拓展库(libjpeg,libpng等)若Cmake未发现再使用opencv自带库
图片的编码与解码
imread和imwrite是从磁盘读出图片和将图片写入磁盘的高级工具,由多个非必要部分整合而成。下面介绍这些子模块
使用cv::imencode()压缩图像
函数返回结果是字符缓冲区而不是之前的数组类型
使用cv::imdecode()解码文件
imencode将图像数据编码成字节流,imdecode则将字节流数据解码成数组形式的图像。和imread一样不需要文件拓展名作为输入参数,因为可以从输入的字节流数据前几个字节推断出应该使用那种编解码器
同样,给定字节流为空或无效时也会返回一个空数组
视频的处理
使用cv::VideoCapture对象读取视频流
读取视频/从摄像机获取
选择摄像机:设备序号+设备参数
使用cv::VideoCapture::read()从视频流中读取图像
不断返回下一帧图像,最终返回false
使用cv::VideoCapture::operator»()从视频流读取图像数据
重载输入流操作符,从VideoCapture对象中读取下一帧数据
使用cv::VideoCapture::grab()和cv::Video::retrieve()从视频流中读取图像数据
将上一过程拆分为一个捕获操作(类似内存拷贝)放入内存缓冲区
和恢复操作(用于实际完成对已抓取的数据进行解码)处理内部缓冲区
相机属性cv::VideoCapture::get()和cv:VideoCapture::set()
视频文件不仅包含一帧帧图像,还包含元数据(meta data)
对视频中位置,像素宽度高度,帧率,相机对比度等等属性进行设置
使用cv::VideoWriter对象写入视频
编码格式用FOURCC打包的四字符标识
使用cv::VideoWriter()函数完成图像帧的写入
图像必须和创建的VideoWriter具有相同的尺寸,彩色三通道,灰度单通道
使用cv::VideoWriter::operator«()将图像写入视频
对输出流操作符的重载
数据存储
作为对标准视频压缩方式的补充,opencv提供了一种序列化和反序列化的机制,用于将不同数据类型的数据以YAML或者XML格式写入磁盘或者从磁盘读取。
其可以用来加载或保存任何opencv的数值变量到一个文件中
cv::FileStorage的写入
cv::FileStorage对象代表着一个XML或者YAML格式的数据文件。
存储形式:
mapping(键/值对):两个一组,按顺序输入 用{}标记
sequence(一系列未命名条目):一个个输入即可,用[]标记
完成后使用release()关闭文件
cv::FileStorage读取文件
通过重载操作符获取最顶层数据,为一个FileNode对象
若该值为基本数据类型,则可以强制类型转换获取
若为一个mapping对象,则可以通过重载操作符[]给定所需关键字访问
若为sequence对象,则可以通过重载的[]和一个整形参数访问,也可以通过cv::FileNodeIterator迭代器访问
cv:FileNode
给定一个FileNode对象,FileNode::begin和FileNode::end返回首元素的迭代器和末尾元素的迭代器
该迭代器对象可以通过cv::FileNodeIterator::operator*()操作符来进行解引用操作并返回迭代器对应位置的FileNode对象