3

我正在做一个需要使用 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(扩展焦点)。可以有多个 FoE 候选人。并且使用 FoE,可以得出 TTC(碰撞时间)。后面的部分我不是很清楚。但是,到目前为止我是对的吗?OpenCV 是否实现 FoE 和/或 TTC?

4

1 回答 1

0

1

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

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

使用光流检测障碍物

不知道你有没有读过。它显示了如何估计每个角度的接触时间。

2

这向我展示了一个在屏幕上只有彩色水平线的图像,与我的原始测试图像没有任何相似之处。

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

4

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

文档中:

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

所以你可以通过Mat一些较旧的函数仍然只 期望Mat.

于 2012-07-27T23:36:56.057 回答