在iPad上使用OpenCV避免碰撞
我正在开发一个项目,我需要使用OpenCV实现避免碰撞。 这是要在iOS上完成的(iOS 5和更高版本会这样做)。
项目目标:想法是在汽车的仪表板上安装iPad并启动应用程序。 应用程序应从相机中抓取框架并处理这些框架,以检测汽车是否将与任何障碍物碰撞。
我是任何图像处理的新手,因此我在这个项目中陷入概念层面。
到目前为止我所做的:
使用这个项目作为一个起点: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;
}
除了上面提到的四点之外,我已经阅读了更多关于这个话题的内容,但仍然不能把所有的部分放在一起。
这是我的问题(请记住我是这个新手)
如何使用光流来检测即将发生的碰撞? 通过这个我的意思是,假设我能够从函数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
是一个可以从Mat
, Mat_<T>
, Matx<T, m, n>
, std::vector<T>
, std::vector<std::vector<T> >
构造的类或std::vector<Mat>
。 它也可以用矩阵表达式构造。
所以你可以通过Mat
。 一些较旧的功能仍然只有Mat
。
上一篇: Collision Avoidance using OpenCV on iPad
下一篇: Fast, very lightweight algorithm for camera motion detection?