在iPad上使用OpenCV避免碰撞

我正在开发一个项目,我需要使用OpenCV实现避免碰撞。 这是要在iOS上完成(iOS 5和以上将做)。

项目目标:这个想法是在汽车的仪表板上安装一个iPad并启动应用程序。 应用程序应该抓取相机的帧,并处理这些帧,以检测车是否将与任何障碍物碰撞。

我是任何forms的image processing新手,因此我在这个项目中陷入概念层面。

到目前为止我所做的是:

  • 看看OpenCV,并在网上阅读。 避免碰撞使用Lukas-Kanade金字塔法进行实施。 这是正确的吗?
  • 使用这个项目作为一个起点: http : //aptogo.co.uk/2011/09/opencv-framework-for-ios/它成功地运行在我的iPad和捕捉function的作品,以及意味着相机捕捉是很好的,集成。 我改变了processFrame实现来尝试光stream而不是Canny边缘检测。 这是function(还不完整)。

    -(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; } 
  • 阅读有关光学stream程以及如何使用(概念上)来检测即将发生的碰撞。 总结:如果一个物体的尺寸越来越大,但是朝着框架的任何边缘移动,那么它就不是碰撞path。 如果一个物体的尺寸在增大,但是没有朝着任何边缘移动,那么它就处于碰撞path上。 这是正确的吗?
  • 这个项目(http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optical_flow)似乎正在做我想实现的。 但是,我不明白这是如何通过阅读代码。 我不能运行它,因为我没有一个Linux的盒子。 我看了这个网页上的解释,似乎达到了一个同形单词matrix。 这个结果如何用于避免碰撞?

除了上面提到的四点之外,我已经读了很多关于这个话题的内容,但是还是不能把所有的东西放在一起。

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

  1. 如何使用光stream来检测即将发生的碰撞? 通过这个我的意思是,假设我能够从函数cv :: calcOpticalFlowPyrLK()得到正确的结果,我怎么从那里把它转发,以检测即将发生的与框架上的任何对象的碰撞? 是否可以测量距离我们最有可能碰撞的物体的距离?

  2. 是否有一个示例工作项目,实现这个或任何类似的function,我可以看看。 我看了一下eosgarden.com上的这个项目,但是没有看到其中的function。

  3. 在上面的示例代码中,我将lastCorners转换为UIImage,并在屏幕上显示该图像。 这显示了一个图像,只有在屏幕上有彩色水平线,没有什么类似于我原来的testing图像。 这是这个函数的正确输出吗?

  4. 我在理解这个项目中使用的数据types时有点困难。 InputArray,OutputArray等是OpenCV API接受的types。 然而在processFrame函数中,cv :: Mat被传递给Canny边缘检测方法。 我为prevImage和nextImage传递cv :: Mat到calcOpticalFlowPyrLK()吗?

提前致谢 :)

更新:find这个示例项目(http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone)。 它不能在我的Mac上编译,但我想从这里我将有一个光stream量的工作代码。 但是我仍然无法弄清楚,我怎么能够通过跟踪这些点来检测阻碍碰撞。 如果你们任何一个人甚至可以回答QTS。 第一,这将是很大的帮助。

更新它看起来像光stream量是用来计算FoE(膨胀的焦点)。 可以有多个FoE候选人。 使用FoE,TTC(碰撞时间)到达。 后半部分我不太清楚。 但是,我到目前为止是正确的? OpenCV是否实施FoE和/或TTC?

1

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

我从来没有使用光stream,但第一个谷歌要求给了我这篇文章:

使用光stream的障碍物检测

我不知道你是否已经读过。 它显示了如何估计在每个angular度接触的时间。

2

这显示了一个图像,只有在屏幕上有彩色水平线,没有什么类似于我原来的testing图像。

我想,goodFeaturesToTrack的输出不是一个图像,而是一个点的表格。 例如,请参阅如何在Python示例中使用它们 (在旧版本的OpenCV中)。 同样可能适用于calcOpticalFlowPyrLK的输出。 先看看debugging中有什么。 我通常使用Python + OpenCV来理解不熟悉的OpenCV函数的输出。

4

我在理解这个项目中使用的数据types时有点困难。 InputArray,OutputArray等是OpenCV API接受的types。 然而在processFrame函数中,cv :: Mat被传递给Canny边缘检测方法。 我为prevImage和nextImage传递cv :: Mat到calcOpticalFlowPyrLK()吗?

从文档 :

这是将只读input数组传递给OpenCV函数的代理类。 …. _InputArray是一个可以从MatMat_<T>Matx<T, m, n>std::vector<T>std::vector<std::vector<T> >构造的类或者std::vector<Mat> 。 它也可以用matrixexpression式来构造。

所以你可以通过Mat 。 一些较旧的function仍然只能期待Mat

Interesting Posts