-
- 1.2 安装 OpenCV-Python
- 1.3 第一个程序:读取并显示图像
- 图像基础操作
- 2.1 图像读取、显示与保存
- 2.2 图像属性与像素访问
- 2.3 颜色空间转换
- 2.4 图像算术运算与位运算
- 图像几何变换
- 3.1 缩放、平移、旋转
- 3.2 仿射变换与透视变换
- 3.3 图像金字塔
- 图像滤波与增强
- 4.1 平滑滤波(均值、高斯、中值、双边)
- 4.2 边缘检测(Sobel、Laplacian、Canny)
- 4.3 图像锐化
- 形态学操作
- 5.1 腐蚀与膨胀
- 5.2 开运算、闭运算、形态学梯度、顶帽、黑帽
- 5.3 应用实例:提取边界、消除噪声
- 图像阈值与分割
- 6.1 全局阈值与自适应阈值
- 6.2 Otsu 二值化
- 6.3 分水岭算法简介
- 轮廓分析
- 7.1 查找与绘制轮廓
- 7.2 轮廓特征(面积、周长、外接矩形等)
- 7.3 轮廓近似与凸包
- 7.4 形状匹配
- 直方图
- 8.1 计算与绘制直方图
- 8.2 直方图均衡化
- 8.3 直方图比较与反向投影
- 模板匹配
- 特征检测与匹配
- 10.1 Harris 角点检测
- 10.2 SIFT 特征检测
- 10.3 ORB 特征检测与匹配
- 10.4 特征匹配与单应性查找
- 视频处理与分析
- 11.1 读取视频与摄像头
- 11.2 视频写入
- 11.3 运动检测(帧差分、背景减除)
- 目标跟踪
- 12.1 MeanShift 与 CamShift
- 12.2 基于 KCF 等跟踪器 API
- 深度学习模块(DNN)
- 13.1 加载预训练模型
- 13.2 使用 YOLO 进行目标检测
- 综合项目实战
- 14.1 人脸检测与识别
- 14.2 文档扫描仪
- 14.3 手势识别
详细教程内容
第1章 OpenCV 简介与环境搭建
1.1 OpenCV 概述
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了数千种算法,涵盖图像处理、视频分析、目标检测、人脸识别、三维重建等众多领域。OpenCV 支持 C++、Python、Java 等多种语言,可在 Windows、Linux、macOS、Android、iOS 等平台上运行。
本教程使用 Python 语言,配合 opencv-python 包进行讲解。Python 语法简洁,适合快速原型开发和学习。
1.2 安装 OpenCV-Python
最简单的方式是通过 pip 安装主模块和扩展模块:
bash
pip install opencv-python opencv-contrib-python
opencv-python:包含核心模块。opencv-contrib-python:包含额外的贡献模块(如 SIFT、SURF 等算法)。
验证安装:
python
import cv2 print(cv2.__version__)
如果输出类似 4.8.0 的版本号,则安装成功。
1.3 第一个程序:读取并显示图像
python
import cv2
# 读取图像(路径中不能有中文)
img = cv2.imread('test.jpg')
# 检查是否读取成功
if img is None:
print("图像读取失败")
else:
# 显示图像窗口
cv2.imshow('My Image', img)
# 等待按键,0 表示无限等待
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
运行后会弹出窗口显示图片,按任意键关闭。OpenCV 的窗口管理简单直接,适合调试。
第2章 图像基础操作
2.1 图像读取、显示与保存
python
# 读取为彩色图像(默认)
img_color = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
# 读取为灰度图
img_gray = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 保存图像
cv2.imwrite('gray.jpg', img_gray)
常用标志:cv2.IMREAD_COLOR(1)、cv2.IMREAD_GRAYSCALE(0)、cv2.IMREAD_UNCHANGED(-1,包含 alpha 通道)。
2.2 图像属性与像素访问
OpenCV 中图像以 NumPy 数组形式存储,因此可以使用 NumPy 的所有操作。
python
img = cv2.imread('test.jpg')
# 形状:(高度, 宽度, 通道数)
print(img.shape) # 例如 (480, 640, 3)
# 总像素数
print(img.size) # 480*640*3 = 921600
# 数据类型
print(img.dtype) # uint8
# 访问某个像素:img[y, x, channel] (注意:先纵坐标后横坐标)
pixel = img[100, 200] # BGR 三个通道的值
b = pixel[0] # 蓝色分量
g = img[100, 200, 1] # 绿色分量
# 修改像素
img[100, 200] = [0, 0, 255] # 设为红色(BGR)
# 取出 ROI(感兴趣区域)
roi = img[50:200, 100:300] # 行范围,列范围
注意:OpenCV 默认颜色顺序是 BGR,而非 RGB,显示或保存时要留心。
2.3 颜色空间转换
python
img = cv2.imread('test.jpg')
# 转为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转为 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 转为 RGB
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
HSV 空间在颜色筛选时非常有用,例如提取蓝色物体:
python
# 定义蓝色的 HSV 范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([130, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 显示原图中蓝色区域
result = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('Blue regions', result)
2.4 图像算术运算与位运算
两幅图像相加(需要尺寸和通道数相同):
python
img1 = cv2.imread('a.jpg')
img2 = cv2.imread('b.jpg')
add = cv2.add(img1, img2) # 饱和运算
weighted = cv2.addWeighted(img1, 0.7, img2, 0.3, 0) # 混合
位运算(常用于掩膜操作):
python
# 创建矩形掩膜 mask = np.zeros(img.shape[:2], np.uint8) cv2.rectangle(mask, (100,100), (300,300), 255, -1) masked_img = cv2.bitwise_and(img, img, mask=mask)
发表回复