Camera系列文章
传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等),融合激光点云和图像进行TTC估计。
系列文章目录
1. 摄像头基础及校准
2. Lidar TTC估计
3. Camera TTC估计
4. OpenCV图像特征提取
文章目录
前言
后续这几节中我们将讨论如何识别并可靠稳定的跟踪连续帧中的图像特征。主要内容包括:
- 强度梯度和图像过滤基础,以及合理描述特征的特性;
- 熟悉如何用强度描述有效点,以及Harris检测算法
- 定位特征点:了解常用的特征检测算法及其特性,如图片旋转等变换条件,以及实际应用中的其他变换下的鲁棒性。
- 使用描述符跟踪连续帧中的特征点,重建车辆运动模型。
本节主要覆盖前两点。
考虑到图像识别知识点很多,在这里只是简单的把关键内容放上。另外,由于图像识别知识储备相对薄弱,如有描述不合理的地方还请指正。OpenCV提供了很多算法库用于检测图像的主要特征(Keypoint Detection),然后提取这些特征(Feature extraction),使其称为图像描述符(descriptor)
一、预备知识
特征定义
我们将图像中的某个特别的区域作为一个特征。特征是图像中有意义的图像区域,该区域具有独特特性或易于识别性。角点和高密度区域是很好的特征,而大量重复的区域或低密度区域则不是很好的特征。边缘可将图像分为两个区域,因此也可作为好的特征。斑点也是有意义的特征。
特征提取
将原始特征转换为一组具有明显物理意义、几何特征(角点,不变量)、纹理(LBP HOG)、统计意义或核的特征;
特征选择
从特征几何中挑选一组最具统计意义的特征,达到降维的目的。通过合适的特征选择可以减少数据存储和输入数据带宽,减少冗余,发现更有意义的潜在变量。由于某些算法在识别和提取某种类型特征的时候有较好的效果,所以输入图像是何种类型特征很重要,有利于选择最合适的特征检测算法。
二、强度梯度和图像过滤- 寻找Keypoints特征点
如前一章所述,摄像头无法直接测距,计算TTS是基于目标物在图像中投影的尺寸比。因此我们需要定位特征点keypoints,比如以下从之前图片提取的图块,存在类似的特征点。
强度梯度介绍
下图展示的是红线内图像的强度Intensity,强度梯度intensity gradient,可以看到,在特征点(边,角等)处存在明显的梯度变化。
下面我们看一下梯度的计算公式。
![Equations for gradient direction and magnitude](https://img-blog.csdnimg.cn/2021041808470696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pxc2h1c3Q=,size_16,color_FFFFFF,t_70)
通常直接通过相邻像素点的强度差计算强度梯度(Intensity Gradient)会受到图像噪点(如白噪声等)的影响,尤其是低照度环境下,因此我们需要对图像进行滤波,比如高斯滤波,对图像进行去噪,再进行梯度计算。
图像去噪和高斯滤波
为了消除噪声的影响,需要使用平滑算子对图像进行滤波。通常用的是高斯滤波器,使用高斯内核对图像进行处理(核是一组权重,通过相邻像素点来计算当前像素点的像素值;偏差 σ \sigma σ 代表权重分布,偏差越大,周围像素点的权重越大;核大小表示使用多少周围像素点来进行平滑过滤)。
下图是不同偏差的高斯滤波器内核。
下图是滤波计算公式,通过周围像素点的像素值及权重重新计算像素值。 k ( i , j ) k(i,j) k(i,j)为该像素点的权重, a i a_i ai, a j a_j aj为计算点在像素中的坐标。
下图是7×7内核的示例。
以下代码展示高斯滤波如何操作。加载图片后首先生成自定义的高斯内核,再使用Filter2D进行过滤。
void gaussianSmoothing1()
{
// load image from file
cv::Mat img;
img = cv::imread("../images/img1gray.png");
// create filter kernel
float gauss_data[25] = {
1, 4, 7, 4, 1,
4, 16, 26, 16, 4,
7, 26, 41, 26, 7,
4, 16, 26, 16, 4,
1, 4, 7, 4, 1};
cv::Mat kernel = cv::Mat(5, 5, CV_32F,