Opnecv详细介绍
目录
一、前言与背景介绍
1.1 计算机视觉的兴起
1.2 OpenCV 的诞生与发展
1.3 OpenCV 的优势
1.4 OpenCV 的应用领域
二、OpenCV 基础概念与安装使用
2.1 OpenCV 的基本组成
2.2 OpenCV 的安装
(1)使用 pip 安装(推荐)
(2)conda 安装(推荐给 Anaconda 用户
(3)源码编译安装
2.3 测试 OpenCV 是否安装成功
2.4 OpenCV 的图像读取与显示
(1)读取与显示图像
(2)保存图像
(3)以不同模式读取图像
2.5 OpenCV 的颜色空间
2.6 图像尺寸与基本属性
三、图像处理核心技术
3.1 图像平滑与滤波
(1)均值滤波
(2)高斯滤波
(3)中值滤波
(4)双边滤波
3.2 边缘检测
(1)Sobel 算子
(2)Laplacian 算子
(3)Canny 边缘检测(最常用)
3.3 图像阈值分割
(1)固定阈值分割
(2)自适应阈值分割
(3)Otsu’s 阈值分割
3.4 图像形态学操作
(1)腐蚀(Erosion)
(2)膨胀(Dilation)
(3)开运算(Opening)
(4)闭运算(Closing)
(5)梯度运算(Gradient)
3.5 图像金字塔
(1)高斯金字塔(降采样)
(2)拉普拉斯金字塔(图像分层)
四、几何变换与图像增强
4.1 图像几何变换
(1)缩放(Resize)
(2)平移(Translation)
(3)旋转(Rotation)
(4)仿射变换(Affine Transformation)
(5)透视变换(Perspective Transformation)
4.2 图像增强
(1)直方图均衡化(Histogram Equalization)
(2)自适应直方图均衡化(CLAHE)
(3)对数变换(Log Transformation)
(4)伽马变换(Gamma Correction)
(5)拉普拉斯增强(锐化)
4.3 图像直方图
五、特征提取与匹配
5.1 为什么要做特征提取?
5.2 Harris 角点检测
5.3 SIFT(尺度不变特征变换)
5.4 SURF(加速鲁棒特征)
5.5 ORB(Oriented FAST and Rotated BRIEF)
5.6 特征匹配
(1)BFMatcher(暴力匹配)
(2)FLANN 匹配器(快速最近邻搜索)
5.7 应用案例:图像拼接
六、目标检测与图像分割
6.1 目标检测的基本思路
6.2 Haar 级联分类器(Haar Cascade)
6.3 HOG + SVM 行人检测
6.4 图像分割
(1)GrabCut 分割
(2)分水岭算法(Watershed)
6.5 背景建模与运动检测
6.6 应用案例:人脸检测 + 表情识别
七、视频处理与实时应用
7.1 视频读取与保存
(1)读取视频
(2)保存视频
7.2 调用摄像头
7.3 视频处理:颜色转换、滤波
7.4 实时人脸检测
7.5 目标跟踪
(1)初始化跟踪器
(2)实时跟踪
7.6 光流跟踪
(1)稠密光流(Dense Optical Flow)
7.7 实时应用场景
八、OpenCV 与深度学习结合
8.1 OpenCV DNN 模块
8.2 YOLO 模型
8.3 SSD 模型
8.4 人脸识别与关键点检测
8.5 OpenCV + 深度学习的实时应用场景
总结
一、前言与背景介绍
1.1 计算机视觉的兴起
在信息爆炸的今天,图像与视频已经成为最主要的数据来源之一。人类每天在互联网上产生的图片、视频、监控画面数以亿计。如何让计算机理解这些视觉信息,是人工智能领域的重要课题。计算机视觉(Computer Vision,简称 CV)便是研究如何让机器“看懂”世界的学科。
早期的计算机视觉研究主要集中在简单的图像处理,比如边缘检测、几何变换、形态学运算等。然而,随着人工智能、深度学习和硬件计算能力的提升,计算机视觉已经能够实现自动驾驶、医学影像诊断、人脸识别、视频监控、虚拟现实等高阶任务。
1.2 OpenCV 的诞生与发展
OpenCV(Open Source Computer Vision Library)是由英特尔公司在 1999 年发起并开源的计算机视觉库,最初是为了推动计算机视觉在工业界和学术界的普及。
OpenCV 的发展历程:
-
1999-2005:第一版 OpenCV 发布,主要以 C/C++ 接口为主,专注于基础图像处理。
-
2006-2009:社区化发展,逐渐加入更多算法(特征点检测、物体识别等)。
-
2010-2015:OpenCV 2.x 和 3.x 版本发布,Python 接口逐渐成熟,支持 GPU 加速,支持机器学习模块。
-
2016-至今:OpenCV 4.x 系列发布,专注于与深度学习框架的集成,支持 DNN 模块,可以直接加载 Caffe、TensorFlow、PyTorch 训练的模型。
如今,OpenCV 已经成为 全球最广泛使用的计算机视觉库,不仅在科研和教育中应用广泛,在工业界、安防监控、自动驾驶、医疗影像、机器人领域也被大量使用。
1.3 OpenCV 的优势
-
开源免费:任何人都可以免费使用,并在 GPL / BSD 协议下进行二次开发。
-
跨平台:支持 Windows、Linux、macOS、iOS、Android。
-
多语言接口:支持 C++、Python、Java 等。
-
高性能:底层优化良好,支持 GPU 加速。
-
社区活跃:有大量学习资料和代码示例。
1.4 OpenCV 的应用领域
-
人脸识别(安防监控、门禁系统、社交平台)
-
自动驾驶(车道检测、目标检测、障碍物识别)
-
医学影像(X 光片、CT 图像分析)
-
工业检测(产品缺陷检测、装配线视觉引导)
-
增强现实与虚拟现实(姿态估计、手势识别)
-
视频分析(运动跟踪、行为识别)
OpenCV 提供了图像的读取、显示、保存、颜色空间转换、像素操作、几何变换等基础功能。通过直方图、滤波、卷积、锐化、模糊等操作,开发者可以对图像进行预处理和增强,为后续分析提供高质量数据。
二、OpenCV 基础概念与安装使用
2.1 OpenCV 的基本组成
OpenCV 是一个模块化的计算机视觉库,包含了许多不同功能的模块,常见的有:
-
核心模块 (core):提供基本的数据结构和算法,比如
Mat
(矩阵)、随机数生成器、线性代数运算等。 -
图像处理模块 (imgproc):包含图像滤波、几何变换、颜色空间转换、阈值分割等。
-
图像输入输出模块 (imgcodecs):负责图像的读取和保存(JPEG、PNG、TIFF 等)。
-
视频处理模块 (videoio):读取视频文件、摄像头流,并支持视频编码保存。
-
高层 GUI 模块 (highgui):提供窗口显示、交互操作。
-
特征检测与匹配 (features2d):SIFT、SURF、ORB 等特征点检测。
-
对象检测 (objdetect):Haar 级联分类器、HOG+SVM 等方法。
-
机器学习模块 (ml):常见的分类器、回归器、聚类方法。
-
DNN 模块 (dnn):支持加载深度学习框架训练的模型(Caffe、TensorFlow、ONNX)。
这些模块共同构成了 OpenCV 的功能体系,使得它既能处理简单的图像读取,也能运行复杂的目标检测网络。
2.2 OpenCV 的安装
OpenCV 的安装非常简单,尤其是在 Python 环境下。
(1)使用 pip 安装(推荐)
pip install opencv-python
pip install opencv-contrib-python # 包含更多扩展模块
-
opencv-python
:基础模块,适合大多数图像处理任务。 -
opencv-contrib-python
:在基础版的基础上,额外包含xfeatures2d
等扩展功能,比如 SIFT、SURF 特征提取。
(2)conda 安装(推荐给 Anaconda 用户
conda install -c conda-forge opencv
(3)源码编译安装
在 Linux 上有时需要自己编译,以获得 GPU/CUDA 加速支持:
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
sudo make install
2.3 测试 OpenCV 是否安装成功
安装完成后,可以在 Python 中输入:
import cv2
print(cv2.__version__)
如果正常输出版本号(例如 4.9.0
),说明安装成功。
2.4 OpenCV 的图像读取与显示
(1)读取与显示图像
import cv2# 读取图像
img = cv2.imread("example.jpg")# 显示图像
cv2.imshow("Image", img)
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
-
cv2.imread()
:读取图像,默认是彩色图(BGR 格式)。 -
cv2.imshow()
:在窗口中显示图像。 -
cv2.waitKey(0)
:等待键盘输入,参数是毫秒数,0
表示无限等待。 -
cv2.destroyAllWindows()
:关闭所有窗口。
(2)保存图像
cv2.imwrite("output.jpg", img)
(3)以不同模式读取图像
img_color = cv2.imread("example.jpg", cv2.IMREAD_COLOR) # 彩色
img_gray = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE) # 灰度
img_unch = cv2.imread("example.jpg", cv2.IMREAD_UNCHANGED) # 原始格式(含透明通道)
2.5 OpenCV 的颜色空间
OpenCV 读取的彩色图像默认是 BGR 格式(蓝、绿、红),而不是常见的 RGB。
常见颜色空间转换:
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR → RGB
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR → 灰度
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR → HSV
-
RGB:常见彩色空间,适合显示。
-
Gray:灰度图,单通道,适合计算。
-
HSV:色相 (H)、饱和度 (S)、明度 (V),适合颜色分割。
2.6 图像尺寸与基本属性
在 OpenCV 中,图像通常用 NumPy 数组
表示。
print(img.shape) # (高度, 宽度, 通道数)
print(img.size) # 像素总数
print(img.dtype) # 数据类型,通常是 uint8
修改大小:
resized = cv2.resize(img, (400, 300)) # 指定宽、高
裁剪图像(直接用 NumPy 切片):
crop = img[50:200, 100:300] # [y1:y2, x1:x2]
三、图像处理核心技术
3.1 图像平滑与滤波
图像常常带有噪声(如相机噪声、光照变化),需要先进行 平滑(Smoothing) 或 滤波(Filtering) 处理。
(1)均值滤波
均值滤波是一种最简单的平滑方法,用邻域像素的平均值替代中心像素。
import cv2
import numpy as npimg = cv2.imread("example.jpg")# 3x3 均值滤波
blur = cv2.blur(img, (3,3))cv2.imshow("Original", img)
cv2.imshow("Mean Blur", blur)
cv2.waitKey(0)
缺点:容易使图像模糊,边缘不清晰。
(2)高斯滤波
使用高斯核进行加权平均,保留更多图像细节。
gaussian = cv2.GaussianBlur(img, (5,5), 1.5)
比均值滤波效果更自然,常用于噪声抑制。
(3)中值滤波
取邻域像素的中值,特别适合去除“椒盐噪声”。
median = cv2.medianBlur(img, 5)
(4)双边滤波
在平滑的同时保留边缘,是一种高级滤波方法。
bilateral = cv2.bilateralFilter(img, 9, 75, 75)
-
第一个参数:邻域直径
-
第二个参数:颜色相似性权重
-
第三个参数:空间距离权重
双边滤波常用于美颜、去噪。
3.2 边缘检测
图像的边缘是亮度变化剧烈的区域,通常代表物体的边界。
(1)Sobel 算子
Sobel 是一种一阶导数算子,用来检测水平或垂直边缘。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) # 水平
sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 垂直
sobel = cv2.addWeighted(cv2.convertScaleAbs(sobel_x), 0.5,cv2.convertScaleAbs(sobel_y), 0.5, 0)cv2.imshow("Sobel Edge", sobel)
cv2.waitKey(0)
(2)Laplacian 算子
检测二阶导数,能更全面地检测边缘。
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
(3)Canny 边缘检测(最常用)
Canny 算法是一种多阶段边缘检测方法,效果最好。
canny = cv2.Canny(gray, 100, 200) # 低阈值=100,高阈值=200
常用于实际工程,比如车道线检测、人脸轮廓提取。
3.3 图像阈值分割
图像分割的目标是把前景(对象)与背景分离。
(1)固定阈值分割
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
-
小于 127 → 0
-
大于等于 127 → 255
(2)自适应阈值分割
适合光照不均的情况。
adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)
(3)Otsu’s 阈值分割
自动计算最佳阈值。
ret2, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
Otsu 在医学影像(如细胞分割)中常用。
3.4 图像形态学操作
形态学操作主要用于二值图像,基于数学形态学。
(1)腐蚀(Erosion)
去掉前景物体的边界,使白色区域变小。
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(thresh, kernel, iterations=1)
(2)膨胀(Dilation)
扩展前景区域,使白色区域变大。
dilation = cv2.dilate(thresh, kernel, iterations=1)
(3)开运算(Opening)
先腐蚀后膨胀,去除噪点。
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
(4)闭运算(Closing)
先膨胀后腐蚀,填充物体内部小黑洞。
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)