Core 模块:核心模块,提供了基本的数据结构和功能。
常用的核心函数:
-
cv::Mat
:表示多维数组的数据结构,是OpenCV中最常用的类之一,用于存储图像数据和进行矩阵运算。 -
cv::Scalar
:用于表示多通道数据的标量,通常用于颜色表示。 -
cv::Size
:用于表示二维空间中的尺寸大小,常用于图像尺寸的表示。 -
cv::Point
和cv::Point2f
:用于表示二维空间中的点坐标。 -
cv::Rect
:用于表示二维平面上的矩形区域。 -
cv::Range
:用于表示一维数据的范围。 -
cv::Mat_< >
:模板类,用于创建特定类型的矩阵。 -
cv::split
和cv::merge
:用于通道分离和合并操作。 -
cv::cvtColor
:用于颜色空间转换,例如RGB到灰度、RGB到HSV等。 -
cv::resize
:用于图像缩放操作。 -
cv::flip
:用于图像翻转操作。 -
cv::transpose
:用于矩阵转置操作。
Imgproc 模块:图像处理模块,包括图像过滤、几何变换等功能。
-
图像滤波函数:
cv::GaussianBlur
:高斯模糊。cv::medianBlur
:中值滤波。cv::bilateralFilter
:双边滤波。
高斯模糊(Gaussian Blur)是图像处理中常用的一种平滑滤波方法,它利用了高斯函数的特性对图像进行模糊处理。在OpenCV中,cv::GaussianBlur
函数就是用来实现高斯模糊的。
高斯模糊的原理如下:
- 对图像中的每个像素,以该像素为中心取一个固定大小的邻域(通常是一个正方形或矩形区域)。
- 对这个邻域内的所有像素值按照高斯分布进行加权平均,即距离中心像素越远的像素权重越小。
- 最后将加权平均后的值赋给中心像素,从而实现模糊效果。
高斯模糊的主要思想是利用高斯函数对像素值进行加权平均,使得图像中的噪声被平滑掉,同时保留图像的整体结构和边缘信息,避免产生锐化等不良效果。
高斯模糊的核(Kernel)由一个二维的高斯函数构成,通常是一个正态分布曲线。核的大小(即邻域的大小)以及标准差(控制高斯函数的宽度)可以影响模糊的程度,一般情况下,标准差越大,模糊效果越明显。
双边滤波的原理如下:
- 对图像中的每个像素,以该像素为中心取一个固定大小的邻域。
- 对这个邻域内的所有像素值进行加权平均,权重由两部分组成:
- 空间上的权重:根据像素之间的空间距离计算得出,距离越近的像素权重越大。
- 强度上的权重:根据像素值之间的差异计算得出,差异越小的像素权重越大。
- 最后将加权平均后的值赋给中心像素,从而实现平滑效果。
双边滤波相比于传统的高斯模糊具有更好的性能,因为它考虑了像素之间的空间关系和强度差异,能够保留图像中的边缘信息,同时对噪声有一定的抑制效果。这使得双边滤波在保持图像细节的同时进行平滑处理时非常有用。
需要注意的是,双边滤波的计算量相对较大,因此在实际应用中需要考虑其计算开销。
-
边缘检测函数:
cv::Canny
:Canny边缘检测算法。cv::Sobel
:Sobel边缘检测算子。cv::Scharr
:Scharr边缘检测算子。
在 Canny 边缘检测算法的实现遵循以下步骤:
-
高斯模糊(Gaussian Blur): 首先对输入的图像进行高斯平滑处理,以减少噪声对边缘检测的影响。OpenCV 提供了
cv::GaussianBlur
函数用于执行高斯滤波。 -
计算梯度: 使用 Sobel 算子计算图像在水平和垂直方向上的梯度。OpenCV 中的
cv::Sobel
函数可用于计算图像的梯度。 -
非极大值抑制: 对梯度图像进行非极大值抑制,保留局部梯度最大的像素值,以细化边缘。这一步确保只有边缘上的像素点被保留。
-
双阈值处理: Canny 边缘检测使用两个阈值来确定强边缘和弱边缘。OpenCV 中可以使用
cv::Canny
函数指定这两个阈值。像素梯度高于高阈值的被认为是强边缘,低于低阈值的被认为是弱边缘。 -
边缘跟踪: 在这一步中,通过连接强边缘像素,将其与周围的弱边缘像素关联起来,形成完整的边缘。OpenCV 的
cv::Canny
函数会执行这一步骤,并输出最终的边缘图像。
总的来说,OpenCV 中的 Canny 边缘检测函数 cv::Canny
实现了 Canny 边缘检测算法的全部流程,用户可以通过设置参数来调整阈值和其他参数,以获取他们需要的边缘检测结果。
sobel 边缘检测是通过 Sobel 算子来实现的。Sobel 算子是一种经典的边缘检测算子,用于计算图像在水平方向和垂直方向的梯度,进而找到图像中的边缘位置。
-
图像转换函数:
cv::resize
:图像缩放。cv::warpAffine
:仿射变换。cv::warpPerspective
:透视变换。
warpAffine
用于对图像进行仿射变换的函数。仿射变换是一种线性变换,可以保持图像中的直线在变换后仍然保持直线。warpAffine
函数可以通过指定变换矩阵来实现平移、旋转、缩放和剪切等操作。该函数的原理如下:
-
构建变换矩阵: 在进行仿射变换之前,首先需要构建一个 2x3 的变换矩阵,通常称为仿射矩阵。矩阵包含了平移、旋转、缩放和剪切等变换的参数。变换矩阵的形式| a b c | | d e f |其中 a 和 e 控制缩放和旋转,b 和 d 控制剪切,c 和 f 控制平移。
-
应用变换矩阵: 得到变换矩阵,
warpAffine
函数将使用这个变换矩阵来对图像进行仿射变换。对于输入图像中的每个像素,通过变换矩阵计算出其在输出图像中的位置,并根据插值方法得到输出图像中对应位置的像素值。可以使用不同的插值方法,如最近邻插值、双线性插值或立方插值,来计算输出图像中的像素值。这些插值方法可以帮助保持图像质量和准确性。
warpAffine
函数可以实现对图像的平移、旋转、缩放和剪切等仿射变换操作。这在图像处理、计算机视觉和机器学习等领域中都有广泛的应用。
warpPerspective
函数用于执行透视变换,允许您在图像中执行更一般化的几何变换,而不仅限于仿射变换。透视变换可以将图像从一个透视空间映射到另一个透视空间,常用于校正图像中的透视畸变或执行图像矫正。
warpPerspective
函数的原理:
-
构建透视变换矩阵: 进行透视变换之前,需要构建一个 3x3 的透视变换矩阵。这个矩阵包含了透视变换所需的所有参数,包括旋转、平移、缩放和投影等操作| a b c | | d e f | | g h i |
对于透视变换,变换矩阵有更多的自由度,可以表示更广泛的变换操作。
-
应用透视变换矩阵: 得到了透视变换矩阵,
warpPerspective
函数将使用这个矩阵来对图像进行透视变换。对于输入图像中的每个像素,通过透视变换矩阵计算出其在输出图像中的位置,并根据插值方法得到输出图像中对应位置的像素值。与
warpAffine
不同,warpPerspective
允许更一般化的透视变换,可以处理更复杂的图像变换需求,如图像校正、虚拟视点生成等。
-
直方图函数:
cv::calcHist
:计算图像直方图。cv::equalizeHist
:直方图均衡化。
图像直方图是对图像中像素灰度级别的统计信息,它可以帮助我们了解图像的对比度、亮度分布等特征。
-
形态学操作函数:
cv::erode
:腐蚀操作。cv::dilate
:膨胀操作。cv::morphologyEx
:形态学操作函数。
-
阈值处理函数:
cv::threshold
:图像阈值处理。cv::adaptiveThreshold
:自适应阈值处理。
-
轮廓检测函数:
cv::findContours
:查找图像中的轮廓。cv::drawContours
:绘制轮廓。
-
几何变换函数:
cv::getAffineTransform
:获取仿射变换矩阵。cv::getPerspectiveTransform
:获取透视变换矩阵。
Video 模块:视频处理模块,提供了视频捕获、光流估计等功能。
-
VideoCapture:这是一个用于从摄像头、视频文件或图像序列中读取视频数据的类。使用
VideoCapture
类可以很方便地获取视频帧并进行后续处理。 -
VideoWriter:这是一个用于将视频帧写入视频文件的类。通过
VideoWriter
类,我们可以将处理后的视频帧保存为视频文件,以便之后进行播放或其他用途。 -
BackgroundSubtractor:OpenCV 提供了多种背景减除算法的实现,用于从视频中提取前景目标。常见的算法包括 MOG2、KNN 等,可以通过创建相应的背景减除器对象来进行前景提取。
-
DenseOpticalFlow:密集光流估计是一种用于分析图像中像素运动的技术。OpenCV 提供了多种密集光流算法的实现,如 Farneback 光流算法等,在 Video 模块中可以找到相应的函数。
-
CamShift:这是一种基于颜色直方图投影的目标跟踪算法,通过不断更新目标区域的位置和大小来实现目标的跟踪。
-
KalmanFilter:卡尔曼滤波器是一种用于估计系统状态的滤波器,常用于目标跟踪和运动预测等任务。OpenCV 提供了 Kalman 滤波器的实现。
HighGUI 模块:图形用户界面模块,用于创建简单的GUI应用程序。
OpenCV 中的 HighGUI 模块提供了一些用于图形用户界面(GUI)操作的函数,包括显示图像、创建窗口、处理鼠标事件等。以下是一些常用的 OpenCV HighGUI 模块函数和类:
-
imshow:该函数用于在窗口中显示图像。我们可以使用这个函数来显示处理后的图像,便于可视化和调试。
-
waitKey:这个函数通常与 imshow 配合使用,用于等待用户按键输入。可以通过设置参数来控制等待时间,从而实现暂停或延时显示图像。
-
destroyWindow 和 destroyAllWindows:分别用于关闭指定窗口和关闭所有窗口。在图像显示完成后,使用这些函数可以释放窗口资源。
-
namedWindow:用于创建一个指定名称的窗口,可以设置窗口的属性,如大小、标志等。
-
setMouseCallback:允许在窗口上设置鼠标事件的回调函数,例如捕获鼠标点击、移动等事件,用于交互式操作。
-
createTrackbar:用于在窗口中创建一个滑动条,可以通过滑动条来调整图像处理过程中的参数,如阈值、滤波器参数等。
-
selectROI:用于在图像上选择感兴趣区域(ROI),通常用于目标跟踪、目标检测等任务。
Objdetect 模块:对象检测模块,包括Haar级联检测器等功能。
Objdetect 模块提供了用于对象检测和识别的函数和类,包括基于机器学习的目标检测器和一些帮助函数。以下是一些常用的 OpenCV Objdetect 模块函数和类:
-
CascadeClassifier:一个用于加载 Haar 级联分类器文件并进行对象检测的类。Haar 级联分类器是一种经典的目标检测算法,通常用于人脸检测等任务。
-
HOGDescriptor:这个类实现了支持向量机(SVM)和直方图梯度(HOG)特征的对象检测器。HOG 特征在行人检测等任务中表现良好。
-
groupRectangles:用于对检测到的矩形区域进行合并和过滤,通常用于对目标检测结果进行后处理。
-
QRCodeDetector:用于检测和解码二维码的类,可以识别图像中的 QR 码信息。
-
BaseCascadeClassifier:这是 CascadeClassifier 的基类,用于加载和解析级联分类器文件,支持其他类型的级联分类器。
-
detectMultiScale:这是用于在图像中多尺度检测对象的函数,可用于检测不同尺度下的目标对象。
-
QRCodeDetector.detectAndDecode:结合了检测和解码二维码的功能,可以一步完成二维码的检测和解码操作。
这些函数和类提供了在图像中进行对象检测和识别的基本工具,通过使用它们,我们可以加载训练好的分类器文件,对图像进行目标检测,并获取检测结果。同时,还可以针对检测结果进行一些后处理操作,以提高检测的准确性和鲁棒性。
备注:级联分类器
级联分类器(Cascade Classifier)是一种基于 Haar 特征的对象检测方法,最早由 Paul Viola 和 Michael Jones 提出,并被广泛用于人脸检测等领域。级联分类器采用级联结构,由多个级联的分类器组成,每个分类器用来检测图像中某个特定的目标或特征。
级联分类器的主要特点包括:
-
Haar 特征:级联分类器使用 Haar 特征来描述图像中的局部区域,这些特征是基于图像灰度值的矩形区域差异计算得到的。Haar 特征能够有效地描述目标物体的纹理和边缘等特征。
-
强分类器:级联分类器由多个强分类器组成,每个强分类器都是基于 AdaBoost 算法训练得到的,可以有效地区分目标物体和背景。
-
级联结构:级联分类器采用级联结构,每个级联中包含若干个强分类器,只有当前一个强分类器通过之后,才会进入下一个强分类器的检测。这种级联结构能够快速排除负样本,提高检测速度。
-
快速检测:级联分类器在检测时采用多尺度滑动窗口的方式,通过对图像进行多次扫描和缩放,可以在不同尺度下检测目标,同时保持较高的检测准确率。
级联分类器在对象检测领域有着较好的性能和实时性能,特别适用于需要快速准确地检测目标对象的场景,如人脸检测、行人检测等。通过训练和优化级联分类器,可以实现高效的目标检测系统。