使用OpenCV的iPad上的防撞(Collision Avoidance using OpenCV

2019-07-30 11:51发布

我工作的一个项目,我需要使用OpenCV的实现防撞。 这是要在iOS上进行(的iOS 5及以上的都行)。

项目目标:我们的想法是在汽车的仪表盘安装一台iPad,并启动应用程序。 应用程序应该从相机帧抓取和处理这些汽车是否会与任何障碍物碰撞检测。

我是一个新手,任何类型的图像处理,因此我陷入在这个项目概念性的水平。

我到目前为止已经完成:

  • 看了一眼OpenCV的和在网络上读到它。 防撞使用卢卡斯 - 奏金字塔方法来实现。 这是正确的吗?
  • 使用此项目作为起点: http://aptogo.co.uk/2011/09/opencv-framework-for-ios/它成功运行在我的iPad和捕捉功能的工作原理,以及,这意味着相机捕捉良好集成。 我改变了processFrame执行尝试光流,而不是Canny边缘检测。 下面是函数(但不完全)。

      -(void)processFrame { int currSliderVal = self.lowSlider.value; if(_prevSliderVal == currSliderVal) return; cv::Mat grayFramePrev, grayFrameLast, prevCorners, lastCorners, status, err; // Convert captured frame to grayscale for _prevFrame cv::cvtColor(_prevFrame, grayFramePrev, cv::COLOR_RGB2GRAY); cv::goodFeaturesToTrack(grayFramePrev, prevCorners, 500, 0.01, 10); // Convert captured frame to grayscale for _lastFrame cv::cvtColor(_lastFrame, grayFrameLast, cv::COLOR_RGB2GRAY); cv::goodFeaturesToTrack(grayFrameLast, lastCorners, 500, 0.01, 10); cv::calcOpticalFlowPyrLK(_prevFrame, _lastFrame, prevCorners, lastCorners, status, err); self.imageView.image = [UIImage imageWithCVMat:lastCorners]; _prevSliderVal = self.lowSlider.value; } 
  • 阅读关于光流以及如何使用它(概念)来检测即将发生的碰撞。 总结:如果一个对象在尺寸上生长,但在接近框架的任何边缘移动,那么它不是一个碰撞路径。 如果一个对象的大小增长,但不是对任何边缘移动,那么它是碰撞路径上。 这是正确的吗?
  • 该项目(http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optical_flow)似乎做的正是我想达到的目标。 但我不明白它是如何通过阅读代码这样做。 因为我没有一台Linux机器,我不能运行它。 我看了这个网页上的解释,它似乎在单应矩阵到达。 在防撞如何使用这种结果?

除了以上提到的四点,我看了多了很多关于这个话题,但仍然不能把所有的拼在一起。

这里是我的问题(请记住我在这个新手)

  1. 如何使用光流来检测即将发生的碰撞? 我的意思是,假如我能够得到的功能CV)正确的结果:: calcOpticalFlowPyrLK(,我怎么把它向前从那里来检测即将发生的碰撞与框架上的任何对象? 是否有可能从我们最有可能与之发生碰撞的物体衡量距离是多少?

  2. 是否有一个实现这样或那样的,我可以看看任何类似功能的示例工作项目。 我看了一眼在eosgarden.com项目,但无功能似乎它来实现。

  3. 在上面的示例代码,我转换lastCorners到的UIImage,我在屏幕上显示该图像。 这表明我只带有彩色屏幕上的水平线,没有类似我原始的测试图像的图像。 这是该功能的正确的输出?

  4. 我在理解这个项目中使用的数据类型有点困难。 InputArray,OutputArray等都是通过OpenCV的API的接受类型。 然而,在processFrame功能,CV ::毡被传递到Canny边缘检测方法。 难道我通过简历::垫calcOpticalFlowPyrLK()用于PREVIMAGE和NEXTIMAGE?

提前致谢 :)

更新:发现这个样本项目(http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone)。 它没有就我的MAC,但我觉得从这个我有光流工作代码。 但我仍想不通,我怎么可以检测从跟踪这些点阻碍碰撞。 如果任何你甚至可以回答QTS。 1号,这将是很大的帮助。

更新它看起来像光流用于计算地球之友(膨胀的聚焦)。 可以有多个候选地球之友。 并使用地球之友,TTC(碰撞时间)在抵达。 我不是在后期很清楚。 但是,我是正确的那么远? 是否OpenCV的实现地球之友和/或TTC?

Answer 1:

1

如何使用光流来检测即将发生的碰撞?

我从来没有使用光流,而是先要求谷歌给了我这个文件:

障碍物检测使用光流

我不知道你是否已经阅读。 它显示了如何估计时间各个角度接触。

2

这表明我只带有彩色屏幕上的水平线,没有类似我原始的测试图像的图像。

我想goodFeaturesToTrack的该输出不是一个图像,而是点的表格。 见,例如, 它们是如何在Python示例中使用 (在旧版本的OpenCV)。 同样可能适用于calcOpticalFlowPyrLK的输出。 是什么在调试的存在第一。 我通常使用Python + OpenCV的理解什么是不熟悉的OpenCV函数的输出。

4

我在理解这个项目中使用的数据类型有点困难。 InputArray,OutputArray等都是通过OpenCV的API的接受类型。 然而,在processFrame功能,CV ::毡被传递到Canny边缘检测方法。 难道我通过简历::垫calcOpticalFlowPyrLK()用于PREVIMAGE和NEXTIMAGE?

从文档 :

这是用于使只读输入数组到OpenCV函数代理类。 .... _InputArray是可以从构成一类MatMat_<T> Matx<T, m, n> std::vector<T> std::vector<std::vector<T> >std::vector<Mat> 。 它也可以从一个矩阵表达式构成。

所以,你可以只通过Mat 。 一些旧的功能仍然希望 Mat



文章来源: Collision Avoidance using OpenCV on iPad