检测OpenCV中的对象并进行实时比较

时间:2012-12-17 14:44:30

标签: image-processing opencv computer-vision

我们正在制造一个自动机器人(在大学活动中)遵循某些标志和方向并经过有向路线。机器人将安装在头部的摄像头。它将遵循前面道路上的标志或墙壁,并据此作出决定。标志将是绿色箭头(对于GO信号),或RED T作为停止的标志。机器人将实时扫描这些符号并执行必要的操作。这些标志可以直接在前面的墙上或在前面的路径上绘制。

我已经尝试过寻找必要的图像变换算法或方法,但我们在这个领域已经很新了。我寻求你帮助解决这个问题的方法以及可能对我们有帮助的必要代码(假设我们是初学者)。

我已经研究了以下线程,但我很困惑: - OpenCV Object Detection - Center Point - How to recognize rectangles in this image? - http://www.chrisevansdev.com/computer-vision-opensurf.html(我无法使用它)

为该事件提供的一个提示是,我们可以将箭头建模为矩形和三角形放在一起,以确定三角形的中心是否位于该矩形的右侧(这意味着向右)或其他方式。对于T来说同样如此。

谢谢! :)

2 个答案:

答案 0 :(得分:8)

如果先前已知过这些标志,您可以使用“通过特征检测识别对象”的方法。

您的想法是,您有一张标志图片(箭头或T),然后执行以下培训步骤,离线

1 - 特征检测(使用,SURF,快速,......)

2 - 使用SIFT,FREAK等提取描述符(来自功能)

然后是实时部分。对于每个帧,您必须执行特征检测和描述符提取,但是您需要与训练图像进行匹配以查看您获得的对象。一个可以实时工作的例子:

cv::FAST detector;
cv::FREAK descriptor;
BFMatcher matcher = BFMatcher(NORM_HAMMING,false);

detector.detect(frame,keypoints_frame);
descriptor.compute(frame, keypoints_frame,descriptors_frame);
matcher.match(descriptors_trainning, descriptors_frame);

这将是匹配的第一种方法,然后您需要优化和删除异常值。一些技术

  • 比率测试

  • 交叉检查

  • RANSAC +单应性

这里有一个完整的example

答案 1 :(得分:3)

我假设您可以在活动前获得标志: 拿出箭头标志,从他那里得到“筛选描述符”并将它们存储在你的机器人中。

然后在机器人获取的每个帧中寻找符号的颜色,当您看到类似于符号的东西时,采用筛选描述符并尝试在存储的描述符和新描述符之间进行注册。如果您成功,请尝试计算原始存储符号与您在图像上找到的符号之间的旋转和平移矩阵。

要阅读有关筛选的信息,我会在本网站上推荐: http://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/ 在您了解了筛选的基础知识之后,我建议您下载一些实现而不是自己实现它,这是非常繁琐的工作并且有很多陷阱

顺便说一句 虽然sift是“Scale Invariant Feature Transform”,但我很确定即使你也有“透视变换”,它也适用于你的情况。

希望有所帮助

相关问题