OpenCV相关知识点集

4 阅读14分钟

安装OpenCV之前,先安装numpy、matplotlib

创建Python虚拟环境cv,在cv中安装即可。

由于一些经典的算法被申请了版权,新版本的限制,所以选用3.4.3以下的版本

pip install opencv-python==3.4.2.17

如果要利用SiFT和SURF进行特征提取时,还需要安装:

pip install opencv-contrib-python==3.4.2.17

——————————————————————————————————————

形态学操作

基础概念:

邻域:4、8。

连通性:4连通,D连通,8连通。

腐蚀:对图像中的高亮区域 进行蚕食,使其变小,去除边缘的噪声。

去除冗余或者潦草的边迹或者噪声,是会对图像中物体进行边界擦除

膨胀:扩大高亮区域,

填充空白区域,使物体看着更充实

开运算:

先腐蚀再膨胀

闭运算:

先膨胀再腐蚀

礼帽操作:

原图像 减- 开运算

黑帽操作:

闭运算 减- 原图像

图像噪声:

椒盐噪声:设备产生的随机的黑白点

高斯噪声:噪声本身服从高斯分布

图像的频率:

表征图像中灰度变化剧烈程度的指标,是灰度 平面空间上的梯度

从物理效果看,

傅立叶变换是将空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。

傅立叶变换的物理意义:

将图像的灰度分布函数变换为图像的频率分布函数。

傅立叶变换的作用:

高频:变化剧烈的灰度分量,例如边界。

低频:变化缓慢的灰度分量,例如大海

滤波:

低通滤波器:只保留低频,会使得图像模糊。

高通滤波器:只保留高频,会使得图像细节变强。

相关API:

主要是cv.dft()和cv.idft(),输入图像需要先转换成np.float32格式,得到的结果中频率为0的部分会在左上角;通常要转换到中心位置,可以通过shift变换来实现。cv.dft返回的结果是双通道的(实部、虚部),通常还需要转换成图像格式才能展示(0,255)

时域:以时间作为参照来分析动态世界的方法。

频域:频域不是真实的,而是一个数学构造。

幅度谱:将信号分解为若干不同频率的正弦波,那么每一个正弦波的幅度,就是频谱,也叫幅度谱。

相位谱:每一个正弦波的相位

HSL:

H:色相,代表人眼所能感知的颜色范围;颜色的本质。

S:色彩饱和度:数值越大,颜色中的灰色越少,否则越灰,因为车道线是黄色或白色,所以利用s通道阈值来检测车道线。

L:色彩的明亮程度,控制色彩的明暗变化,数值越大,色彩越亮,越接近白色;否则越暗,越接近黑色。

————————————————————————————————————

DNN模型:(从上到下)

1,语言绑定层,主要支持Python和Java,包括准确度测试、性能测试、示例程序。

2,C++的API层,是原生的API,功能主要包括 加载网络模型、推理运算以及获取网络的输出。

3,实现层,包括模型转换器、DNN引擎、层实现等。

4,加速层,包括CPU加速、GPU加速等

除了加速方法外,DNN模块还有网络层面的优化:

1,优化方式一:层融合。

对网络结构分析,把多个层合并到一起,从而降低网络复杂度和减少运算量。

2,优化方式二:内存复用。

————————————————————————————————————————

关于相机的内参和外参:

内参:确定相机从三维空间到二维空间到投影关系,畸变系数也属于内参。

外参:决定相机坐标系与世界坐标系之间的相对位置关系,主要包括旋转和平移两部分。

opencv中对图像的变换公式:

T = [ [T1 T2] 、[T3 a22] ]

T1表示对图像进行线性变换;T2对图像进行平移;T3表示对图像进行投影变换、a22一般设置为1。

我们需要找到4个点,其中任意三点不共线,然后获取 变换矩阵T,再进行 投射变换。通过函数cv.getPerspectiveTransform找到变换矩阵M【3*3大小】,再通过cv.warpPerspective应用此M矩阵

————————————————————————————————

Harris角点检测算法的思想:

通过图像的局部的小窗口观察图像,角点特征是窗口沿 任意方向移动都会导致图像灰度的明显变化。Harris算法通过判断梯度方向的灰度变化大小可以检测到图像的平坦区域、边缘或者角点。

Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点。

R的计算方式: R = detM − α(traceM)2

当R为大正数时是角点;R为da负数时是边界;当R为小数,认为是平坦区域。

Harris算法对尺度变化和旋转变化不具有不变性

Shi-Tomas角点检测是Harris角点检测的改进版,

使用了图像中的局部自相关矩阵的最小特征值来评估角点。

主要思想是通过计算特征值来确定图像的角点。

对于给定的像素点,通过计算其周围像素的梯度和局部自相关矩阵,可以得到一个 特征值。当这个特征值大于一定阈值时,就可以将该像素点认定为 角点。

更稳健,更准确。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Shi-Tomasi 角点检测
corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int64(corners)
# 在图像上绘制角点
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(img, (x, y), 3, 255, -1)

# 显示图像
cv2.imshow('Shi-Tomasi Corner Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

SIFT检测原理:

尺度空间极值检测:构建高斯金字塔、高斯差分金字塔、检测极值点

关键点定位:去除 对比度 较小和边缘 对极值点的影响

关键点方向确定:利用梯度直方图确定关键点的方法

关键点描述:对关键点周围图像区域分块,计算块内的梯度直方图,对关键点信息进行描述

SIFT算法是一种检测图像中关键点并提取描述符的算法,具有尺度不变性和旋转不变性,能够在不同尺度和旋转条件下提取问点的特征点。但计算度复杂度较高,提取的特征维度较大,不适用于实时性要求较高的场景。

SURF是SIFT的增强版。SIFT计算量大,实时性不高,特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷。

SIFT:使用不同尺度的图片与高斯函数进行卷积;SURF是使用不同大小的盒滤波器与原始图像做卷积,易于并行卷积。

SIFT关键点邻接矩形区域内,利用梯度直方图计算。SURF关键点邻接圆域内,计算x,y方向的haar小波


FAST 角点检测算法:

对图像中任一检测点,以该点为圆心的周围 邻域内 像素 判断监测点是否为角点。通俗的讲就是若一个像素周围用一定数量的像素与该点像素值不同,则认为其为角点


BRIEF是一种【特征描述子】提取算法,并非特征点的提取算法,一种生成二值化描述子的算法,提取代价低,匹配只需要使用简单的汉明距离利用比特之间的异或操作就可以完成;

图像滤波->选对 点对 ->构建描述符(对每一个 点对 进行二进制赋值,形成关键点对描述特征向量 ,仅包含0和1

ORB算法结合Fast和Brief算法,提出了构造金字塔,为Fast特征点添加了方向,从而使得关键点具有尺度不变性和旋转不变性。

MeanShift算法主要流程:

读取视频文件;

感兴趣区域设置:获取第一帧图像,并设置目标区域,即ROI区域

计算直方图:计算感兴趣区域对HSV直方图,并进行归一化。计算下一帧图像与选定区域直方图分布最为相似的区域

目标追踪:设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框。将选定区域沿着最为相似的部分进行移动,直到找到最为相似的区域,便完成了目标追踪。

缺点:无法解决目标遮挡的问题,并且不能适应运动目标的形状和大小变化。

CamShift算法:

连续自适应MeanShift算法,是对MeanShift算法的改进,可随着跟踪目标的大小变化实时调整search-window搜索窗口的大小,具有很好的跟踪效果。

缺点:当背景色和目标颜色接近时,容易使目标的区域变大,最终可能导致目标跟踪丢失。

基于卡尔曼滤波和匈牙利匹配算法作用在于能够输出【检测目标的ID】,其次能保证追踪算法的【实时性】。

卡尔曼滤波最核心的事就是融合预测和观测的结果,充分利用两者的不确定性来得到更加准确的估计。

关键步骤:

卡尔曼滤波预测轨迹 -> 使用匈牙利算法将预测后的tracks和当前帧中的detections进行IOU匹配

->卡尔曼滤波更新

SORT算引入了【线性速度模型和卡尔曼滤波】来进行位置预测,先进行位置预测再进行匹配。运动模型的结果可以用来预测物体的位置,匈牙利算法解决的是分配问题,用IOU举例作为权重(也叫Cost矩阵),并且当IOU小于一定数值时,不认为是同一个目标,理论基础是视频中两帧之间物体移动距离不会过大。scipy库的linear_sum_assignment实现了匈牙利算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。

DeepSort流程和Sort基本一样,就多了级联匹配(Matching Cascade)和新轨迹的确认(confirmed)

边缘检测:

Canny算法: 

1,高斯滤波噪声去除,

2,计算图像梯度:sobel算子计算梯度大小和方向

3,同方向梯度上进行NMS非极大值抑制:利用梯度方向像素来判断当前像素是否为边界点。

4,滞后阈值: 设置两个阈值,双阈值确定像素点是否为边界点,从而确定最终点边界。

sobel算子,scharr算子是基于搜索的。

Laplacian拉普拉斯算子是基于二阶导数穿越0的思想,对噪音点也敏感,而噪音点并非边界,所以需要结合其他方法一起使用。

Sobel函数求导后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数。所以Sobel建立的图像位数不够,会有截断。因此要使用16位 有符号的数据类型,即cv2.CV_16S。处理完图像后,再使用cv2.convertScaleAbs()函数将其转回原来的uint8格式,否则无法现实图像。

# 使用Sobel算子计算图像梯度
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)  # 在x方向上的梯度
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)  # 在y方向上的梯度

# 将梯度结果转换为无符号整数类型
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)

# 将x和y方向上的梯度合并
sobel_combined = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

# 显示原始图像和边缘检测结果
cv2.imshow('Original Image', img)
cv2.imshow('Sobel Edge Detection', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

——————————————————————————————————

cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True)对图片进行预处理,包含两个主要过程:

1,整体像素值 减去 平均值mean

2,通过 缩放系数scalefactor 对图片 像素值 进行缩放

参数mean:表示需要将图片整体减去平均值,如果需要对RGB图片的三个通道减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认三个通道减去 一样的值。

减去平均值(mean):是为了消除同一场景下不同光照的图片对最终分类和神经网络的影响。我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去这个平均值,然后得到像素之间的相对值,就可以排除光照的影响。

HOG特征检测算法:

将输入图像灰度化,即将彩色图转换为 灰度图

颜色空间归一化: 采用Gamma矫正法对 输入图像 进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制 噪声的干扰。

梯度计算:计算图像每个像素的梯度(包括大小和方向),主要是为了获取轮廓信息,同时进一步弱化光照的干扰。

梯度方向直方图:将图像 划分成 cells(例如6*6像素),统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的描述符。

重叠直方图归一化:将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征描述串联起来便得到该block的HOG特征描述符。

HOG特征:将图像image内的所有block的HOG特征描述符 串联起来 就可以得到该Image的HOG特征描述符,就得到最终的可供分类使用的特征向量。

#实例化HOG对象:hog = cv.HOGDescriptor()

直方图:统计灰度图像中像素值的个数。

直方图均衡化: 增强图像 对比度(亮度)的图像处理技术,通过CDF类及分布在函数对原始图像的每个像素值进行映射,将其转换为新的像素值,实现重新分布图像的像素,使得图像直方图变得更加均匀,从而增强图像的细节和对比度

clahe = cv2.createCLAHE(cliplimit=2.0, tileGridSize=(8,8))

CLAHE是一种改进直方图均衡化的方法,它在进行直方图均衡化时引入了对比度限制和自适应性。通过限制像素值的对比度增强,CLAHE可以避免过度增强噪声,并在不同区域应用不同的直方图均衡化参数,以适应图像的局部变化。

cliplimit:对比度限制因子,控制对比度的最大增强量。较小的值会产生较低的对比度增强,较大的值会产生较高的对比度增强,默认为2.0;

tileGridSize:每个局部区域的大小,用于计算局部直方图均衡化参数,默认(8,8)

直方图均衡化主要是针对图片中曝光过度或不对的情况

形态学操作是基于二值图的

霍夫变换检测图像是在二值图上进行的

Canny边缘检测之后的图像,本身就是二值图。

图像噪声:

高斯噪声:图像自身产生的,高斯滤波消除

椒盐噪声:是设备产生的,投影过程中随机产生的黑白点(中值滤波消除)

傅立叶变换:低频/高频滤波器,在频域当中处理

————————————————————————————————————

opencv应用:

信用卡数字识别,最后的边框通过 矩形框宽高比 过滤非数字矩形

答题卡答案识别: 后面过程通过与掩膜mask相与来判断所选答案

文档扫描: 边缘检测 获取轮廓 图像变换 OCR识别

目标跟踪: CamShift算法、卡尔曼滤波匈牙利匹配算法

疲劳驾驶:借助Dlib人脸识别工具

缺陷检测:形态学检测,Canny边缘检测、findContour寻找轮廓;cv2.threshold进行阈值操作选择cv2.threshold_binary_INV, 阈值操作后会进行一次反转

全局取消证书验证

import ssl
ssl._create_default_https_context = ssl._create_unverified_context