Camera系列文章

传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等),融合激光点云和图像进行TTC估计。

系列文章目录
1. 摄像头基础及校准
2. Lidar TTC估计
3. Camera TTC估计

文章目录

  • Camera系列文章
  • 前言
  • 一、Camera TTC估计方法
  • 二、高度比估算方法
  • Camera TTC估计实例

前言

本章我们将介绍使用Camera估计与前车的TTC(Time To Collision)。首先我们将展示如何基于Camera连续帧中车辆尺寸变化计算TTC;然后我们使用神经网络标记车辆在图像中的位置信息(Bounding Box);由于用Bounding Box来计算TTC不是很准确,我们将讨论使用关键点检测(keypoint detection)来准确的估计TTC。

相比Lidar TTC估计,基于Camera估计TTC相对难一些:首先,Camera获取的是2D图像(舍弃Z轴距离信息);其次,Camera需要更可靠、更准确的识别车辆以提取相对速度信息。


一、Camera TTC估计方法

如上所述,单目摄像头无法测量距离信息。不像Lidar可以直接TOF法测量距离信息,Camera是被动元器件,依赖于环境光线遇物体反射进入Camera镜头。双面摄像头可以通过对比固定间距的两个摄像头获取的图像差异直接估计距离信息,但由于工艺要求高,尺寸较大,价格较高,计算量较大,目前已经基本退出ADAS应用市场中。

尽管如此,我们还是可以从单目摄像头中提取距离信息。我们还是以CVM(Constant Velocity Model)固定相对速度运动模型来考虑如何无需测速即可计算出TTC。

如上图针孔摄像头几何模型中可推导出几何公式(1),基于此公式我们可以根据连续帧间目标物相对高度尺寸变化推算出TTC:

二、高度比估算方法

下图中,通过神经网络获取车辆在图像中位置,并用Bounding Box框出车辆位置,包括宽度和高度信息。理论上来说可以用来计算车辆在前后两帧图像中的高度比,但通过对比可以发现,Bounding Box无法准确反映车辆尺寸信息,会出现比较明显的错误估计。

在工程中,依赖于单一测量或特征通常不够可靠,对于安全相关的产品尤其如此,因此,我们需要进一步提取车辆特征,即基于纹理特征点(Texture Keypoints)来估计尺寸变化。
如果我们可定位连续帧上车辆关键点的信息,我们就可以通过这些关键点间的距离信息估计Camera TTC估计公式里的高度比。如下图所示,(a)中我们检出7个关键点(keypoints);(b)中我们通过匹配连续帧中的关键点获取4个关键点。这样我们就可以使用距离比的中值或均值替代高度比。

高速场景下前车中提取的关键点叠加在2D图像上进行关键点相对距离估算图示如下。

Camera TTC估计实例

如上讨论可知,使用Camera TTC估计主要需要以下四步:
1.通过神经网络等方法框出前车在图像中的位置(Bounding BOX);
2.提取图像中一系列的关键点(Keypoints);
3.匹配连续帧中的关键点,建立连接;
4.根据一系列关键点距离的变化估计TTC。

步骤1~3包括较多的图像识别,深度学习内容,在本章暂不讨论,以下实例主要介绍如何根据匹配的关键点估计TTC。

以下实例中,匹配的关键点打包至OpenCV数据结构cv::DMatch中,为提取连续帧中匹配好的关键点,需要使用queryIdxtrainIdx。为获取稳定的高度比,使用medianDistRatio替代meanDistRatio

// Compute time-to-collision (TTC) based on keypoint correspondences in successive images
void computeTTCCamera(std::vector<cv::KeyPoint> &kptsPrev, std::vector<cv::KeyPoint> &kptsCurr,std::vector<cv::DMatch> kptMatches, double frameRate, double &TTC)
{// compute distance ratios between all matched keypointsvector<double> distRatios; // stores the distance ratios for all keypoints between curr. and prev. framefor (auto it1 = kptMatches.begin(); it1 != kptMatches.end() - 1; ++it1){ // outer kpt. loop// get current keypoint and its matched partner in the prev. framecv::KeyPoint kpOuterCurr = kptsCurr.at(it1->trainIdx);cv::KeyPoint kpOuterPrev = kptsPrev.at(it1->queryIdx);for (auto it2 = kptMatches.begin() + 1; it2 != kptMatches.end(); ++it2){ // inner kpt.-loopdouble minDist = 100.0; // min. required distance// get next keypoint and its matched partner in the prev. framecv::KeyPoint kpInnerCurr = kptsCurr.at(it2->trainIdx);cv::KeyPoint kpInnerPrev = kptsPrev.at(it2->queryIdx);// compute distances and distance ratiosdouble distCurr = cv::norm(kpOuterCurr.pt - kpInnerCurr.pt);double distPrev = cv::norm(kpOuterPrev.pt - kpInnerPrev.pt);if (distPrev > std::numeric_limits<double>::epsilon() && distCurr >= minDist){ // avoid division by zerodouble distRatio = distCurr / distPrev;distRatios.push_back(distRatio);}} // eof inner loop over all matched kpts}     // eof outer loop over all matched kpts// only continue if list of distance ratios is not emptyif (distRatios.size() == 0){TTC = NAN;return;}// STUDENT TASK (replacement meanDistRatio with medianDistRatio)// compute camera-based TTC from distance ratios//meanDistRatio//double meanDistRatio = std::accumulate(distRatios.begin(), distRatios.end(), 0.0) / distRatios.size();std::sort(distRatios.begin(), distRatios.end());long medIndex = floor(distRatios.size() / 2.0);// compute median dist. ratio to remove outlier influencedouble medDistRatio = distRatios.size() % 2 == 0 ? (distRatios[medIndex - 1] + distRatios[medIndex]) / 2.0 : distRatios[medIndex]; dT = 1 / frameRate;TTC = -dT / (1 - medDistRatio);// EOF STUDENT TASK
}

Camera TTC估计相关推荐

  1. 基于Bounding Box的激光点云聚类

    Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...

  2. 常见特征检测算法介绍

    Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...

  3. 三维激光点云到二维图像的投影

    Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...

  4. OpenCV图像特征提取

    Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...

  5. 【计算机视觉】全景相机标定(MATLAB/opencv)

    全景相机标定 1Matlab工具箱 http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/links.html http://www-sop.i ...

  6. CVPR2021:百篇AR/VR关联性研究成果汇总

    作者丨刘卫华 映维网@知乎 来源丨https://zhuanlan.zhihu.com/p/388780582 编辑丨3D视觉工坊 1. SceneGraphFusion: Incremental 3 ...

  7. 单目图像深度估计 - 应用篇:Learning to be a Depth Camera

    目录 入门篇:图像深度估计相关总结 应用篇:Learning to be a Depth Camera 尺度篇:Make3D 迁移篇:Depth Extraction from Video Using ...

  8. 【camera】自动驾驶感知系统实现(车道线检测和拟合、目标检测与跟踪、道路可行驶区域分割、深度估计、图像视野到BEV空间映射、像平面到地平面映射)

    自动驾驶感知系统实现(车道线检测和拟合.目标检测与跟踪.道路可行驶区域分割.深度估计.图像视野到BEV空间映射.像平面到地平面映射) 项目下载地址:项目下载地址 推理引擎下载地址:推理引擎下载地址 支 ...

  9. 纯视觉3D目标检测新SOTA!STS:基于Camera的深度估计新方法

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[领域综述]获取自动驾驶全栈近80篇综述论文! 论文链接:https ...

最新文章

  1. Netty入门教程——认识Netty
  2. 看完微软大神写的求平均值代码,我意识到自己还是too young了
  3. 华为电话面试题java_华为java面试题(含电话面试)
  4. SQLSERVER常用函数汇总
  5. SpringBoot基础篇配置信息之配置刷新
  6. System进程(pid=4)占用80端口的解决方案
  7. 获得OnOK退出控制
  8. @Autowired 与@Resource的区别
  9. iPhone企业应用实例分析之三:程序框架分析
  10. 最新BIOS设置中英文对照表
  11. uni-app 使用蓝牙打印机ESC/POS指令基础方法
  12. CRM系统与呼叫中心系统对接
  13. 如何区分m的属性_测试属性#5 –区分
  14. LocalSend 电脑和手机互传软件教程解答手机端无法搜索到电脑的解决方案
  15. one 主格 复数 宾格_主格和宾格
  16. 查询计算机系教师开设的所有课程的课程号和课程名
  17. 1055 集体照 (25 分)(详解)
  18. 用自己的数据集训练C3D和tensorboard的使用
  19. PerfDog测试安卓模拟器初体验
  20. 搭建Redis服务器: 设置变量school,值为tarena 查看变量school的值

热门文章

  1. python的使用_python的使用
  2. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感
  3. eclipse新建Android项目
  4. mysql fulsh_MYSQL教程:MySQL用户帐号管理_MySQL
  5. git commit撤销_Git 实用操作:撤销 Commit 提交
  6. linux挂载ntfs分区报错,Linux下挂载NTFS分区和挂载分区的方法
  7. flask get 参数_Python web 用它5分钟以后,我放弃用了四年的 Flask
  8. docker 改host_所以到底该如何修改 docker 容器的端口映射!!!
  9. react native ios 上架
  10. 2018-2019-2 20165234 《网络对抗技术》 Exp5 MSF基础应用