|
1 | 1 | 1.OpenCV简介 |
2 | 2 | === |
3 | 3 |
|
4 | | - |
| 4 | +[OpenCV官网](https://opencv.org/) |
| 5 | + |
5 | 6 |
|
6 | 7 | ### OpenCV4简介 |
7 | 8 |
|
8 | | -OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在linux、windows、android和Mac OS操作系统上。 |
| 9 | +OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 |
| 10 | + |
| 11 | +OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。 |
| 12 | + |
| 13 | + |
| 14 | +### OpenCV4的模块架构 |
| 15 | + |
| 16 | +- calib3d(由calibration(标准)和3D 两个术语缩写组合而成):主要包含相机定位与 |
| 17 | +立体视觉等功能,例如物体位姿估计、三维重建、摄像头标定等; |
| 18 | +- core(核心功能模块):主要包含OpenCV 库的基础结构以及基本操作,例如OpenCV |
| 19 | +基本数据结构、绘图函数、数组操作相关函数、动态数据结构等; |
| 20 | +- dnn(深度学习模块):主要包括构建神经网络、加载序列化网络模型等,但目前仅适 |
| 21 | +用于正向传递计算; |
| 22 | +- features2d(由feature(特征)和2D 两个术语缩写组合而成):主要功能包括处理图 |
| 23 | +像特征点,例如特征检测、描述与匹配等; |
| 24 | +- flann(快速近似最近邻库):是高维的近似近邻快速搜索算法库,主要包含快速近似 |
| 25 | +近邻搜索与聚类等; |
| 26 | +- gapi:加速常规的图像处理,与其他模块相比,此模块主要充当框架,而不是某些特定 |
| 27 | +的计算机视觉算法; |
| 28 | +- highgui(高层GUI):包含创建和操作显示图像的窗口、处理鼠标事件以及键盘命令、 |
| 29 | +提供图形交互可视化界面等; |
| 30 | +- imgcodecs(图像文件读取与保存模块):主要用于图像文件读取与保存; |
| 31 | +- imgproc(重要的图像处理模块):主要包含图像滤波、几何变换、直方图、特征检测 |
| 32 | +与目标检测等; |
| 33 | +- ml(机器学习模块):主要为统计分类、回归和数据聚类等; |
| 34 | +- objdetect(目标检测模块):主要用于图像目标检测,例如检测Haar 特征; |
| 35 | +- photo(计算摄影模块):主要包含图像修复和去噪等; |
| 36 | +- stitching(图像拼接模块):主要包含特征点寻找与匹配图像、估计旋转、自动校准、 |
| 37 | +接缝估计等图像拼接过程的相关内容; |
| 38 | +- video(视频分析模块):主要包含运动估计、背景分离、对象跟踪等视频处理相关内 |
| 39 | +容; |
| 40 | +- videoio(视频输入/输出模块):主要用于读取/写入视频或者图像序列。 |
| 41 | + |
| 42 | + |
| 43 | +### 数据结构:Mat |
| 44 | + |
| 45 | +API: |
| 46 | +- imread(..url...):加载本地图像 |
| 47 | + 默认的BGR 彩色图像加载方式,此外支持灰度图像和任意格式。注意:在OpenCV中颜色值写法是BGR,而不是RGB。 |
| 48 | +- imshow("namexx", ...url...):显示图像 |
| 49 | +- getStructuringElement(...):获取腐蚀的内核矩阵 |
| 50 | +- erode(...):腐蚀(源图像、目的图像、内核矩阵) |
| 51 | +- blur(...) :模糊 |
| 52 | +- cvtColor(...):颜色转换 |
| 53 | +- Canny(...):提取边缘 |
| 54 | +- waitKey(...):等待按键 |
| 55 | +- imwrite(...): 图片保存,支持各种格式 |
| 56 | + |
| 57 | +```c++ |
| 58 | +// 图像模糊(blur) |
| 59 | +#include <iostream> |
| 60 | +#include <opencv2/opencv.hpp> |
| 61 | +#include <opencv2/highgui.hpp> |
| 62 | +#include <opencv2/imgproc/imgproc.hpp> |
| 63 | +using namespace std; |
| 64 | +using namespace cv; |
| 65 | +int main_p002(int argc, const char * argv[]) { |
| 66 | + // insert code here... |
| 67 | + Mat imgSource = imread("../../images/p1_tutu.jpg");//读取图片 |
| 68 | + imshow("source", imgSource);//显示图片在名为"source"的窗口里 |
| 69 | + Mat imgDst;//用来存放模糊之后的图片 |
| 70 | + blur(imgSource, imgDst, Size(20, 20));//进行均值滤波,在20*20 的像素内取平均值然 |
| 71 | + 后低于的或者高于的被替换掉 |
| 72 | + imshow("target", imgDst);//显示图片在名为"target"的窗口里 |
| 73 | + waitKey(0);//等待按键操作再执行后续按随意键将进行下一步return 程序结束 |
| 74 | + return 0; |
| 75 | +} |
| 76 | +``` |
| 77 | +
|
| 78 | +
|
| 79 | +#### 重要概念: 图像就是函数 |
| 80 | +
|
| 81 | +把一张图片放到坐标系中后,我们就能把一副图像看作是一个二维函数,定义成 |
| 82 | +f(x, y)。 |
| 83 | + |
| 84 | +
|
| 85 | +
|
| 86 | +任何一对空间坐标(x, y)处f的值看作该坐标点处的强度(intensity)或灰度。 |
| 87 | +
|
| 88 | +我们把每一坐标点处的强度在三维空间中看看。 |
| 89 | +
|
| 90 | + |
| 91 | +
|
| 92 | +
|
| 93 | +把图像看作是一个二维函数,将对后续的图像处理理解和计算带来极大的便利,对图像 |
| 94 | +的处理就是对函数的处理。需要强调的是把图像作为二维函数时,它是一个离散函数,且取 |
| 95 | +值范围有所限定,比如x, y 轴的坐标值,函数取值也限定在某个区间之内(不一定是[0-225])。 |
| 96 | +另外,图像作为函数,不可能得到上面类似f(x, y)=x**2+y**2 这样的表达式。 |
| 97 | +对于彩色图像,同样可以看作是一个向量函数。f(x, y) = [r(x, y), g(x, y), b(x, y)] |
| 98 | +
|
| 99 | +
|
| 100 | +## Mat对象 |
| 101 | +
|
| 102 | +Mat 对象:OpenCV2.0 之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问 |
| 103 | +题,是面向对象的数据结构,分了两个部分,头部分与数据部分。 |
| 104 | +
|
| 105 | +文档上边说,Mat 的数据成员由头部和数据组成。 |
| 106 | +
|
| 107 | +Mat 类的声明中的数据成员部分: |
| 108 | +- Mat 的头部信息:flags,dims,rows,cols,data 指针,refcount 指针。 |
| 109 | +- Mat 的数据部分:显然,意味着data 指针指向的空间。 |
| 110 | +
|
| 111 | +而refcount 指针,就是起引用计数的作用。有了引用计数机制,使得我们的Mat 能够很好 |
| 112 | +地支持浅拷贝的操作:使用等号操作符给Mat 赋值(或者使用拷贝构造的时候),仅拷贝 |
| 113 | +头部信息,如此能够节约许多的空间和时间。而深拷贝的工作,就交给成员方法clone()和 |
| 114 | +copyTo()。 |
| 115 | +
|
| 116 | +
|
| 117 | +### Mat对象的发展史 |
| 118 | +
|
| 119 | +在早期的OpenCV1.x 版本中,图像的处理是通过IplImage(该名称源于Intel 的另一个 |
| 120 | +开源库Intel Image Processing Library ,缩写成IplImage)结构来实现的。 |
| 121 | +
|
| 122 | +早期的OpenCV 是用C 语言编写,因此提供的借口也是C 语言接口,其源代码完全是C |
| 123 | +的编程风格。IplImage 结构是OpenCV 矩阵运算的基本数据结构。 |
| 124 | +
|
| 125 | +到OpenCV2.x 版本,OpenCV 开源库引入了面向对象编程思想,大量源代码用C++重写。 |
| 126 | +
|
| 127 | +Mat 类(Matrix 的缩写) 是OpenCV 用于处理图像而引入的一个封装类。 |
| 128 | +从功能上讲,Mat 类在IplImage 结构的基础上进一步增强,并且,由于引入C++高级编 |
| 129 | +程特性,Mat 类的扩展性大大提高,Mat 类的内容在后期的版本中不断丰富。 |
| 130 | +该对象会自动分配内存、自动管理内存分配和释放,不存在内存泄漏的问题,OpenCV2.x |
| 131 | +版本以后,越来越多的函数实现了MatLab 所具有的功能,甚至干脆连函数名都一模一样(如 |
| 132 | +imread, imshow,imwriter 等), 这些属性和方法如果你学过Matlab 掌握起来一定会很快。 |
| 133 | +
|
| 134 | +
|
| 135 | +#### Mat知识点 |
| 136 | +
|
| 137 | +Mat 对象构造函数与常用方法 |
| 138 | +##### 构造函数: |
| 139 | +- Mat(); // 默认构造函数 |
| 140 | +- Mat(int rows, int cols, int type); //指定行数、列数、类型的构造函数 |
| 141 | +- Mat(Size size, int type); // 指定矩阵大小、类型的构造函数 |
| 142 | +- Mat(int rows, int cols, int type, const Scalar& s); // 指定矩阵行列、类型、颜色的构造函数 |
| 143 | +- Mat(Size size, int type, const Scalar& s);// 指定矩阵大小、类型、颜色的构造函数 |
| 144 | +- Mat(int ndims, const int* sizes, int type); |
| 145 | +- Mat(int ndims, const int* sizes, int type, const Scalar& s); |
| 146 | +- Mat(const Mat& m); |
| 147 | +- Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP); |
| 148 | +- Mat(Size size, int type, void* data, size_t step=AUTO_STEP); |
| 149 | +- Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0); |
| 150 | +
|
| 151 | +```c++ |
| 152 | +// start your code... |
| 153 | +Mat m1; // m1 为用默认拷贝构造创建的对象 |
| 154 | +Mat m2(500, 500, CV_8UC3);//指定行数、列数、类型的构造函数CV_8UC3:8 位无符号3 通 |
| 155 | +道图像 |
| 156 | +m2 = Scalar(10, 20, 30); |
| 157 | +Mat m3(Size(300, 300), CV_8UC3); // 指定矩阵大小、类型的构造函数 |
| 158 | +m3 = Scalar(50, 10, 215); |
| 159 | +Mat m4 = Mat(400, 400, CV_8UC3, Scalar(255, 0, 255)); // 指定矩阵行列、类型、颜色 |
| 160 | +的构造函数Scalar(255,0,0):颜色列表依次为b g r |
| 161 | +Mat m5 = Mat(src.size(), src.type()); // 创建一个和原图大小类型相同的图像 |
| 162 | +``` |
| 163 | + |
| 164 | +##### 常用方法: |
| 165 | +- void copyTo(Mat mat) |
| 166 | +- void convertTo(Mat dst,int type) |
| 167 | +- Mat clone() |
| 168 | +- int channels() |
| 169 | +- int depth() |
| 170 | +- bool empty() |
| 171 | +- uchar * ptr(i = 0) |
| 172 | + |
| 173 | + |
| 174 | +##### Mat 对象四个要点 |
| 175 | +1. 输出图像内存是自动分配的 |
| 176 | +2. 使用OpenCV 的C++接口,不需要考虑内存分配问题 |
| 177 | +3. 复制操作和拷贝构造函数只会复制头部分 |
| 178 | +4. 使用clone 和copyTo 两个函数实现数据完全复制 |
| 179 | + |
| 180 | + |
| 181 | + |
| 182 | + |
| 183 | + |
| 184 | + |
9 | 185 |
|
10 | | -它轻量级而且高效--由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 |
11 | 186 |
|
12 | 187 |
|
13 | 188 |
|
|
0 commit comments