OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛用于图像处理、视频分析、物体检测等领域。以下是快速上手 OpenCV 的教程。
目录
安装与环境配置
# 使用 pip 安装
pip install opencv-python # 基础包
pip install opencv-contrib-python # 包含额外模块(如 SIFT)
# 使用 conda 安装
conda install -c conda-forge opencv
# 验证安装
python -c "import cv2; print(cv2.__version__)"
图像基础操作
1. 读取与显示图像
import cv2
# 读取图像
img = cv2.imread('image.jpg') # 默认 BGR 格式
if img is None:
print("图像加载失败!")
# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
2. 图像属性与保存
# 获取图像尺寸和通道数
print(img.shape) # 输出: (height, width, channels)
# 保存图像
cv2.imwrite('output.jpg', img)
3. 调整图像尺寸
resized = cv2.resize(img, (new_width, new_height))
颜色空间与阈值处理
1. 颜色空间转换
# BGR 转 RGB
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# BGR 转灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
2. 阈值处理(二值化)
# 全局阈值
_, binary = cv2.threshold(gray_img, thresh=127, maxval=255, type=cv2.THRESH_BINARY)
# 自适应阈值
adaptive_binary = cv2.adaptiveThreshold(
gray_img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
blockSize=11,
C=2
)
边缘检测与轮廓分析
1. Canny 边缘检测
edges = cv2.Canny(gray_img, threshold1=100, threshold2=200)
2. 轮廓检测
# 查找轮廓
contours, _ = cv2.findContours(binary, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
contour_img = cv2.drawContours(img.copy(), contours, -1, (0, 255, 0), 2)
滤波与形态学操作
1. 均值滤波(去噪)
blurred = cv2.blur(img, ksize=(5, 5))
2. 高斯滤波(保留边缘)
gaussian_blur = cv2.GaussianBlur(img, (5, 5), sigmaX=0)
3. 形态学操作(膨胀与腐蚀)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 膨胀(扩大前景)
dilated = cv2.dilate(binary, kernel, iterations=1)
# 腐蚀(缩小前景)
eroded = cv2.erode(dilated, kernel, iterations=1)
视频处理
1. 实时视频捕获
cap = cv2.VideoCapture(0) # 0 表示默认摄像头
while True:
ret, frame = cap.read()
if not ret:
break
# 处理帧(例如灰度化)
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 显示帧
cv2.imshow('Video', gray_frame)
if cv2.waitKey(1) == 27: # 按 ESC 键退出
break
cap.release()
cv2.destroyAllWindows()
2. 保存视频
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame) # 写入帧
out.release()
注意事项
- 路径问题:确保图像/视频路径正确,OpenCV 不会抛出异常而是返回
None。 - 颜色空间:OpenCV 默认使用 BGR 而非 RGB,显示或保存时需转换。
- 坐标顺序:OpenCV 的图像坐标是 (width, height),而 NumPy 是 (height, width)。
- 性能优化:
- 避免在循环中频繁调用
cv2.imshow()或print()。 - 使用 NumPy 数组操作替代 Python 循环。
- 避免在循环中频繁调用
- SIFT/SURF 算法:
- 需安装
opencv-contrib-python包。 - 可能受专利保护,生产环境需谨慎使用。
- 需安装
总结
OpenCV 提供了丰富的图像和视频处理工具,适用于从基础图像操作到复杂计算机视觉任务。关键点总结:
- 图像处理:读取、显示、保存、调整尺寸。
- 颜色与阈值:颜色空间转换、二值化处理。
- 边缘与轮廓:Canny 边缘检测、轮廓分析。
- 滤波与形态学:去噪、膨胀/腐蚀。
- 视频处理:实时捕获、保存视频。
进一步学习:
- OpenCV 官方文档
- OpenCV-Python 教程
- 推荐书籍:《学习 OpenCV 4》(作者:Gary Bradski & Adrian Kaehler)