OpenCV4 手把手教程:从安装到图像识别,零基础也能学会
OpenCV 是计算机视觉领域最经典、使用最广泛的开源库之一。
如果你想学习图像处理、视频分析、人脸识别、目标检测,甚至后面的 YOLO、OCR、机器人视觉,那么 OpenCV 几乎都是绕不开的一项基础技能。
这篇文章我们不讲太多复杂数学公式,直接从安装开始,一步一步把 OpenCV 4 跑起来。

本文主要使用:
Python 3
OpenCV 4
NumPy
学习完之后,你可以掌握:
读取图片
显示图片
保存图片
图片缩放
图片裁剪
颜色转换
灰度处理
二值化
模糊处理
边缘检测
轮廓检测
绘制图形
添加文字
读取视频
调用摄像头
人脸检测
简单目标追踪
一、OpenCV 是什么?
OpenCV 全称:
Open Source Computer Vision Library
翻译过来就是:
开源计算机视觉库
它最早由 Intel 开发,现在已经成为计算机视觉领域使用最广泛的工具之一。
OpenCV 可以干什么?
例如:
图片处理
视频处理
人脸检测
人脸识别
车牌识别
二维码识别
目标检测
目标追踪
姿态识别
工业视觉
机器人视觉
OCR
比如一张普通图片:
原始图片
↓
OpenCV
↓
灰度化
↓
去噪
↓
边缘检测
↓
轮廓识别
↓
目标定位
很多计算机视觉系统,本质上就是这样一步一步处理出来的。
二、安装 Python
首先确认电脑已经安装 Python。
执行:
python --version
或者:
python3 --version
例如:
Python 3.12.5
如果没有安装,可以直接下载安装 Python 3。
一般建议:
Python 3.10
Python 3.11
Python 3.12
这些版本兼容性都比较好。
三、创建项目
新建一个目录:
mkdir opencv-demo
进入目录:
cd opencv-demo
创建虚拟环境:
python -m venv venv
Mac / Linux 激活:
source venv/bin/activate
Windows:
venv\Scripts\activate
然后安装 OpenCV。
四、安装 OpenCV4
Python 中 OpenCV 的包名是:
opencv-python
安装:
pip install opencv-python
同时安装 NumPy:
pip install numpy
也可以一次安装:
pip install opencv-python numpy
验证安装。
创建:
test.py
代码:
import cv2
print(cv2.__version__)
运行:
python test.py
如果输出:
4.x.x
例如:
4.12.0
说明 OpenCV4 已经安装成功。
五、OpenCV 最核心的概念:图片其实是矩阵
这是学习 OpenCV 非常重要的一个概念。
我们看到的是:
一张图片
但是计算机看到的其实是:
数字矩阵
例如一张彩色图片:
import cv2
img = cv2.imread("cat.jpg")
print(img)
你会看到类似:
[
[[123 45 67]
[121 48 70]
[119 50 72]]
...
]
每个像素通常包含三个数字。
OpenCV 默认使用:
BGR
也就是:
Blue
Green
Red
注意,不是常见的:
RGB
而是:
BGR
例如:
[255, 0, 0]
在 OpenCV 中表示:
蓝色
六、读取第一张图片
假设目录:
opencv-demo
│
├── main.py
└── cat.jpg
代码:
import cv2
img = cv2.imread("cat.jpg")
print(img)
读取图片使用:
cv2.imread()
七、显示图片
代码:
import cv2
img = cv2.imread("cat.jpg")
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里有三个重要的方法。
1. imshow
显示图片:
cv2.imshow("Image", img)
第一个参数:
窗口名称
第二个参数:
图片
2. waitKey
cv2.waitKey(0)
意思是:
等待键盘输入
如果写:
cv2.waitKey(1000)
表示:
等待 1000ms
也就是:
1 秒
3. destroyAllWindows
cv2.destroyAllWindows()
关闭所有 OpenCV 窗口。
八、查看图片尺寸
可以这样:
import cv2
img = cv2.imread("cat.jpg")
print(img.shape)
输出可能是:
(1080, 1920, 3)
表示:
高度:1080
宽度:1920
通道:3
也就是:
1080 × 1920
的彩色图片。
九、获取某一个像素
例如:
pixel = img[100, 200]
print(pixel)
可能输出:
[120 85 200]
对应:
B = 120
G = 85
R = 200
注意坐标顺序。
OpenCV:
img[y, x]
也就是:
先高度
再宽度
不是:
x, y
这一点初学者非常容易搞错。
十、保存图片
保存图片非常简单:
cv2.imwrite("output.jpg", img)
完整示例:
import cv2
img = cv2.imread("cat.jpg")
cv2.imwrite("new-cat.jpg", img)
十一、修改图片大小
使用:
cv2.resize()
例如:
import cv2
img = cv2.imread("cat.jpg")
new_img = cv2.resize(img, (800, 600))
cv2.imshow("Image", new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里:
800 = 宽
600 = 高
注意这个地方又变成:
(width, height)
十二、按照比例缩放图片
如果不希望把图片拉变形,可以按比例缩放。
例如缩小到:
50%
代码:
import cv2
img = cv2.imread("cat.jpg")
new_img = cv2.resize(
img,
None,
fx=0.5,
fy=0.5
)
cv2.imshow("Image", new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里:
fx = 水平方向缩放
fy = 垂直方向缩放
十三、裁剪图片
图片裁剪其实非常简单。
例如:
crop = img[100:500, 200:800]
完整代码:
import cv2
img = cv2.imread("cat.jpg")
crop = img[100:500, 200:800]
cv2.imshow("Crop", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()
本质上就是 NumPy 数组切片。
格式:
img[y1:y2, x1:x2]
例如:
y:100 ~ 500
x:200 ~ 800
十四、图片颜色转换
OpenCV 非常常见的一个操作就是:
颜色空间转换
使用:
cv2.cvtColor()
十五、彩色图片转灰度图
代码:
import cv2
img = cv2.imread("cat.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
原来:
BGR 三个通道
经过转换后:
只剩一个灰度通道
十六、BGR 转 RGB
如果使用:
Matplotlib
PIL
经常需要:
BGR → RGB
代码:
rgb = cv2.cvtColor(
img,
cv2.COLOR_BGR2RGB
)
十七、图片模糊
图片模糊通常用于:
去噪
例如使用高斯模糊:
blur = cv2.GaussianBlur(
img,
(15, 15),
0
)
完整示例:
import cv2
img = cv2.imread("cat.jpg")
blur = cv2.GaussianBlur(
img,
(15, 15),
0
)
cv2.imshow("Blur", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中:
(15, 15)
叫:
卷积核大小
一般必须使用奇数:
3
5
7
9
11
数值越大:
图片越模糊
十八、二值化
二值化之后,一张图片通常只有两种像素:
0
255
也就是:
黑
白
代码:
import cv2
img = cv2.imread("cat.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
_, binary = cv2.threshold(
gray,
127,
255,
cv2.THRESH_BINARY
)
cv2.imshow("Binary", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
这一步在:
OCR
车牌识别
文档识别
工业视觉
轮廓识别
中非常常见。
十九、自动二值化
127 是我们自己指定的阈值。
但是 OpenCV 也可以自动计算。
例如:
_, binary = cv2.threshold(
gray,
0,
255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
这个方法叫:
Otsu Threshold
即:
大津法
二十、边缘检测
OpenCV 最经典的边缘检测算法:
Canny
代码:
import cv2
img = cv2.imread("cat.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
edges = cv2.Canny(
gray,
100,
200
)
cv2.imshow("Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
处理流程:
原图
↓
灰度图
↓
Canny
↓
边缘
你会发现:
猫的轮廓
桌子的轮廓
人物轮廓
物体边缘
都被提取出来了。
二十一、腐蚀与膨胀
计算机视觉中还有两个非常经典的操作:
腐蚀
膨胀
英文:
Erosion
Dilation
例如:
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(
gray,
kernel,
iterations=1
)
dilation = cv2.dilate(
gray,
kernel,
iterations=1
)
简单理解。
腐蚀:
让白色区域变小
膨胀:
让白色区域变大
非常适合处理:
文字
二维码
轮廓
工业缺陷
OCR
二十二、在图片上画矩形
例如:
cv2.rectangle(
img,
(100, 100),
(500, 400),
(0, 255, 0),
3
)
完整示例:
import cv2
img = cv2.imread("cat.jpg")
cv2.rectangle(
img,
(100, 100),
(500, 400),
(0, 255, 0),
3
)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数分别是:
图片
左上角坐标
右下角坐标
颜色
线宽
二十三、画圆
代码:
cv2.circle(
img,
(300, 300),
100,
(0, 0, 255),
3
)
解释:
(300,300) = 圆心
100 = 半径
(0,0,255) = 红色
3 = 线宽
二十四、画直线
代码:
cv2.line(
img,
(100, 100),
(600, 500),
(255, 0, 0),
5
)
二十五、在图片上写文字
代码:
cv2.putText(
img,
"OpenCV4",
(100, 100),
cv2.FONT_HERSHEY_SIMPLEX,
2,
(0, 255, 0),
3
)
完整代码:
import cv2
img = cv2.imread("cat.jpg")
cv2.putText(
img,
"OpenCV4",
(100, 100),
cv2.FONT_HERSHEY_SIMPLEX,
2,
(0, 255, 0),
3
)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
以后 YOLO 检测框中的:
person
car
cat
dog
这些文字,本质上也可以使用这种方式绘制。
二十六、轮廓检测
轮廓检测是 OpenCV 中非常重要的一部分。
例如我们先:
灰度化
↓
二值化
↓
寻找轮廓
代码:
import cv2
img = cv2.imread("test.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
_, binary = cv2.threshold(
gray,
127,
255,
cv2.THRESH_BINARY
)
contours, hierarchy = cv2.findContours(
binary,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
print("轮廓数量:", len(contours))
绘制轮廓:
cv2.drawContours(
img,
contours,
-1,
(0, 255, 0),
2
)
完整:
import cv2
img = cv2.imread("test.jpg")
gray = cv2.cvtColor(
img,
cv2.COLOR_BGR2GRAY
)
_, binary = cv2.threshold(
gray,
127,
255,
cv2.THRESH_BINARY
)
contours, _ = cv2.findContours(
binary,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
cv2.drawContours(
img,
contours,
-1,
(0, 255, 0),
2
)
cv2.imshow("Contours", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二十七、给轮廓画检测框
找到轮廓之后,可以得到它的矩形位置。
例如:
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(
img,
(x, y),
(x + w, y + h),
(0, 255, 0),
2
)
这已经非常接近:
目标检测
的感觉了。
例如:
┌──────────────┐
│ │
│ 物体 │
│ │
└──────────────┘
二十八、计算轮廓面积
可以使用:
area = cv2.contourArea(contour)
例如:
for contour in contours:
area = cv2.contourArea(contour)
if area > 1000:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(
img,
(x, y),
(x + w, y + h),
(0, 255, 0),
2
)
这样就可以过滤:
小噪点
只保留:
较大的目标
二十九、读取视频
OpenCV 不只能处理图片,还可以处理视频。
例如:
import cv2
cap = cv2.VideoCapture("video.mp4")
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("Video", frame)
if cv2.waitKey(30) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
理解这段代码非常重要。
视频其实就是:
图片
图片
图片
图片
图片
图片
连续快速播放。
例如:
30 FPS
就是:
每秒播放 30 张图片
所以 OpenCV 处理视频,本质上就是:
while True:
读取一帧
处理这一帧
显示这一帧
三十、打开电脑摄像头
把:
cv2.VideoCapture("video.mp4")
改成:
cv2.VideoCapture(0)
就可以读取电脑摄像头。
完整代码:
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("Camera", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
运行之后:
摄像头
↓
OpenCV
↓
实时视频
按:
Q
退出程序。
三十一、摄像头实时灰度处理
我们再做一个简单实时处理。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(
frame,
cv2.COLOR_BGR2GRAY
)
cv2.imshow("Gray Camera", gray)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
这个时候整个摄像头画面就会实时变成:
黑白
这就是最基本的:
实时计算机视觉
三十二、摄像头实时边缘检测
继续升级:
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(
frame,
cv2.COLOR_BGR2GRAY
)
edges = cv2.Canny(
gray,
100,
200
)
cv2.imshow("Edge Camera", edges)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
现在摄像头中的:
人物
桌子
电脑
手机
都会变成边缘轮廓。
三十三、OpenCV 实现人脸检测
接下来做一个真正有意思的例子:
人脸检测
OpenCV 自带经典的人脸检测器:
Haar Cascade
代码:
import cv2
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades +
"haarcascade_frontalface_default.xml"
)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(
frame,
cv2.COLOR_BGR2GRAY
)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5
)
for x, y, w, h in faces:
cv2.rectangle(
frame,
(x, y),
(x + w, y + h),
(0, 255, 0),
2
)
cv2.imshow(
"Face Detection",
frame
)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
运行之后:
摄像头识别人脸
↓
计算人脸位置
↓
得到 x y w h
↓
画矩形框
效果类似:
┌────────────────┐
│ │
│ 人脸 │
│ │
└────────────────┘
三十四、理解目标检测最基本的数据结构
不管是:
OpenCV
YOLO
SSD
Faster R-CNN
RT-DETR
最终目标检测通常都会返回:
x
y
width
height
class
confidence
例如:
{
"class": "person",
"confidence": 0.95,
"x": 100,
"y": 150,
"width": 200,
"height": 400
}
然后程序做:
检测目标
↓
获取坐标
↓
画框
↓
写类别
↓
显示置信度
所以前面学习:
cv2.rectangle()
和:
cv2.putText()
其实就是在为:
YOLO 目标检测
打基础。
三十五、保存摄像头视频
OpenCV 还可以录像。
例如:
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(
"output.mp4",
fourcc,
20.0,
(640, 480)
)
while True:
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv2.imshow("Camera", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
out.release()
cv2.destroyAllWindows()
这样:
摄像头视频
就会被保存到:
output.mp4
三十六、实战:检测画面中移动的物体
接下来我们做一个稍微完整一点的 Demo。
目标:
摄像头
↓
检测运动
↓
找到运动物体
↓
画矩形框
代码:
import cv2
cap = cv2.VideoCapture(0)
ret, frame1 = cap.read()
ret, frame2 = cap.read()
while True:
diff = cv2.absdiff(
frame1,
frame2
)
gray = cv2.cvtColor(
diff,
cv2.COLOR_BGR2GRAY
)
blur = cv2.GaussianBlur(
gray,
(5, 5),
0
)
_, thresh = cv2.threshold(
blur,
20,
255,
cv2.THRESH_BINARY
)
dilated = cv2.dilate(
thresh,
None,
iterations=3
)
contours, _ = cv2.findContours(
dilated,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE
)
for contour in contours:
if cv2.contourArea(contour) < 1000:
continue
x, y, w, h = cv2.boundingRect(
contour
)
cv2.rectangle(
frame1,
(x, y),
(x + w, y + h),
(0, 255, 0),
2
)
cv2.imshow(
"Motion Detection",
frame1
)
frame1 = frame2
ret, frame2 = cap.read()
if not ret:
break
if cv2.waitKey(40) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
它的原理其实并不复杂。
连续获得两张图片:
Frame 1
Frame 2
计算:
Frame1 - Frame2
如果两个地方完全一样:
差值 ≈ 0
如果某一个物体移动了:
差值很大
所以流程就是:
摄像头
↓
Frame1
↓
Frame2
↓
计算差异
↓
灰度处理
↓
模糊去噪
↓
二值化
↓
寻找轮廓
↓
过滤小区域
↓
画检测框
这其实已经是一个非常简单的:
监控移动检测系统
三十七、OpenCV4 学习路线
如果你是第一次学习 OpenCV,我建议按照下面这个路线。
第一阶段:
Python
↓
NumPy
↓
OpenCV
掌握:
图片读取
图片保存
图片尺寸
图片裁剪
图片缩放
第二阶段:
灰度化
二值化
模糊
边缘检测
腐蚀
膨胀
第三阶段:
轮廓检测
图像特征
颜色识别
模板匹配
第四阶段:
视频读取
摄像头
运动检测
目标追踪
第五阶段:
OpenCV
+
深度学习
进入:
YOLO
OCR
人脸识别
姿态识别
机器人视觉
三十八、OpenCV 和 YOLO 是什么关系?
很多初学者会有一个疑问:
现在都有 YOLO 了,
为什么还学 OpenCV?
实际上:
OpenCV 和 YOLO
并不是竞争关系。
更多时候是:
YOLO
+
OpenCV
YOLO 负责:
识别目标
OpenCV 负责:
读取视频
图片预处理
摄像头调用
画检测框
图片裁剪
视频编码
结果展示
例如:
摄像头
↓
OpenCV
↓
YOLO
↓
目标检测
↓
OpenCV
↓
画框
↓
显示视频
所以做实际 AI 视觉项目的时候:
OpenCV 往往依然是基础设施。
三十九、OpenCV、Pillow 和 NumPy 的关系
这三个库经常一起出现。
NumPy
负责:
矩阵计算
因为图片本质上就是:
NumPy Array
Pillow
更加偏向:
普通图片编辑
例如:
图片格式转换
加水印
缩放
裁剪
文字
OpenCV
更加偏向:
计算机视觉
视频
摄像头
图像识别
简单理解:
NumPy
↓
数据基础
Pillow
↓
图片编辑
OpenCV
↓
计算机视觉
四十、OpenCV 最值得记住的 API
初学阶段不需要把 OpenCV 几百个 API 都学会。
先记住下面这些。
读取图片:
cv2.imread()
显示图片:
cv2.imshow()
保存图片:
cv2.imwrite()
修改大小:
cv2.resize()
颜色转换:
cv2.cvtColor()
模糊:
cv2.GaussianBlur()
二值化:
cv2.threshold()
边缘检测:
cv2.Canny()
寻找轮廓:
cv2.findContours()
画矩形:
cv2.rectangle()
写文字:
cv2.putText()
读取视频:
cv2.VideoCapture()
录像:
cv2.VideoWriter()
如果把这些掌握了,OpenCV 基础已经基本入门。
四十一、建议的项目目录
后面真正做项目的时候,可以这样组织:
opencv-project
│
├── images
│ ├── cat.jpg
│ └── dog.jpg
│
├── videos
│ └── demo.mp4
│
├── output
│ ├── result.jpg
│ └── result.mp4
│
├── src
│ ├── image_demo.py
│ ├── video_demo.py
│ └── face_demo.py
│
├── requirements.txt
│
└── README.md
requirements.txt:
opencv-python
numpy
安装:
pip install -r requirements.txt
四十二、一个非常重要的学习方法
OpenCV 最大的问题是:
API 太多
很多初学者容易陷入一个误区:
我要把所有 API 学完。
其实完全没有必要。
真正正确的方式是:
先做项目
↓
遇到问题
↓
寻找 OpenCV API
↓
解决问题
例如你想做:
摄像头检测红色物体
那么你只需要学习:
VideoCapture
cvtColor
inRange
findContours
rectangle
如果你想做:
运动监控
那就学习:
VideoCapture
absdiff
threshold
findContours
如果你想做:
YOLO 摄像头识别
就学习:
VideoCapture
resize
rectangle
putText
所以:
OpenCV 并不是背 API。
而是解决视觉问题的工具箱。
总结
如果把 OpenCV 整个学习过程压缩成一条路线,大概就是:
读取图片
↓
理解图片是矩阵
↓
灰度处理
↓
模糊与去噪
↓
二值化
↓
边缘检测
↓
轮廓检测
↓
视频处理
↓
摄像头
↓
目标检测
↓
YOLO / OCR / 视觉 AI
OpenCV4 本身并不难。
真正关键的是理解:
一张图片在计算机眼里就是一个数字矩阵。
而所谓计算机视觉,本质上就是:
不断加工这些数字,
最终从数字里找到我们真正关心的信息。
如果你准备进入:
YOLO
OCR
人脸识别
无人机视觉
具身智能
机器人
工业视觉
那么 OpenCV 都非常值得先学一遍。
它就像视觉 AI 世界里的:
Hello World + 基础工具箱
先把 OpenCV 玩熟,后面再进入深度学习视觉模型,你会轻松很多。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)