一、OpenCV是什么
OpenCV 是一个开源的计算机视觉库,主要由C/C++语言编写,可以在 Windows、Linux、Mac OS X 等系统运行。
二、用处
- 安保行业;
- 网页端的图像和视频处理;
- 卫星和网络地图上拼接图像,图像扫描校准,医学图像的降噪,目标分析;
- 自动驾驶和安全系统,制造感知系统,相机校正,军事应用,无人空中、地面、水下航行器和用于声音的频谱图像等。
三、组成结构
- 最底层是基于硬件加速层(HAL)的各种硬件优化。
- 再上一层是 opencv_contrib 模块所包含的 OpenCV 由其他开发人员所贡献的代码,其包含大多数高层级的函数功能。这就是OpenCV的核心。
- 接下来是语言绑定和示例应用程序。
- 处于最上层的是 OpenCV 和操作系统的交互。
四、OpenCV基本api概念
1、 Mat 类是存储和操作 OpenCV 中图像的主要数据结构。这个类是在 core 模块中定义的。OpenCV 已经实现了对于这些数据结构自动分配和释放内存的机制。赋值运算符并没有从一个对象(Mat A)到另一个对象(Mat B)复制内存内容;而只是对其引用(相应内容的存储地址)的复制。之后,一个对象(A 或 B)的改变对两个对象都有影响。为了复制一个 Mat 对象的内存内容,应该使用成员函数 Mat::clone()。
Mat 类用于密集的 n 维单通道或多通道数组。实际上它可以存储实数或复数值向量和矩阵、彩色图像或灰度图像、直方图、点云等。
2、DataType 类定义 OpenCV 的基本数据类型。基本数据类型可以是 bool、unsigned char、signed char、unsigned short、signed short、int、float、double 或者是以这些基本类型之一的值构成的一个元组(或称数组)。任何基本类型都可以用一个标识符以下面的形式定义:
CV_<bit depth>{U|S|F}C(<number of channels>)
3、使用 OpenCV 函数正确地保存一幅 RGB 图像是很重要的,该图像必须按照 BGR 通道顺序在内存中存储。按照同样的方式,当从一个文件中读取一幅 RGB 图像时,应按照 BGR 通道顺序将其存储在内存中。而且,需要补充第四个通道(alpha)来处理具有三个通道(RGB)的图像,加上了一个透明度。对于 RGB 图像,整数值越大,意味着像素更亮或 alpha 通道更透明。
4、OpenCV读取图像文件
使用函数 imread(argv[1],IMREAD_UNCHANGED)将图像文件读入到 Mat 对象 in_image 中。这里,第一个参数是在命令行中传递的第一个实参(argv[1]),第二个参数是一个标志(IMREAD_UNCHANGED),这就意味着存储到内存图像中的图像不会被改变。函数 imread 决定图像类型(编解码器)来自文件内容而不是来自文件扩展名。
5、OpenCV写入图像文件
bool imwrite(const String& filename,InputArray img,const vector<int>& params=vector<int>())
该函数将一幅图像(img)保存到一个文件(filename),作为第三个可选参数,一个“属性-值”对的向量指定编解码器的参数(为使用默认值将其设置为空)。编解码器由文件的扩展名决定。
6、读视频
在 OpenCV 中,VideoCapture 类和 VideoWriter 类为视频处理中所涉及的捕获和记录任务提供了一个易用的 C++API。
VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像。 可以使用该类的构造函数打开视频文件或者摄像头。如果 VideoCapture 对象已经创建,也可以使用 VideoCapture::open()打开, VideoCapture::open()函数会自动调用
VideoCapture::release()函数,先释放已经打开的视频,然后再打开新视频。
7、写视频
使用 OpenCV 创建视频也非常简单,与读视频不同的是,你需要在创建视频时设置一系列参数,包括:文件名,编解码器,帧率,宽度和高度等。
将图像写入视频可以使用 VideoWriter::write()函数, VideoWriter 类中也重载了<<操作符,使用起来非常方便。另外需要注意:待写入的图像尺寸必须与创建视频时指定的尺寸一致。