第一章:OpenCV简介
1.1 什么是OpenCV?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由Intel公司于1999年发起,旨在为计算机视觉领域提供丰富的工具和算法。
其设计目标包括以下几点:
- 提供功能全面、高性能的计算机视觉和图像处理工具。
- 促进研究成果的快速应用和开发。
- 通过开源的方式激励社区合作与贡献。
应用领域:
- 图像处理:包括滤波、特征提取等。
- 视频分析:如运动检测、目标跟踪。
- 机器学习:人脸识别、模式分类。
- 增强现实(AR):如姿态估计。
- 医学图像分析、工业检测等。
1.2 OpenCV的历史与发展
- 1999年:OpenCV由Intel发起,主要服务于研究和开发人员。
- 2006年:第一个公开版本发布,迅速成为最流行的计算机视觉库。
- 2012年:转交给开源组织OpenCV.org管理,并支持多种平台(Windows、Linux、macOS等)。
- 2018年至今:引入对深度学习的支持,如通过DNN模块加载TensorFlow和Caffe等预训练模型。
目前,OpenCV版本已发展到4.x,增加了对CUDA、OpenCL等硬件加速的支持。
1.3 为什么选择OpenCV?
OpenCV之所以备受欢迎,是因为其具备以下优势:
- 跨平台:支持多种操作系统和开发语言(C++、Python、Java等)。
- 功能丰富:涵盖了从基础图像处理到复杂机器学习的工具。
- 高效:底层优化使其在CPU和GPU上都具有出色的性能。
- 社区活跃:拥有庞大的用户和开发者社区,提供丰富的学习资源。
1.4 安装与配置OpenCV
1.4.1 Windows系统安装
步骤:
- 下载 OpenCV安装包。
- 安装Python环境(推荐使用Anaconda)。
- 通过pip安装:
bash
pip install opencv-python pip install opencv-contrib-python
- 验证安装:
python
import cv2 print(cv2.__version__)
1.4.2 Linux系统安装
步骤:
- 更新系统包:
bash
sudo apt update && sudo apt upgrade
- 安装依赖库:
bash
sudo apt install python3-opencv
- 验证安装:
python
import cv2 print(cv2.__version__)
1.4.3 macOS系统安装
步骤:
- 使用Homebrew安装:
bash
brew install opencv
1.5 OpenCV支持的主要开发语言
OpenCV提供了丰富的语言绑定支持:
- C++:功能最全面,适合性能要求高的项目。
- Python:简洁易学,适合快速原型开发。
- Java:主要用于Android平台的应用开发。
- 其他:如MATLAB、C#,通过第三方库实现支持。
第二章:OpenCV基础知识
2.1 OpenCV中的数据结构和基本概念
2.1.1 Mat对象与图像表示
在OpenCV中,cv::Mat
是最重要的数据结构,用于表示图像和多维数组。
Mat的基本结构:
- 数据部分:存储像素数据。
- 元信息:包含图像的行数、列数、通道数、数据类型等。
创建Mat对象的常用方法:
- 从文件读取图像:
cpp
cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
- 创建空白图像:
cpp
cv::Mat blank = cv::Mat::zeros(500, 500, CV_8UC3);
- 转换数据类型:
cpp
cv::Mat converted; img.convertTo(converted, CV_32F);
Mat对象的常用方法:
rows
:行数cols
:列数channels()
:通道数type()
:数据类型
Python示例:
python
import cv2
import numpy as np
# 创建一个500x500的黑色图像
img = np.zeros((500, 500, 3), dtype=np.uint8)
# 打印图像信息
print(f"Rows: {img.shape[0]}, Cols: {img.shape[1]}, Channels: {img.shape[2]}")
2.1.2 图像的基本操作
-
读取图像
- 读取彩色图像:
cv2.IMREAD_COLOR
- 读取灰度图像:
cv2.IMREAD_GRAYSCALE
- 读取原始图像:
cv2.IMREAD_UNCHANGED
python
img = cv2.imread("image.jpg", cv2.IMREAD_COLOR)
- 读取彩色图像:
-
显示图像
python
cv2.imshow("Display window", img) cv2.waitKey(0) # 按任意键关闭窗口 cv2.destroyAllWindows()
-
保存图像
python
cv2.imwrite("output.jpg", img)
-
访问像素值
python
# 访问特定像素 pixel = img[100, 100] print(f"Pixel value: {pixel}") # 修改像素值 img[100, 100] = [255, 0, 0] # 将像素设置为蓝色
2.2 OpenCV中的基本绘图函数
OpenCV提供了一组绘图函数,可以直接在图像上绘制线条、形状和文本。
2.2.1 画线
python
cv2.line(img, (50, 50), (450, 50), (0, 255, 0), thickness=2)
2.2.2 画矩形
python
cv2.rectangle(img, (100, 100), (400, 300), (255, 0, 0), thickness=3)
2.2.3 画圆
python
cv2.circle(img, (250, 250), 50, (0, 0, 255), thickness=-1) # 填充圆
2.2.4 添加文字
python
cv2.putText(img, "Hello, OpenCV!", (50, 400), cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1, color=(255, 255, 255), thickness=2)
2.3 图像的颜色空间
2.3.1 常见颜色空间
- BGR:OpenCV默认的颜色空间。
- Gray:灰度图像。
- HSV:色调(Hue)、饱和度(Saturation)、亮度(Value)。
- Lab:亮度(L)、色差(a、b)。
2.3.2 颜色空间转换
python
# BGR转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
2.4 图像处理基础
图像处理是OpenCV的核心功能之一,以下介绍一些常用的图像处理操作。
2.4.1 图像平滑与模糊
图像平滑用于减少噪声,使图像更加柔和。常见的平滑方法包括均值滤波、高斯滤波和中值滤波。
1. 均值滤波
通过邻域内像素的平均值替换中心像素值。
python
blurred = cv2.blur(img, (5, 5)) # 5x5的卷积核
2. 高斯滤波
使用高斯核对图像进行卷积,平滑效果更自然。
python
gaussian = cv2.GaussianBlur(img, (5, 5), sigmaX=0)
3. 中值滤波
使用邻域内像素的中值代替中心像素值,特别适合去除椒盐噪声。
python
median = cv2.medianBlur(img, 5) # 核大小为5
2.4.2 边缘检测
边缘检测用于识别图像中显著的变化区域。
1. Sobel算子
计算图像的一阶或二阶导数,用于检测水平和垂直方向的边缘。
python
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # x方向
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) # y方向
2. Canny边缘检测
通过计算梯度并应用双阈值筛选来提取图像边缘。
python
edges = cv2.Canny(img, threshold1=100, threshold2=200)
2.4.3 形态学操作
形态学操作是基于图像结构元素进行的图像处理技术,常用于去噪、填充小孔等。
1. 腐蚀(Erosion)
通过最小值滤波器缩小白色区域。
python
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
eroded = cv2.erode(img, kernel, iterations=1)
2. 膨胀(Dilation)
通过最大值滤波器扩大白色区域。
python
dilated = cv2.dilate(img, kernel, iterations=1)
3. 开运算与闭运算
- 开运算:先腐蚀后膨胀,用于去除小噪点。
- 闭运算:先膨胀后腐蚀,用于填补小孔。
python
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
第三章:OpenCV进阶应用
3.1 特征检测与描述
特征检测是计算机视觉的重要任务,用于识别图像中的关键点,并为关键点生成描述符,便于图像匹配和场景理解。
3.1.1 角点检测
1. Harris角点检测
Harris角点检测通过计算图像梯度的变化,定位角点。
python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
img[corners > 0.01 * corners.max()] = [0, 0, 255] # 标记角点
2. Shi-Tomasi角点检测
改进版的Harris角点检测,更适合子像素级别的精确检测。
python
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
for corner in corners:
x, y = np.int0(corner.ravel())
cv2.circle(img, (x, y), 5, (0, 255, 0), -1)