我正在开展一个项目,需要使用 OpenCV 实现碰撞避免。这是在 iOS 上完成的(iOS 5 及以上版本即可)。
项目目标:
这个想法是将 iPad 安装在汽车仪表板上并启动应用程序。应用程序应该从相机中抓取帧并进行处理,以检测汽车是否会与任何障碍物发生碰撞。
我对任何类型的图像处理都是新手,因此我在这个项目中陷入了概念层面。
到目前为止我所做的:
- 看了一下 OpenCV 并在网上阅读了相关内容。使用 Lukas-Kanade 金字塔方法实现碰撞避免。这是正确的吗?
-
使用该项目作为起点:http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ 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 边缘检测方法。我是否将 cv::Mat 传递给 calcOpticalFlowPyrLK() 以获取 prevImage 和 nextImage?
提前致谢 :)
Update:找到了这个示例项目(http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone)。它无法在我的 Mac 上编译,但我想由此我将拥有一个光流的工作代码。但我仍然无法弄清楚,如何通过跟踪这些点来检测阻碍碰撞。如果你们中有人能回答Qts。第一,这会有很大的帮助。
Update看起来光流是用来计算 FoE(扩展焦点)的。可以有多个 FoE 候选人。并使用 FoE,得出 TTC(碰撞时间)。后半部分我不是很清楚。但是,到目前为止我是正确的吗?OpenCV 是否实现 FoE 和/或 TTC?
1
如何使用光流来检测即将发生的碰撞?
我从未使用过光流,但第一个谷歌请求给了我这篇论文:
使用光流进行障碍物检测 http://www.araa.asn.au/acra/acra2005/papers/low.pdf
我不知道你是否已经读过。它展示了如何估计每个角度的接触时间。
2
这向我显示了一张图像,屏幕上只有彩色水平线,与我的原始测试图像没有任何相似之处。
我认为 goodFeaturesToTrack 的输出不是图像,而是点表。例如,参见如何在 Python 示例中使用它们 http://opencv.willowgarage.com/documentation/python/cookbook.html#using-goodfeaturestotrack(在旧版本的 OpenCV 中)。这可能同样适用于 calcOpticalFlowPyrLK 的输出。先看看debug里有什么。我通常使用 Python + OpenCV 来理解不熟悉的 OpenCV 函数的输出是什么。
4
我在理解这个项目中使用的数据类型时遇到了一些困难。 InputArray、OutputArray 等是 OpenCV API 接受的类型。然而在 processFrame 函数中,cv::Mat 被传递给 Canny 边缘检测方法。我是否将 cv::Mat 传递给 calcOpticalFlowPyrLK() 以获取 prevImage 和 nextImage?
来自文档 http://docs.opencv.org/modules/core/doc/basic_structures.html#inputarray:
这是用于将只读输入数组传递到 OpenCV 函数的代理类。
...._InputArray
是一个可以构造的类Mat
, Mat_<T>
, Matx<T, m, n>
, std::vector<T>
, std::vector<std::vector<T> >
or std::vector<Mat>
。它也可以从矩阵表达式构造。
所以你可以通过Mat
。一些较旧的功能仍然需要only Mat
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)