无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测

无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测

本章摘要:上一章对目标追踪中的TTC有个大概的讲解。在此基础上,第八、九章将对关键点keypoints方法进行详细的讲解。主要内容:图像上的关键点具备什么样的特征,如何探测;对检测出来的关键点如何描述,以便于和其他关键点区别和匹配;对于不同帧之间的关键点如何实现匹配,进而实现目标追踪。本章主要讲解关键点探测。

一、keypoints具备的特征

图像上那么多像素点,什么样的点叫做关键点了,应该是能够唯一确定位置的点。周边像素值一致或者区别不明显,肯定是难以确定唯一位置的,能够确定位置的地方应该是像素值变化明显的地方,那么它们具备什么样的特征了,看看下图:
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第1张图片
是不是可以得到下面的结果,直线上是难以确定唯一位置的,但是角点、椭圆中心可以,它们能够根据周边像素值比较准确的确定其(x, y)位置。后面主要对角点关键点进行分析。
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第2张图片

二、梯度值

上面的像素变化明显的地方如何度量了,那就是梯度,下面图直观的感受一下。可以看出像素值变化大的地方,梯度值很大。
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第3张图片
那梯度值如何计算了,其实和常规梯度计算一样的:

无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第4张图片
上面公式体现在像素值梯度计算上,怎么样比较方便了,这里采用Sobel operator 梯度计算。下面程序段会帮助了解其原理。
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第5张图片
x方向梯度值Ix的计算:

	// load image from file
    cv::Mat img;
    img = cv::imread("./img1.png");

    // convert image to grayscale
    cv::Mat imgGray;
    cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);

    // create filter kernel
    float sobel_x[9] = {-1, 0, +1,
                        -2, 0, +2, 
                        -1, 0, +1};
    cv::Mat kernel_x = cv::Mat(3, 3, CV_32F, sobel_x);

    // apply filter
    cv::Mat result_x;
    cv::filter2D(imgGray, result_x, -1, kernel_x, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);

    // show result
    string windowName = "Sobel operator (x-direction)";
    cv::namedWindow( windowName, 1 ); // create window 
    cv::imshow(windowName, result_x);
    cv::waitKey(0); // wait for keyboard input before continuing

三、高斯平滑

在进行上面梯度计算之前,还需要进行高斯平滑。因为原始图片可能会有噪点,可以采用高斯平滑减少他们的影响。
高斯平滑就是采用一定大小的窗口,对图片进行扫描过滤,这样就可以将像素周边的点以一定权重考虑进来,实现平滑的目的。

无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第6张图片
高斯平滑两个关键点:

  1. 方差:方差越大考虑周边的像素的权重就越大,结果也就越平滑。下图从左到右方差越来越小。
    无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第7张图片

  2. 窗口大小:窗口越大,周边越多像素被考虑进来。

	int filterSize = 5;
    int stdDev = 2.0;
    cv::GaussianBlur(imgGray, blurred, cv::Size(filterSize, filterSize), stdDev);

四、角点探测

比如有下面这样一个角点,如何探测到,并且能够确定其位置了。
采用一个窗口,计算窗口内部像素值的累计和,然后移动窗口,看像素值之后是否会发生明显的变化。图a 两个方向上都不会,图b 只有水平方向上会发生明显变化,图c 两个方向上都会发生明显变化。这两个方向上都会发生明显变化的点,就是我们要找的角点了。

下面进行计算分析:
假如窗口水平和竖直方向分别移动了u, v,那么窗口w内的像素值变化量为:
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第8张图片
对第一项进行泰勒展开可得:
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第9张图片
带回公式可以得到:
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第10张图片
称上面的H为协方差矩阵,其椭圆表示如下图所示。哪个方向越长,代表哪个方向的变化越明显更。

其中半长轴计算如下:
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第11张图片

五、Harris Corner Detector

Harris为经典角点探测中比较代表性的,其response计算如下,其中k值一般取 k = 0.04 - 0.06。
无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测_第12张图片

经典关键点探测算法,它们更多的关注准确度,速度往往欠佳。

  • 1988 Harris Corner Detector (Harris, Stephens)
  • 1996 Good Features to Track (Shi, Tomasi)
  • 1999 Scale Invariant Feature Transform (Lowe)
  • 2006 Speeded Up Robust Features (Bay, Tuytelaars, Van Gool)

实时关键点检测算法:

  • 2006 Features from Accelerated Segment Test (FAST) (Rosten, Drummond)
  • 2010 Binary Robust Independent Elementary Features (BRIEF) (Calonder, et al.)
  • 2011 Oriented FAST and Rotated BRIEF (ORB) (Rublee et al.)
  • 2011 Binary Robust Invariant Scalable Keypoints (BRISK) (Leutenegger, Chli, Siegwart)
  • 2012 Fast Retina Keypoint (FREAK) (Alahi, Ortiz, Vandergheynst)
  • 2012 KAZE (Alcantarilla, Bartoli, Davidson)

关于上面关键点检测算法的应用,详见github,SFND_2D_Feature_Tracking,还对各个算法的性能对比进行了比较。

后续

本章讲解了关键点的检测,下一章将会讨论如何描述检测出来的关键点,以便于和其他关键点区别和匹配。

文章说明:

Udacity 传感器融合课程笔记

你可能感兴趣的:(传感器融合)