在iPad上使用OpenCV避免碰撞

时间:2012-07-19 04:15:12

标签: ios image-processing opencv computer-vision opticalflow

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

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

我是任何类型图像处理的新手,因此我在这个项目中陷入了概念层面。

到目前为止我做了什么:

  • 看看OpenCV并在网上阅读。使用Lukas-Kanade金字塔方法实现碰撞避免。这是对的吗?
  • 使用此项目作为起点: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 :: Mat被传递给Canny边缘检测方法。我是否将cv :: Mat传递给calcIpticalFlowPyrLK()以获取prevImage和nextImage?

  5. 提前致谢:)

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

    更新看起来光流用于计算FoE(扩展焦点)。可以有多个FoE候选人。并使用FoE,TTC(碰撞时间)到达。我对后半部分不太清楚。但是,到目前为止我是对的? OpenCV是否实施了FoE和/或TTC?

1 个答案:

答案 0 :(得分:0)

1

  

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

我从未使用光流,但第一个谷歌请求给了我这篇论文:

Obstacle Detection using Optical Flow

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

2

  

这显示我的图像在屏幕上只有彩色水平线,与我原来的测试图像没什么相似。

我认为goodFeaturesToTrack的输出不是图像,而是一个点表。例如,请参阅how they are used in a Python example(在旧版本的OpenCV中)。同样可能适用于calcOpticalFlowPyrLK的输出。先查看调试中的内容。我通常使用Python + OpenCV来理解不熟悉的OpenCV函数的输出。

4

  

我对理解此项目中使用的数据类型有点困难。 InputArray,OutputArray等是OpenCV API接受的类型。然而在processFrame函数中,cv :: Mat被传递给Canny边缘检测方法。我是否将cv :: Mat传递给calcIpticalFlowPyrLK()以获取prevImage和nextImage?

来自documentation

  

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

所以你可以通过Mat。一些较旧的功能仍然只需 Mat