gpt4 book ai didi

ios - 在 iPad 上使用 OpenCV 避免碰撞

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:55 42 4
gpt4 key购买 nike

我正在开展一个项目,我需要使用 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 box。我阅读了此网页上的解释,似乎得出了一个单应矩阵。这个结果如何用于避免碰撞?

除了上面提到的四点之外,我已经阅读了很多关于这个主题的内容,但仍然无法将所有部分放在一起。

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

  1. 光流如何用于检测即将发生的碰撞?我的意思是,假设我能够从函数 cv::calcOpticalFlowPyrLK() 获得正确的结果,我如何从那里向前推进以检测与框架上任何物体即将发生的碰撞?是否可以测量与我们最有可能碰撞的物体的距离?

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

  3. 在上面的示例代码中,我将 lastCorners 转换为 UIImage 并在屏幕上显示该图像。这向我展示了一张屏幕上只有彩色水平线的图像,与我的原始测试图像完全不同。这是该函数的正确输出吗?

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

提前致谢:)

更新:找到这个示例项目 (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?

最佳答案

1

HOW is optical flow used to detect impending collision?

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

Obstacle Detection using Optical Flow

不知道你有没有看过。它展示了如何估算各个角度的接触时间。

2

This shows me an image which only has colored horizontal lines on the screen, nothing similar to my original test image.

我假设 goodFeaturesToTrack 的输出不是图像,而是点表。参见,例如,how they are used in a Python example (在旧版本的 OpenCV 中)。这同样适用于 calcOpticalFlowPyrLK 的输出。先看看调试里有什么。我通常使用 Python + OpenCV 来了解不熟悉的 OpenCV 函数的输出。

4

I'm having a little difficulty understanding the datatypes used in this project. InputArray, OutputArray etc are the types accepted by OpenCV APIs. Yet in processFrame function, cv::Mat was being passed to Canny edge detection method. Do I pass cv::Mat to calcOpticalFlowPyrLK() for prevImage and nextImage?

来自documentation :

This is the proxy class for passing read-only input arrays into OpenCV functions. .... _InputArray is a class that can be constructed from Mat, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> > or std::vector<Mat>. It can also be constructed from a matrix expression.

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

关于ios - 在 iPad 上使用 OpenCV 避免碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553861/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com