Skip to content

Commit 71a5b5d

Browse files
author
extronwang
committed
教程置于各目录的README,不用跳转至博客 2019年9月26日
1 parent 0b82857 commit 71a5b5d

File tree

35 files changed

+4524
-114
lines changed

35 files changed

+4524
-114
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/挑战任务3:车道检测/test_pictures/
22
/挑战任务3:车道检测/test_videos/
3-
/new_todo/
3+
/new_todo/
4+
.DS_Store

01. 简介与安装/README.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# [OpenCV-Python教程01:简介与安装](http://ex2tron.wang/opencv-python-introduction-and-installation/)
2+
3+
![](http://pic.ex2tron.top/cv2_install_opencv-python.jpg)
4+
5+
相信大部分人知道的OpenCV都是用C++来开发的,那为什么我推荐使用Python呢?<!-- more -->
6+
7+
> 本教程翻译自[OpenCV官方英文教程](http://opencv-python-tutroals.readthedocs.io/en/latest/index.html),我按照使用度和难易度翻译,重新编写了大量原创内容,将不常用和较难的部分写成番外篇,浅显易懂,很easy的辣。每节的源码、图片和练习题答案均可在[引用](#引用)处找到噢(⊙o⊙)
8+
9+
---
10+
11+
## Python照样快!
12+
13+
众所周知,虽然Python语法简洁,编写高效,但相比C/C++运行慢很多。然而Python还有个重要的特性:它是一门胶水语言!Python可以很容易地扩展C/C++。**OpenCV-Python**就是用Python包装了C++的实现,背后实际就是C++的代码在跑,所以代码的运行速度跟原生C/C++速度一样快。
14+
15+
我举两个简单的例子就一目了然了:一个是读入图片,另一个是调整图片的对比度和亮度:
16+
17+
![](http://pic.ex2tron.top/cv2_python_vs_cplus_speed.jpg)
18+
19+
**可以看到某些情况下Python的运行速度甚至好于C++,代码行数也直接少一半多!**另外,图像是矩阵数据,OpenCV-Python原生支持[Numpy](https://baike.baidu.com/item/numpy),相当于Python中的Matlab,为矩阵运算、科学计算提供了极大的便利性。
20+
21+
## 人工智能浪潮
22+
23+
近些年,人工智能相关技术的快速发展大家有目共睹,不必多说。在编程语言方面,更多人希望的是具备高效开发效率、跨平台、高度扩展性的语言,尤其是一些AI巨头优先推出支持Python语言的深度学习框架,如Facebook的[PyTorch](https://pytorch.org/)、Google的[Tensorflow](https://tensorflow.google.cn/)等,可以说Python是名副其实的“网红语言”了。
24+
25+
![](http://pic.ex2tron.top/cv2_ai_ml_dl2.jpg)
26+
27+
[TIOBE编程语言排行榜](https://www.tiobe.com/tiobe-index/)也可以看到,Python发展迅猛,已经逼近C++的份额。这个排行榜每月更新,我就不截图了,编写时TOP5:Java/C/C++/Python/C#。
28+
29+
## 人生苦短,我用Python
30+
31+
- 如果你搞科研用,果断放弃C++(Matlab?出门左拐)
32+
- 如果你是快速原型开发,验证方案,果断放弃C++
33+
- 如果你懒的配置OpenCV环境,果断放弃C++
34+
- 如果你的程序是在支持Python的较高硬件环境下运行,果断放弃C++
35+
- 如果你担心Python写不了界面,那是你的问题o_o ....
36+
- 除非你的程序是MFC或已经用C++编写其他模块或是嵌入式设备,那就用C++吧
37+
38+
**"人生苦短,我用Python!!!"**
39+
40+
## 安装
41+
42+
> 本教程编写时使用的软件版本是:OpenCV 3.x,Python 3.x。
43+
44+
要安装OpenCV,只需cmd下的一条指令:
45+
46+
``` bash
47+
pip install opencv-python
48+
```
49+
50+
pip是Python的包管理器,如果你还没安装Python,强烈推荐安装[Anaconda](https://www.anaconda.com/download/),它包含了大量的科学计算包,不用后期一个个安装。即使你已经装了Python也没有影响,Anaconda相当于虚拟环境,互不干扰。
51+
52+
### 安装步骤
53+
54+
进入Anaconda[官网](https://www.anaconda.com/download/),下载最新版本的安装文件,速度比较慢的话,可以去[清华开源镜像站](https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/)
55+
56+
- Windows版下载的是exe文件,双击可以直接安装,安装时记得勾选 `Add Anaconda to my PATH environment variable`,添加到环境变量中。
57+
58+
- Linux版下载的是sh文件,下载完成后,终端切换到下载目录,执行`bash Anaconda3-xx.sh`,Linux版也会提示添加环境变量,记得输yes就行。
59+
60+
### 安装测试
61+
62+
Python安装好之后,可以在cmd中输入`python --version`来查看Python的版本信息。对于OpenCV,打开Python的开发环境,输入`import cv2`,运行没有报错说明一切正常。要查看OpenCV的版本,可以:
63+
64+
``` bash
65+
print(cv2.__version__) # '3.4.1'
66+
```
67+
68+
> Python开发环境我用的是[Visual Studio Code](http://code.visualstudio.com/),也可以用[PyCharm](http://www.jetbrains.com/pycharm/)/[Atom](https://atom.io/)/Jupyter Notebook(Anaconda自带),或者直接在命令行里敲,自己习惯就行。
69+
70+
### 常见问题
71+
72+
1. pip识别不了:环境变量中没有pip的目录,找到pip目录,添加到用户(或系统)变量的path中。
73+
2. 下载速度很慢:可[到此处](https://pypi.org/search/?q=opencv-python)下载离线版。下载完成后,cmd切换到下载目录,输入 `pip install 文件名`安装。
74+
75+
## 学习软件
76+
77+
为了便于学习OpenCV,我写了一个教学款软件[LearnOpenCVEdu](https://github.com/ex2tron/LearnOpenCVEdu),目前只开发了一部分功能,有兴趣的童鞋可以支持一下噢😊
78+
79+
![大家随手点个Star吧(●ˇ∀ˇ●)](http://pic.ex2tron.top/cv2_learn_opencv_edu_soft_screenshot.jpg)
80+
81+
> 经验之谈:虽然从一开始我就推荐大家使用OpenCV-Python进行图像处理,但*想要深入理解OpenCV*,C++还是必须的,尤其是**OpenCV源码**
82+
83+
## 引用
84+
85+
- [本节源码](https://github.com/ex2tron/OpenCV-Python-Tutorial/tree/master/01.%20%E7%AE%80%E4%BB%8B%E4%B8%8E%E5%AE%89%E8%A3%85)
86+
87+
### 网络资料
88+
89+
- [**OpenCV Docs官方文档**](https://docs.opencv.org/)
90+
- [OpenCV 官方Github](https://github.com/opencv/opencv)
91+
- [官方英文教程:OpenCV-Python Tutorials](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html)
92+
- [LearnOpenCV](http://www.learnopencv.com)[LearnOpenCV Github](https://github.com/spmallick/learnopencv)
93+
- [Numpy Quickstart Tutorial](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html)
94+
- [OpenCV 中文教程](http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html)
95+
96+
### 书籍
97+
98+
- [Programming Computer Vision with Python](http://programmingcomputervision.com/)[中文书](https://www.amazon.cn/dp/B00L3Y3NEM/ref=sr_1_1?ie=UTF8&qid=1543929834&sr=8-1&keywords=Python+%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89)
99+
- https://www.pyimagesearch.com/practical-python-opencv/
100+
101+
### 名校视觉研究所/课程
102+
103+
- [卡内基梅隆大学](http://graphics.cs.cmu.edu/)
104+
- [多伦多大学](https://www.cs.toronto.edu/~guerzhoy/320/)

02. 基本元素-图片/README.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# [OpenCV-Python教程02:基本元素-图片](http://ex2tron.wang/opencv-python-basic-element-image/)
2+
3+
![](http://pic.ex2tron.top/cv2_image_coordinate_channels.jpg)
4+
5+
学习如何加载图片,显示并保存图片。<!-- more -->图片等可到[源码处](#引用)下载。
6+
7+
---
8+
9+
## 目标
10+
11+
- 加载图片,显示图片,保存图片
12+
- OpenCV函数:`cv2.imread()`, `cv2.imshow()`, `cv2.imwrite()`
13+
14+
## 教程
15+
16+
大部分人可能都知道电脑上的彩色图是以RGB(红-绿-蓝,Red-Green-Blue)颜色模式显示的,但OpenCV中彩色图是以B-G-R通道顺序存储的,灰度图只有一个通道。
17+
18+
图像坐标的起始点是在左上角,所以行对应的是y,列对应的是x:
19+
20+
![](http://pic.ex2tron.top/cv2_image_coordinate_channels.jpg)
21+
22+
### 加载图片
23+
24+
使用`cv2.imread()`来读入一张图片:
25+
26+
``` python
27+
import cv2
28+
29+
# 加载灰度图
30+
img = cv2.imread('lena.jpg', 0)
31+
```
32+
33+
- 参数1:图片的文件名
34+
35+
- 如果图片放在当前文件夹下,直接写文件名就行了,如'lena.jpg'
36+
- 否则需要给出绝对路径,如'D:\OpenCVSamples\lena.jpg'
37+
38+
- 参数2:读入方式,省略即采用默认值
39+
40+
- `cv2.IMREAD_COLOR`:彩色图,默认值(1)
41+
- `cv2.IMREAD_GRAYSCALE`:灰度图(0)
42+
- `cv2.IMREAD_UNCHANGED`:包含透明通道的彩色图(-1)
43+
44+
> 经验之谈:路径中不能有中文噢,并且没有加载成功的话是不会报错的,`print(img)`的结果为None,后面处理才会报错,算是个小坑。
45+
46+
### 显示图片
47+
48+
使用`cv2.imshow()`显示图片,窗口会自适应图片的大小:
49+
50+
``` python
51+
cv2.imshow('lena', img)
52+
cv2.waitKey(0)
53+
```
54+
55+
参数1是窗口的名字,参数2是要显示的图片。不同窗口之间用窗口名区分,所以窗口名相同就表示是同一个窗口,显示结果如下:
56+
57+
![](http://pic.ex2tron.top/cv2_show_lena_gray.jpg)
58+
59+
`cv2.waitKey()`是让程序暂停的意思,参数是等待时间(毫秒ms)。时间一到,会继续执行接下来的程序,传入0的话表示一直等待。等待期间也可以获取用户的按键输入:`k = cv2.waitKey(0)`[练习1](#练习))。
60+
61+
我们也可以先用`cv2.namedWindow()`创建一个窗口,之后再显示图片:
62+
63+
```python
64+
# 先定义窗口,后显示图片
65+
cv2.namedWindow('lena2', cv2.WINDOW_NORMAL)
66+
cv2.imshow('lena2', img)
67+
cv2.waitKey(0)
68+
```
69+
70+
参数1依旧是窗口的名字,参数2默认是`cv2.WINDOW_AUTOSIZE`,表示窗口大小自适应图片,也可以设置为`cv2.WINDOW_NORMAL`,表示窗口大小可调整。图片比较大的时候,可以考虑用后者。
71+
72+
### 保存图片
73+
74+
使用`cv2.imwrite()`保存图片,参数1是包含后缀名的文件名:
75+
76+
``` python
77+
cv2.imwrite('lena_gray.jpg', img)
78+
```
79+
80+
Nice,是不是很简单呐,再接再厉噢(●'◡'●)
81+
82+
## 小结
83+
84+
- `cv2.imread()`读入图片、`cv2.imshow()`显示图片、`cv2.imwrite()`保存图片。
85+
86+
## 练习
87+
88+
1. 打开lena.jpg并显示,如果按下's',就保存图片为'lena_save.bmp',否则就结束程序。
89+
90+
2. Matplotlib是Python中常用的一个绘图库,请学习[番外篇:无损保存和Matplotlib使用](/opencv-python-extra-high-quality-save-and-using-matplotlib/)
91+
92+
## 接口文档
93+
94+
- [Mat Object](https://docs.opencv.org/4.0.0/d3/d63/classcv_1_1Mat.html)
95+
- [cv2.imread()](https://docs.opencv.org/4.0.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)
96+
- [cv2.imshow()](https://docs.opencv.org/4.0.0/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563)
97+
- [cv2.imwrite()](https://docs.opencv.org/4.0.0/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce)
98+
- [cv.namedWindow()](https://docs.opencv.org/4.0.0/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b)
99+
100+
## 引用
101+
102+
- [本节源码](https://github.com/ex2tron/OpenCV-Python-Tutorial/tree/master/02.%20%E5%9F%BA%E6%9C%AC%E5%85%83%E7%B4%A0-%E5%9B%BE%E7%89%87)
103+
- [Getting Started with Images](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html)

03. 打开摄像头/README.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# [OpenCV-Python教程03:打开摄像头](http://ex2tron.wang/opencv-python-open-camera/)
2+
3+
学习打开摄像头捕获照片、播放本地视频、录制视频等。<!-- more -->图片/视频等可到[源码处](#引用)下载。
4+
5+
---
6+
7+
## 目标
8+
9+
- 打开摄像头并捕获照片
10+
- 播放本地视频,录制视频
11+
- OpenCV函数:`cv2.VideoCapture()`, `cv2.VideoWriter()`
12+
13+
## 教程
14+
15+
### 打开摄像头
16+
17+
要使用摄像头,需要使用`cv2.VideoCapture(0)`创建VideoCapture对象,参数0指的是摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1,依此类推。
18+
19+
``` python
20+
# 打开摄像头并灰度化显示
21+
import cv2
22+
23+
capture = cv2.VideoCapture(0)
24+
25+
while(True):
26+
# 获取一帧
27+
ret, frame = capture.read()
28+
# 将这帧转换为灰度图
29+
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
30+
31+
cv2.imshow('frame', gray)
32+
if cv2.waitKey(1) == ord('q'):
33+
break
34+
```
35+
36+
`capture.read()`函数返回的第1个参数ret(return value缩写)是一个布尔值,表示当前这一帧是否获取正确。`cv2.cvtColor()`用来转换颜色,这里将彩色图转成灰度图。
37+
38+
另外,通过`cap.get(propId)`可以获取摄像头的一些属性,比如捕获的分辨率,亮度和对比度等。propId是从0~18的数字,代表不同的属性,完整的属性列表可以参考:[VideoCaptureProperties](https://docs.opencv.org/4.0.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d)。也可以使用`cap.set(propId,value)`来修改属性值。比如说,我们在while之前添加下面的代码:
39+
40+
``` python
41+
# 获取捕获的分辨率
42+
# propId可以直接写数字,也可以用OpenCV的符号表示
43+
width, height = capture.get(3), capture.get(4)
44+
print(width, height)
45+
46+
# 以原分辨率的一倍来捕获
47+
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2)
48+
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2)
49+
```
50+
51+
> 经验之谈:某些摄像头设定分辨率等参数时会无效,因为它有固定的分辨率大小支持,一般可在摄像头的资料页中找到。
52+
53+
### 播放本地视频
54+
55+
跟打开摄像头一样,如果把摄像头的编号换成视频的路径就可以播放本地视频了。回想一下`cv2.waitKey()`,它的参数表示暂停时间,所以这个值越大,视频播放速度越慢,反之,播放速度越快,通常设置为25或30。
56+
57+
```python
58+
# 播放本地视频
59+
capture = cv2.VideoCapture('demo_video.mp4')
60+
61+
while(capture.isOpened()):
62+
ret, frame = capture.read()
63+
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
64+
65+
cv2.imshow('frame', gray)
66+
if cv2.waitKey(30) == ord('q'):
67+
break
68+
```
69+
70+
### 录制视频
71+
72+
之前我们保存图片用的是`cv2.imwrite()`,要保存视频,我们需要创建一个`VideoWriter`的对象,需要给它传入四个参数:
73+
74+
- 输出的文件名,如'output.avi'
75+
- 编码方式[FourCC](https://baike.baidu.com/item/fourcc/6168470?fr=aladdin)
76+
- 帧率[FPS](https://baike.baidu.com/item/FPS/3227416)
77+
- 要保存的分辨率大小
78+
79+
FourCC是用来指定视频编码方式的四字节码,所有的编码可参考[Video Codecs](http://www.fourcc.org/codecs.php)。如MJPG编码可以这样写: `cv2.VideoWriter_fourcc(*'MJPG')``cv2.VideoWriter_fourcc('M','J','P','G')`
80+
81+
```python
82+
capture = cv2.VideoCapture(0)
83+
84+
# 定义编码方式并创建VideoWriter对象
85+
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
86+
outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))
87+
88+
while(capture.isOpened()):
89+
ret, frame = capture.read()
90+
91+
if ret:
92+
outfile.write(frame) # 写入文件
93+
cv2.imshow('frame', frame)
94+
if cv2.waitKey(1) == ord('q'):
95+
break
96+
else:
97+
break
98+
```
99+
100+
## 小结
101+
102+
- 使用`cv2.VideoCapture()`创建视频对象,然后在循环中一帧帧显示图像。参数传入数字时,代表打开摄像头,传入本地视频路径时,表示播放本地视频。
103+
- `cap.get(propId)`获取视频属性,`cap.set(propId,value)`设置视频属性。
104+
- `cv2.VideoWriter()`创建视频写入对象,用来录制/保存视频。
105+
106+
## 练习
107+
108+
1. 请先阅读[番外篇:滑动条](/opencv-python-extra-trackbar/),然后实现一个可以拖动滑块播放视频的功能。(提示:需要用到 `cv2.CAP_PROP_FRAME_COUNT``cv2.CAP_PROP_POS_FRAMES`两个属性)。
109+
110+
## 接口文档
111+
112+
- [VideoCapture Object](<https://docs.opencv.org/4.0.0/d8/dfe/classcv_1_1VideoCapture.html>)
113+
- [VideoWriter Object](<https://docs.opencv.org/4.0.0/dd/d9e/classcv_1_1VideoWriter.html>)
114+
- [cv2.cvtColor()](https://docs.opencv.org/4.0.0/d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab)
115+
116+
## 引用
117+
118+
- [本节源码](https://github.com/ex2tron/OpenCV-Python-Tutorial/tree/master/03.%20%E6%89%93%E5%BC%80%E6%91%84%E5%83%8F%E5%A4%B4)
119+
- [Video Codecs by FOURCC](http://www.fourcc.org/codecs.php)
120+
- [Getting Started with Videos](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html)

0 commit comments

Comments
 (0)