Skip to content

Latest commit

 

History

History
201 lines (148 loc) · 9.26 KB

1.OpenCV简介.md

File metadata and controls

201 lines (148 loc) · 9.26 KB

1.OpenCV简介

OpenCV官网

OpenCV4简介

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

OpenCV4的模块架构

  • calib3d(由calibration(标准)和3D 两个术语缩写组合而成):主要包含相机定位与 立体视觉等功能,例如物体位姿估计、三维重建、摄像头标定等;
  • core(核心功能模块):主要包含OpenCV 库的基础结构以及基本操作,例如OpenCV 基本数据结构、绘图函数、数组操作相关函数、动态数据结构等;
  • dnn(深度学习模块):主要包括构建神经网络、加载序列化网络模型等,但目前仅适 用于正向传递计算;
  • features2d(由feature(特征)和2D 两个术语缩写组合而成):主要功能包括处理图 像特征点,例如特征检测、描述与匹配等;
  • flann(快速近似最近邻库):是高维的近似近邻快速搜索算法库,主要包含快速近似 近邻搜索与聚类等;
  • gapi:加速常规的图像处理,与其他模块相比,此模块主要充当框架,而不是某些特定 的计算机视觉算法;
  • highgui(高层GUI):包含创建和操作显示图像的窗口、处理鼠标事件以及键盘命令、 提供图形交互可视化界面等;
  • imgcodecs(图像文件读取与保存模块):主要用于图像文件读取与保存;
  • imgproc(重要的图像处理模块):主要包含图像滤波、几何变换、直方图、特征检测 与目标检测等;
  • ml(机器学习模块):主要为统计分类、回归和数据聚类等;
  • objdetect(目标检测模块):主要用于图像目标检测,例如检测Haar 特征;
  • photo(计算摄影模块):主要包含图像修复和去噪等;
  • stitching(图像拼接模块):主要包含特征点寻找与匹配图像、估计旋转、自动校准、 接缝估计等图像拼接过程的相关内容;
  • video(视频分析模块):主要包含运动估计、背景分离、对象跟踪等视频处理相关内 容;
  • videoio(视频输入/输出模块):主要用于读取/写入视频或者图像序列。

数据结构:Mat

Mat是一个基本图像容器,也是一个类,数据由两个部分组成:

  • 矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)
  • 一个指向存储所有像素值的矩阵的指针

API:

  • imread(..url...):加载本地图像 默认的BGR 彩色图像加载方式,此外支持灰度图像和任意格式。注意:在OpenCV中颜色值写法是BGR,而不是RGB。 imread() 函数默认加载图像文件,加载进来的是3 通道彩色图像,色彩空间是RGB 色彩空间。 通道顺序是:BGR (蓝色、绿色、红色)。 通道分离函数:split() 通道合并函数:merge()
  • imshow("namexx", ...url...):显示图像
  • getStructuringElement(...):获取腐蚀的内核矩阵
  • erode(...):腐蚀(源图像、目的图像、内核矩阵)
  • blur(...) :模糊
  • cvtColor(...):颜色转换
  • Canny(...):提取边缘
  • waitKey(int delay = 0):等待按键
  • imwrite(...): 图片保存,支持各种格式
// 图像模糊(blur)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main_p002(int argc, const char * argv[]) {
	// insert code here...
	Mat imgSource = imread("../../images/p1_tutu.jpg");//读取图片
	imshow("source", imgSource);//显示图片在名为"source"的窗口里
	Mat imgDst;//用来存放模糊之后的图片
	blur(imgSource, imgDst, Size(20, 20));//进行均值滤波,在20*20 的像素内取平均值然
	后低于的或者高于的被替换掉
	imshow("target", imgDst);//显示图片在名为"target"的窗口里
	waitKey(0);//等待按键操作再执行后续按随意键将进行下一步return 程序结束
	return 0;
}

重要概念: 图像就是函数

把一张图片放到坐标系中后,我们就能把一副图像看作是一个二维函数,定义成 f(x, y)。 image

任何一对空间坐标(x, y)处f的值看作该坐标点处的强度(intensity)或灰度。

我们把每一坐标点处的强度在三维空间中看看。

image

把图像看作是一个二维函数,将对后续的图像处理理解和计算带来极大的便利,对图像 的处理就是对函数的处理。需要强调的是把图像作为二维函数时,它是一个离散函数,且取 值范围有所限定,比如x, y 轴的坐标值,函数取值也限定在某个区间之内(不一定是[0-225])。 另外,图像作为函数,不可能得到上面类似f(x, y)=x2+y2 这样的表达式。 对于彩色图像,同样可以看作是一个向量函数。f(x, y) = [r(x, y), g(x, y), b(x, y)]

Mat对象

Mat 对象:OpenCV2.0 之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问 题,是面向对象的数据结构,分了两个部分,头部分与数据部分。

文档上边说,Mat 的数据成员由头部和数据组成。

Mat 类的声明中的数据成员部分:

  • Mat 的头部信息:flags,dims,rows,cols,data 指针,refcount 指针。
  • Mat 的数据部分:显然,意味着data 指针指向的空间。

而refcount 指针,就是起引用计数的作用。有了引用计数机制,使得我们的Mat 能够很好 地支持浅拷贝的操作:使用等号操作符给Mat 赋值(或者使用拷贝构造的时候),仅拷贝 头部信息,如此能够节约许多的空间和时间。而深拷贝的工作,就交给成员方法clone()和 copyTo()。

Mat对象的发展史

在早期的OpenCV1.x 版本中,图像的处理是通过IplImage(该名称源于Intel 的另一个 开源库Intel Image Processing Library ,缩写成IplImage)结构来实现的。

早期的OpenCV 是用C 语言编写,因此提供的借口也是C 语言接口,其源代码完全是C 的编程风格。IplImage 结构是OpenCV 矩阵运算的基本数据结构。

到OpenCV2.x 版本,OpenCV 开源库引入了面向对象编程思想,大量源代码用C++重写。

Mat 类(Matrix 的缩写) 是OpenCV 用于处理图像而引入的一个封装类。 从功能上讲,Mat 类在IplImage 结构的基础上进一步增强,并且,由于引入C++高级编 程特性,Mat 类的扩展性大大提高,Mat 类的内容在后期的版本中不断丰富。
该对象会自动分配内存、自动管理内存分配和释放,不存在内存泄漏的问题,OpenCV2.x 版本以后,越来越多的函数实现了MatLab 所具有的功能,甚至干脆连函数名都一模一样(如 imread, imshow,imwriter 等), 这些属性和方法如果你学过Matlab 掌握起来一定会很快。

Mat知识点

Mat 对象构造函数与常用方法

构造函数:
  • Mat(); // 默认构造函数
  • Mat(int rows, int cols, int type); //指定行数、列数、类型的构造函数
  • Mat(Size size, int type); // 指定矩阵大小、类型的构造函数
  • Mat(int rows, int cols, int type, const Scalar& s); // 指定矩阵行列、类型、颜色的构造函数
  • Mat(Size size, int type, const Scalar& s);// 指定矩阵大小、类型、颜色的构造函数
  • Mat(int ndims, const int* sizes, int type);
  • Mat(int ndims, const int* sizes, int type, const Scalar& s);
  • Mat(const Mat& m);
  • Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
  • Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
  • Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
// start your code...
Mat m1; // m1 为用默认拷贝构造创建的对象
Mat m2(500, 500, CV_8UC3);//指定行数、列数、类型的构造函数CV_8UC3:8 位无符号3 通
道图像
m2 = Scalar(10, 20, 30);
Mat m3(Size(300, 300), CV_8UC3); // 指定矩阵大小、类型的构造函数
m3 = Scalar(50, 10, 215);
Mat m4 = Mat(400, 400, CV_8UC3, Scalar(255, 0, 255)); // 指定矩阵行列、类型、颜色
的构造函数Scalar(255,0,0):颜色列表依次为b g r
Mat m5 = Mat(src.size(), src.type()); // 创建一个和原图大小类型相同的图像
常用方法:
  • void copyTo(Mat mat)
  • void convertTo(Mat dst,int type)
  • Mat clone()
  • int channels()
  • int depth()
  • bool empty()
  • uchar * ptr(i = 0)
Mat 对象四个要点
  1. 输出图像内存是自动分配的
  2. 使用OpenCV 的C++接口,不需要考虑内存分配问题
  3. 复制操作和拷贝构造函数只会复制头部分
  4. 使用clone 和copyTo 两个函数实现数据完全复制