【问题标题】:Collision Avoidance using OpenCV on iPad在 iPad 上使用 OpenCV 避免碰撞
【发布时间】:2012-07-18 05:24:59
【问题描述】:

我正在做一个需要使用 OpenCV 实现碰撞避免的项目。这要在 iOS 上完成(iOS 5 及更高版本即可)。

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

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

到目前为止我做了什么:

  • 查看了 OpenCV 并在网上阅读了有关它的信息。使用 Lukas-Kanade Pyramid 方法实现碰撞避免。对吗?
  • 以这个项目为起点: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 传递给 prevImage 和 nextImage 的 calcOpticalFlowPyrLK()?

提前致谢:)

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

更新 看来光流是用来计算FoE(Focus of Expansion)的。可以有多个 FoE 候选人。并且使用 FoE,可以得出 TTC(碰撞时间)。后面的部分我不是很清楚。但是,到目前为止我是对的吗? OpenCV 是否实现 FoE 和/或 TTC?

【问题讨论】:

  • linkedin.com/groups/… 可能会有所帮助。阅读问题的 cmets。尽管他们没有给出明确的答案,但他们确实给出了一个模糊的想法。一切顺利。 :)

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


【解决方案1】:

1

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

我从来没有使用过光流,但是第一个 google 请求给了我这篇论文:

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 传递给 prevImage 和 nextImage 的 calcOpticalFlowPyrLK()?

来自documentation

这是将只读输入数组传递给 OpenCV 函数的代理类。 …… _InputArray 是可以从 MatMat_<T>Matx<T, m, n>std::vector<T>std::vector<std::vector<T> >std::vector<Mat> 构造的类。它也可以由矩阵表达式构造。

所以你可以通过Mat。一些较旧的函数仍然只需要 Mat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多