Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /