Skip to content

Commit ee2b066

Browse files
committed
add OpenCV
1 parent 6294153 commit ee2b066

1 file changed

Lines changed: 178 additions & 3 deletions

File tree

VideoDevelopment/OpenCV/1.OpenCV简介.md

Lines changed: 178 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,188 @@
11
1.OpenCV简介
22
===
33

4-
![image](https://github.com/CharonChui/Pictures/blob/master/cdn.png?raw=true)
4+
[OpenCV官网](https://opencv.org/)
5+
56

67
### OpenCV4简介
78

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+
![image](https://github.com/CharonChui/Pictures/blob/master/opencv_image_two.png?raw=true)
84+
85+
86+
任何一对空间坐标(x, y)处f的值看作该坐标点处的强度(intensity)或灰度。
87+
88+
我们把每一坐标点处的强度在三维空间中看看。
89+
90+
![image](https://github.com/CharonChui/Pictures/blob/master/opencv_image_san.png?raw=true)
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+
9185

10-
它轻量级而且高效--由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
11186

12187

13188

0 commit comments

Comments
 (0)