一、视频处理
1.1 OpenCV指定视频编解码器的常用选项
注意,帧速率和帧大小也必须指定,这些属性可以通过VideoCapture类的get()函数得到。但是摄像头的帧速率准确值不能通过get()方法返回,所以对于摄像头创建合适的VideoWriter类,要么对帧速率做出假设,要么用计时器来测量。
二、处理图像
2.1 傅里叶变换
- 幅度谱:图像的幅度谱时另一种图像,幅度谱图像呈现了原始图像再变化方面的一种表示:把一幅图像中最明亮的像素放到图像中央,然后逐渐变暗,在边缘上的像素最暗,这样可以发现图像中有多少亮的像素和暗的像素,以及它们分布的百分比。
2.2 滤波器
- 高通滤波器:用来检测图像的某个区域,然后根据像素和周围像素的亮度差值来提升该像素的亮度的滤波器,注意,滤波器中的所有值加起来为
0
。 - 低通滤波器:在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。
- 核:一组权重的集合,它会应用在源图像的一个区域,并由此生成目标图像的一个像素。比如,大小尾7的核意味着每49(7*7)个源图像的像素会产生目标图像的一个像素。
- 锐化、边缘检测以及模糊等滤波器都使用了高度对称的核,但是有时不对称的核也会得到一些有趣的效果。
2.3 边缘&轮廓检测
Canny边缘检测算法非常复杂,有5个步骤:
用高斯滤波器对图像进行去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双阈值去除假阳性,最后还会分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘。
轮廓检测
- 轮廓检测不单单是用来检测图像或者视频帧中物体的轮廓,而且还有其他操作与轮廓检测有关,包括:计算多边形边界、形状逼近核计算感兴趣区域。
2.4 直线与圆检测
-
直线检测
可以通过HoughLines
和HoughLinesP
函数来完成,它们仅有的差异是:第一个函数使用的是标准Hough
变换,第二个函数使用概率Hough
变换(通过分析点的子集并估计这些点都属于一条直线的概率,这是标准Hough变换的优化版本,执行更快。)
一个简单的示例,代码不知道什么bug无法复制黏贴,源码
HoughLinesP
函数参数说明:
1、需要处理的图像;
2、线段的几何表示rho
和theta
,一般分别取1
和np.pi/180
;
3、阈值。低于该阈值的直线会被忽略;
4、最小直线长度和最大线间间距。 -
圆检测
HoughCircles
函数用来检测圆,类似地,有一个圆心间地最小距离和圆地最小及最大半径,下面是一个简单地示例:代码不知道什么bug无法复制黏贴,源码
HoughCircles
函数参数说明:
三、图像检索以及基于图像描述符的搜索
本节主要是使用OpenCV来检测图像特征,并利用这些特征进行图像匹配和搜索。
3.1 特征检测算法
OpenCV中最常使用的特征检测和提取算法有:
Harris
:用于检测角点SIFT
:用于检测斑点(Blob
)SURF
:用于检测斑点FAST
:用于检测角点BRIEF
:用于检测斑点ORB
:该算法代表带方向的FAST
算法与具有旋转不变性的BRIEF
算法
通过以下方法进行特征匹配:
- 暴力(
Brute-Force
)匹配法 - 基于
DLANN
的匹配法
可以采用单应性进行空间验证。
特征定义:
特征就是有意义的图像区域,该区域具有独特性或易于识别性。因此,角点及高密度区域是很好的特征,而大量重复的模式或低密度区域则不是好的特征;边缘可以将图像分为两个区域,因此也可以看作好的特征;斑点(与周围有很大差别的图像区域)也是有意义的特征。
检测角点特征
cornerHarris
是一个非常方便且实用的OpenCV
函数,该函数可以检测图像的角点。
DoG(Difference of Gaussians)
是对同一图像使用不同高斯滤波器所得到的结果,DoG
操作的最终结果会得到感兴趣的区域(关键点)。