在iPad上使用OpenCV避免碰撞

我正在开发一个项目,我需要使用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的盒子。 我看了这个网页上的解释,似乎达到了同形异义矩阵。 这个结果如何用于避免碰撞?
  • 除了上面提到的四点之外,我已经阅读了更多关于这个话题的内容,但仍然不能把所有的部分放在一起。

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

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

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

  • 在上面的示例代码中,我将lastCorners转换为UIImage,并在屏幕上显示该图像。 这给我看了一个只有屏幕上有彩色水平线的图像,与我原来的测试图像没有任何差别。 这是该功能的正确输出吗?

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

  • 提前致谢 :)

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

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


    1

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

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

    使用光流的障碍物检测

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

    2

    这给我看了一个只有屏幕上有彩色水平线的图像,与我原来的测试图像没有任何差别。

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

    4

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

    从文档:

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

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

    链接地址: http://www.djcxy.com/p/61067.html

    上一篇: Collision Avoidance using OpenCV on iPad

    下一篇: Fast, very lightweight algorithm for camera motion detection?