精华内容
下载资源
问答
  • RANSAC (Random Sample Consensus) 随机采样一致性算法,其实就是想办 法找出代表地面的平面。如下图所示,绿色的点为打在地面上的点,红色的点为 打在障碍物上的点。打在地面上的点基本上是处在一个平面上的,所以...
  • 无人驾驶传感器融合系列(十一)—— 相机内参标定 本章摘要:本章讲解相机畸变产生的原因,标定原理,以及如何通过opencv实现相机内参的标定。 一、相机畸变产生的原因 相机主要有两大畸变,径向畸变,切...

    无人驾驶传感器融合系列(十一)—— 相机内参标定

    本章摘要:本章讲解相机畸变产生的原因,标定原理,以及如何通过opencv实现相机内参的标定。

    一、相机畸变产生的原因

    相机主要有两大畸变,径向畸变,切向畸变。
    径向畸变
    下面左图为针孔相机模型,如果按此理想模型进行投影的话,其实是不会产生径向畸变的。但是实际上,相机是采用透镜来代替针孔的,以增加采光量,提升投影质量。在透镜的边缘,光线会或多或少的产生异常的弯曲,这就导致了相片边缘的畸变现象。
    在这里插入图片描述在这里插入图片描述切向畸变:
    由于透镜和成像平面之间的不平行,造成的成像的倾斜现象,这样就会导致成像物体看起来比实际物体更近,或者更远。
    在这里插入图片描述

    二、畸变系数计算原理

    径向畸变系数为k1, k2, k3,切向畸变系数为p1, p2,可以通过如下两个方程求得:
    在这里插入图片描述径向畸变计算方程
    在这里插入图片描述
    切向畸变计算方程:
    在这里插入图片描述

    三、相机内参标定

    根据上面畸变洗漱计算原理,下面讲讲如何采用opencv实现相机内参的标定主要流程。

    1. 采用cv2.findChessboardCorners( ),找到畸变棋盘上的角点。往往会收及一系列不同角度、方向上的的棋盘图片。
      在这里插入图片描述
    2. 将畸变棋盘角点与非畸变棋盘角点对应。
      在这里插入图片描述
    3. 采用cv2.calibrateCamera()计算畸变系数。
    4. 采用cv2.undistort() 给图片去畸变。

    四、实例演示

    import numpy as np
    import cv2
    import glob
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import pickle
    
    # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
    #非畸变棋盘角点
    objp = np.zeros((6*9,3), np.float32)
    objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
    
    # Arrays to store object points and image points from all the images.
    objpoints = [] # 3d points in real world space
    imgpoints = [] # 2d points in image plane.
    
    # Make a list of calibration images
    #导入一组不同角度、距离的棋盘照片
    images = glob.glob('camera_cal/*.jpg')
    
    # Step through the list and search for chessboard corners
    #找到角点,然后对应放入objpoints 、imgpoints
    for idx, fname in enumerate(images):
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        # Find the chessboard corners
        ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
    
        # If found, add object points, image points
        if ret == True:
            objpoints.append(objp)
            imgpoints.append(corners)
    
    # Test undistortion on an image
    img = cv2.imread('camera_cal/calibration1.jpg')
    img_size = (img.shape[1], img.shape[0])
    
    # Do camera calibration given object points and image points
    # 计算畸变系数
    # mtx:3维到2维像平面投影矩阵,dist:畸变洗漱矩阵 [k1, k2, p1, p2, k3]。
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size,None,None)
    
    # 给图片去畸变
    dst = cv2.undistort(img, mtx, dist, None, mtx)
    cv2.imwrite('output_images/calibration1_undist.jpg',dst)
    
    # Save the camera calibration result for later use (we won't worry about rvecs / tvecs)
    dist_pickle = {}
    dist_pickle["mtx"] = mtx
    dist_pickle["dist"] = dist
    pickle.dump( dist_pickle, open( "camera_cal/dist_pickle.p", "wb" ) )
    #dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
    # Visualize undistortion
    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(20,10))
    ax1.imshow(img)
    ax1.set_title('Original Image', fontsize=30)
    ax2.imshow(dst)
    ax2.set_title('Undistorted Image', fontsize=30)
    

    在这里插入图片描述

    代码资源

    关于上面的代码资源,见github: Advanced-Lane-Finding前半部分。

    展开全文
  • 无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测 本章摘要:上一章对目标追踪中的TTC有个大概的讲解。在此基础上,第八、九章将对关键点keypoints方法进行详细的讲解。主要内容:图像上的关键点...

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

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

    一、keypoints具备的特征

    图像上那么多像素点,什么样的点叫做关键点了,应该是能够唯一确定位置的点。周边像素值一致或者区别不明显,肯定是难以确定唯一位置的,能够确定位置的地方应该是像素值变化明显的地方,那么它们具备什么样的特征了,看看下图:
    在这里插入图片描述
    是不是可以得到下面的结果,直线上是难以确定唯一位置的,但是角点、椭圆中心可以,它们能够根据周边像素值比较准确的确定其(x, y)位置。后面主要对角点关键点进行分析。
    在这里插入图片描述

    二、梯度值

    上面的像素变化明显的地方如何度量了,那就是梯度,下面图直观的感受一下。可以看出像素值变化大的地方,梯度值很大。
    在这里插入图片描述
    那梯度值如何计算了,其实和常规梯度计算一样的:
    在这里插入图片描述
    在这里插入图片描述
    上面公式体现在像素值梯度计算上,怎么样比较方便了,这里采用Sobel operator 梯度计算。下面程序段会帮助了解其原理。
    在这里插入图片描述
    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
    

    在这里插入图片描述

    三、高斯平滑

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

    在这里插入图片描述
    高斯平滑两个关键点:

    1. 方差:方差越大考虑周边的像素的权重就越大,结果也就越平滑。下图从左到右方差越来越小。
      在这里插入图片描述

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

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

    四、角点探测

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

    下面进行计算分析:
    假如窗口水平和竖直方向分别移动了u, v,那么窗口w内的像素值变化量为:
    在这里插入图片描述
    对第一项进行泰勒展开可得:
    在这里插入图片描述
    带回公式可以得到:
    在这里插入图片描述
    称上面的H为协方差矩阵,其椭圆表示如下图所示。哪个方向越长,代表哪个方向的变化越明显更。
    在这里插入图片描述
    其中半长轴计算如下:
    在这里插入图片描述

    五、Harris Corner Detector

    Harris为经典角点探测中比较代表性的,其response计算如下,其中k值一般取 k = 0.04 - 0.06。
    在这里插入图片描述

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

    • 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 传感器融合课程笔记

    展开全文
  • 无人驾驶传感器融合系列(七)——基于相机的目标追踪与碰撞检测 本章摘要:本章主要讲解基于相机实现目标追踪的整体思路,以及根据追踪的结果实现一个简单的应用TTC(time to collision),好对基于相机的目标...

    无人驾驶传感器融合系列(七)——基于相机的目标追踪与碰撞检测

    本章摘要:本章主要讲解基于相机实现目标追踪的整体思路,以及根据追踪的结果实现一个简单的应用TTC(time to collision),好对基于相机的目标追踪有一个大概的了解,在此了解的基础上,后续文章会对相关细节进行进一步的分析。

    一、TTC 介绍

    TTC也就是啥时候碰撞的意思,下面简化介绍一下。如下场景,我们根据 t0, t1时刻的距离,来求得TTC,主要有常速的模型CVM,和常加速度模型CAM,为了简化计算我们这里采用常速度模型。
    在这里插入图片描述在这里插入图片描述
    根据针孔相机模型,目标投影到像平面上具有下面的比例关系,根据此比例关系(h1/h0)、常速度模型就可以求得TTC,发现其只和时间间隔和投影比例有关,这样我们就可以完全根据时间间隔、图片信息来求得TTC。
    在这里插入图片描述
    在这里插入图片描述

    二、基于深度学习网络的目标检测(YOLOv3)

    采用深度学习神经网络,可以实现多目标检测,比如SSD, YOLO。检测结果会在检测目标上画出检测框图,我们可不可以利用框图的边长来求得相邻frame之间的目标车辆的比例关系(h1/h0),然后得到TTC了。但是观察可以发现,框图并不是严格表示物体的大小的,并且不同frame之间变化并不连续,所以直接用框图的边长来计算比例关系不可行。虽然直接利用框图边长来计算TTC不可行,但是框图告诉了我们不同的物体所在的大概位置,我们可以利用这个大概的位置信息,将目标锁定在框图内。
    关于如何具体使用,这里就不做具体讲解了,在github中给了具体的说明。地址:YOLOv3-Object-Detection-with-OpenCV

    在这里插入图片描述

    三、采用关键点keypoints

    针对框图内的目标物体,是不是可以提取代表目标物体的关键点了,这些关键点在不同frame上“比较唯一”。比如下面图中所示,在汽车图像上提取了七个关键点,而这七个关键点在下一frame上依然会出现,并且相对关系不变,这样的话就可以通过追踪关键点实现相邻frame之间目标物体追踪。然后计算当前frame中关键点之间的距离,下一frame中这些关键点之间的距离,然后计算这些距离的比例,就可以求得TTC了。比如图b中所示,可以求得一些列比例 b12/b’12, b14/b’14, b13/b’13等,当然实际中数量远比这多得多,然后求得这些比例的平均值、或者中值作为相邻frame之间目标物体的比例(h1/h0)。由于一些错误匹配、或者非目标物体上的点的干扰,会造成平均值误差较大,所以往往选取中值。
    这里提及到的keypoints提取、匹配设计的内容较多,将在后续单独用一章节进行介绍。
    在这里插入图片描述

    文章说明:

    Udacity 传感器融合课程笔记

    展开全文
  • 无人驾驶传感器融合系列(九)——基于相机目标追踪之关键点描述、匹配 本章摘要:关键点检测出来之后,需要将其与其它图像上的关键点进行匹配,匹配的依据是什么了,这就需要涉及到关键点的描述了。根据关键点...

    无人驾驶传感器融合系列(九)——基于相机目标追踪之关键点描述、匹配

    本章摘要:关键点检测出来之后,需要将其与其它图像上的关键点进行匹配,匹配的依据是什么了,这就需要涉及到关键点的描述了。根据关键点描述的数据值,好对不同关键点进行区别、匹配。本章概略性的讲解了,梯度直方图描述算子,二进制描述算子,匹配方法,匹配结果筛选等。

    一、基于梯度方向直方图(HOG) 描述算子

    HOG (Histograms of Oriented Gradients)主要的思想就是采用关键点周边像素的梯度来对关键点进行描述。具有代表性的算法就是SIFT (Scale-Invariant Feature Transform),其计算过程大概如下:

    1. First, keypoints are detected in the image using an approach called “Laplacian-Of-Gaussian (LoG)“, which is based on second-degree intensity derivatives. The LoG is applied to various scale levels of the image and tends to detect blobs instead of corners. In addition to a unique scale level, keypoints are also assigned an orientation based on the intensity gradients in a local neighborhood around the keypoint.
    2. Second, for every keypoint, its surrounding area is transformed by removing the orientation and thus ensuring a canonical orientation. Also, the size of the area is resized to 16 x 16 pixels, providing a normalized patch.

    在这里插入图片描述

    1. Third, the orientation and magnitude of each pixel within the normalized patch are computed based on the intensity gradients Ix and Iy.
    2. Fourth, the normalized patch is divided into a grid of 4 x 4 cells. Within each cell, the orientations of pixels which exceed a threshold on magnitude are collected in a histogram consisting of 8 bins.

    在这里插入图片描述
    在这里插入图片描述
    5. Last, the 8-bin histograms of all 16 cells are concatenated into a 128-dimensional vector (the descriptor) which is used to uniquely represent the keypoint.

    二、二进制描述算子

    上面基于梯度方向直方图的描述算子,能够很好的应对缩放、旋转、亮度改变、对比度改变,但是速度欠佳,如果商业运用还会有专利费。
    二进制描述算子速度更快,能够达到实时性,准确率只是稍微降低了一点点,所以更有运用前景。
    在这里插入图片描述
    与HOG的主要区别是采用周边像素的强度值,而不是梯度,所以计算、匹配起来更快。关于具体算法研究,建议分别去查相关文献,这里只是提一下有个概念。在GitHub:SFND_2D_Feature_Tracking 中讲解了如何应用,以及它们它们的性能对比。
    Currently, the most popular binary descriptors are BRIEF, BRISK, ORB, FREAK and KAZE (all available in the OpenCV library).

    三、关键点的匹配

    为了实现目标追踪,首先提取关键点,然后对关键点进行描述,然后就需要对帧与帧之间的关键点进行匹配了。
    在这里插入图片描述

    差别计算

    匹配的原则是什么了,那就是计算关键点描述子之间的差别,两个关键点描述子之间差别越小,匹配越佳。前面讲的描述子结果为一定长度的vector,这里的差别计算就是对描述子vector逐一元素计算差值,然后累和。主要有以下三种方法,SAD、SSD、 HD(主要用于二进制描述算子)。
    在这里插入图片描述

    匹配方法

    • BFMatcher(Brute Force Matching ),强力匹配。比如第一张图片有M个关键点,第二张图片有N个关键点,强力匹配的思想就是拿第一张图片上的一个点与第二张上的所有关键点进行差别计算,差别最小的关键点则为匹配点。所以要匹配MxN次,所以当关键点数目比较多的时候速度就比较慢了。
    • FLANN(fast library for approximate nearest neighbors)采用KD-tree的高效数据存储结构,来寻找最小距离匹配点,搜素次数大大减少。

    为了剔除不良匹配,往往会设置匹配阈值T,将大于此阈值的匹配点剔除掉。

    匹配点选择

    1. cross check matching:为了减少错误匹配对, cross check matching采用双向匹配的方式,图片1匹配图片2,找到最佳匹配对;然后反过来在匹配一次。保留两次匹配中最佳匹配不变的那些匹配,最为最终匹配对。这种方式虽然增加了时间,但是大大提高了匹配效果。
    2. nearest neighbor distance ratio:主要的思想,不直接设置阈值T来过滤匹配,源图片上每个关键点,都会在目标图片上找到两个差别最小的匹配点,然后计算最佳、次佳之间的比值,如果比值超过了阈值(往往取0.8)则选择最佳匹配为匹配结果;否则则剔除此次匹配。

    算法运用

    算法的应用,详见github,SFND_2D_Feature_Tracking,还对各个算法的性能对比进行了比较。

    文章说明:

    Udacity 传感器融合课程笔记

    展开全文
  • 无人驾驶的多传感器融合技术

    千次阅读 2019-07-13 17:07:06
    “自动泊车、公路巡航控制和自动紧急制动等自动驾驶...只有把多个传感器信息融合起来,才是实现自动驾驶的关键。” 现在路面上的很多汽车,甚至是展厅内的很多新车,内部都配备有基于摄像头、雷达、超声波或LIDAR...
  • 无人驾驶传感器融合系列(三)——真实激光雷达点云数据流的处理 本章摘要:在前两章中,讲解了激光雷达点云的分割、聚类基础原理以及实现。这一章主要介绍真实点云情况下的一些预处理,比如点云的导入、过滤、...
  • 无人驾驶传感器融合技术 多传感器融合 多传感器融合要求: 1 )硬件层面:数量要足够,也就是不同种类的传感器都要配备,才能够保证信息获取充分且有冗余; 2 )软件层面:算法要足够优化,数据处理速度要够快,且...
  • 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW) 本章摘要:介绍调频连续波(FMCW),如何进行测速,测速范围,测速分辨率如何计算。 一、傅里叶变换 对时域信号进行傅里叶变换,不仅...
  • 无人驾驶传感器融合系列(一)——激光雷达点云的分割原理及实现 本章摘要:激光雷达扫描得到的点云含有大部分地面点,这对后续障碍物点云的分类、识别和跟踪带来麻烦,所以需要将其分割掉。本章主要讲解点云的...
  • 传感器融合标定算法,另外还包含了自动驾驶学习资料 涵盖感知,规划和控制,ADAS,传感器; 1. apollo相关的技术教程和文档; 2.adas(高级辅助驾驶)算法设计(例如AEB,ACC,LKA等) 3.自动驾驶鼻祖mobileye的论文和...
  • 无人驾驶传感器融合系列(六)——毫米波雷达方位角估计(77GHz FMCW) 本章摘要:本章主要讲解毫米波雷达如何估计障碍物的方位角,方位角的分辨率计算,方位角可估算范围。 一、方位角估计基础 根据上一...
  • 本章摘要:前几章讲了单独相机实现目标追踪,这一章讲解如何实现相机和激光雷达数据融合。整体思路是这样的,1、先是坐标对齐,将雷达坐标转换到相机坐标。2、然后将激光点往像平面投影,得到投影到像平面的点云。3...
  • 无人驾驶传感器融合系列(四)——毫米波雷达测距原理(77GHz FMCW) 本章摘要:介绍什么是调频连续波(FMCW),它是如何进行测距的,测距分辨率分析,测距范围分析。 调频连续波测距的 基本原理 : 1、...
  • 无人驾驶传感器融合系列(二)——激光雷达点云的聚类原理及实现 本章摘要:在上一章,我们采用RANSAC算法分割出了地面点云,非地面点云。我们通常会对非地面点云进行进一步的分割,也就是对地面以上的障碍物的...
  • 首先,本文介绍了 KITTI 数据集中涉及传感器融合算法的点云数据以及检测结果的评判 标准,并通过梳理点云数据无序性、稀疏性以及信息量有限的特性,提出点云数据鸟瞰化方案,融合点云数据高度、密度、强度信息,将其...
  • 本文的多传感器融合是建立在读懂《Quaternionkinematicsfortheerror-stateKalman?lter》基础上的,是一种相机和IMU融合的理论,里面讲解了IMU的误差状态运动方程构建。误差状态四元数,是有开源的程序的,但是它是...
  • 无人驾驶环境感知设备中,激光雷达和摄像头分别有各自的优缺点。 摄像头的优点是成本低廉,用摄像头做算法开发的人员也比较多,技术相对比较成熟。摄像头的劣势,第一,获取准确三维信息非常难(单目摄像头几乎...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,806
精华内容 1,922
关键字:

无人驾驶传感器融合