第3章 OpenCV入门
读取图片 · 显示图片 · 保存图片 · 读取视频流 · 显示视频流
OpenCV(Open Source Computer Vision Library)是计算机视觉领域最流行的开源库。本章将带你快速掌握 OpenCV 的基本 I/O 操作:从磁盘读取图像、在窗口中显示、保存结果,以及处理视频流。这些操作是所有实时滤镜应用的基石。
3.1 读取图片
使用 cv2.imread() 函数加载图像。支持常见格式(PNG, JPEG, BMP 等)。第二个参数控制颜色模式:cv2.IMREAD_COLOR(默认,BGR)、cv2.IMREAD_GRAYSCALE(灰度)、cv2.IMREAD_UNCHANGED(含 Alpha 通道)。
import cv2
# 读取彩色图像 (BGR)
img = cv2.imread('example.jpg', cv2.IMREAD_COLOR)
# 读取灰度图像
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 读取含透明通道的图像
rgba = cv2.imread('icon.png', cv2.IMREAD_UNCHANGED)
3.2 显示图片
cv2.imshow() 在窗口中显示图像。第一个参数是窗口名称,第二个是图像矩阵。配合 cv2.waitKey() 和 cv2.destroyAllWindows() 控制显示时长。
cv2.imshow('My Image', img)
cv2.waitKey(0) # 等待任意按键
cv2.destroyAllWindows() # 关闭所有窗口
3.3 保存图片
cv2.imwrite() 将图像矩阵写入文件。格式由扩展名自动推断。返回布尔值表示是否成功。
success = cv2.imwrite('output.png', img)
if success:
print("图像保存成功")
else:
print("保存失败,请检查路径或权限")
3.4 读取视频流
使用 cv2.VideoCapture() 打开摄像头(传入设备索引,如 0)或视频文件(传入文件路径)。通过 .read() 逐帧获取图像。
cap = cv2.VideoCapture(0) # 打开默认摄像头
# cap = cv2.VideoCapture('video.mp4') # 或打开视频文件
while True:
ret, frame = cap.read()
if not ret:
break
# 对 frame 进行处理(滤镜等)
cv2.imshow('Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
3.5 显示视频流
视频流本质是快速连续显示图像帧。在循环中调用 cv2.imshow() 并配合 cv2.waitKey(1) 控制帧率。常用技巧:
- 帧率控制:
cv2.waitKey(30)约 33 FPS;cv2.waitKey(1)尽可能快。 - 退出条件:检测按键 'q' 或
ret为 False。 - 属性获取:
cap.get(cv2.CAP_PROP_FPS)、cap.get(cv2.CAP_PROP_FRAME_WIDTH)。
3.6 综合示例:图片与视频基础操作
下表总结了核心函数及其用途:
| 函数 | 用途 | 关键参数 |
|---|---|---|
cv2.imread() | 读取图像文件 | 文件路径, 颜色模式 |
cv2.imshow() | 在窗口显示图像 | 窗口名, 图像矩阵 |
cv2.imwrite() | 保存图像到文件 | 文件名, 图像矩阵 |
cv2.VideoCapture() | 打开摄像头或视频文件 | 设备索引/文件路径 |
cap.read() | 读取下一帧 | 返回 (ret, frame) |
cv2.waitKey() | 等待按键 / 刷新窗口 | 延迟毫秒数 |
将上述知识点组合,即可构建一个简单的实时滤镜流水线。后续章节将在此基础上添加各种滤镜效果。