OpenCV 入门教程
FreeGuideOnline
最新
2026-07-14
bash python --version
如果未安装,请前往 [python.org](https://www.python.org) 下载对应系统的安装包,勾选“Add Python to PATH”后完成安装。
### 2.2 安装 OpenCV 及依赖
在终端中使用 pip 安装 OpenCV-Python。官方推荐安装补丁版本同时包含主模块和扩展模块(contrib)的包:
```bash
pip install opencv-python opencv-contrib-python
如果需要使用摄像头或视频处理,还需要确保 NumPy 和 Matplotlib 已安装:
pip install numpy matplotlib
2.3 验证安装
进入 Python 交互环境,导入 cv2 并打印版本号:
import cv2
print(cv2.__version__)
如果正常输出类似 4.8.0 的版本号,说明环境准备就绪。
3. 第一行代码:读取并显示图片
3.1 读取图片文件
使用 cv2.imread() 函数加载图片,它返回一个 NumPy 数组,代表图像的像素数据。
import cv2
# 路径请替换为你本地的图片文件
img = cv2.imread('sample.jpg')
print(type(img)) # <class 'numpy.ndarray'>
print(img.shape) # (高, 宽, 通道数)
如果图片不存在,img 将是 None,后续操作前务必检查。
3.2 显示图片
cv2.imshow('My Image', img)
cv2.waitKey(0) # 等待键盘按下,0 表示无限等待
cv2.destroyAllWindows()
3.3 色彩空间:BGR 与 RGB
OpenCV 默认读取的色彩顺序是 BGR,而不是常见的 RGB。用 Matplotlib 显示时需要转换,否则颜色会偏蓝。
import matplotlib.pyplot as plt
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.axis('off')
plt.show()
4. 图像基础操作
4.1 颜色空间转换
cv2.cvtColor() 支持几十种转换类型,最常用的是 BGR ↔ GRAY 和 BGR ↔ HSV。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
4.2 调整尺寸
resized = cv2.resize(img, (640, 480)) # (宽, 高)
或按比例缩放:
scale = 0.5
h, w = img.shape[:2]
new_size = (int(w * scale), int(h * scale))
resized = cv2.resize(img, new_size)
4.3 裁剪与绘制形状
图片实际上是数组,直接切片即可裁剪:
crop = img[100:300, 200:400] # [y 起点:终点, x 起点:终点]
在图像上绘制:使用 cv2.rectangle、cv2.circle、cv2.putText 等函数。
# 在副本上绘制,避免污染原图
img_copy = img.copy()
cv2.rectangle(img_copy, (50,50), (200,200), (0,255,0), 3) # 绿色矩形
cv2.circle(img_copy, (300,300), 80, (255,0,0), -1) # 蓝色实心圆
cv2.putText(img_copy, 'OpenCV', (50,400),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0,0,255), 2)
cv2.imshow('Drawings', img_copy)
cv2.waitKey(0)
4.4 图像阈值与边缘检测
二值化是许多图像处理任务的基础:
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
Canny 边缘检测可以直接找出图像中物体的轮廓:
edges = cv2.Canny(gray, 50, 150)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
4.5 保存处理后的图片
cv2.imwrite('output.jpg', edges)
5. 视频与摄像头操作
5.1 读取视频文件
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imshow('Video', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
waitKey(25) 决定了帧率,25 毫秒约合 40 fps。
5.2 调用摄像头
将 cv2.VideoCapture(0) 中的参数改为 0(默认摄像头),其他代码不变。可以在循环内对每一帧进行处理,实现实时特效。
示例:翻转画面(像镜子一样)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
flipped = cv2.flip(frame, 1) # 1 表示水平翻转
cv2.imshow('Camera', flipped)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
6. 实战:实时人脸检测
利用 OpenCV 内置的 Haar 级联分类器,可以快速实现人脸检测。
6.1 加载预训练模型
OpenCV 提供了多个基于 Haar 特征的 XML 分类器,位于 cv2.data.haarcascades 路径下。我们使用正面人脸检测器:
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
6.2 检测思路
- 将摄像头捕获的彩色帧转为灰度图(检测器需要灰度输入)
- 调用
detectMultiScale得到人脸矩形坐标 - 在原图上画出矩形框
6.3 完整代码
import cv2
# 1. 加载分类器
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
# 2. 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# detectMultiScale 参数:图像,缩放因子,最小邻居数
faces = face_cascade.detectMultiScale(gray, 1.1, 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) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()