我正在尝试从相机(只有一个相机,没有 Z 信息)实现对象跟踪。相机分辨率为 720*1280,但我通常将其调整为 360*640 以加快处理速度。
这种跟踪是通过机器人摄像头完成的,我想要一个尽可能稳健的系统。
我将列出到目前为止我做了什么以及结果如何。
- 我尝试进行颜色跟踪,我会将图像转换为 hsv 颜色空间、进行阈值处理、一些形态变换,然后找到面积最大的对象。这种方法对物体进行了公平的跟踪,除非没有其他物体具有相同的颜色。当我在寻找最大值时,如果有任何其他物体比我需要的更大,机器人就会走向更大的物体
- 然后,我决定跟踪特定颜色的圆圈对象。但是不同角度下很难找到
- 然后,我决定跟踪特定颜色的方形物体。我用过这个
// Approximate contour with accuracy proportional // to the contour perimeter cv::approxPolyDP( cv::Mat(contours[i]), approx, cv::arcLength(cv::Mat(contours[i]), true) * 0.02, true );
然后我检查了这个条件
if (approx.size() >= 4 && approx.size() <= 6)
然后我检查了
solidity > 0.85 and aspect ratio between 0.85 and 1.15
但结果仍然不如我预期的那么稳健,尤其是尺寸。如果有多个方 block ,它将找不到所需的方 block 。
那么,现在我需要一些关于我可以使用对象的哪些其他功能来改进跟踪的建议,以及如何使用?正如我在上面多次提到的,主要问题之一是大小。我知道物体的大小。但是,我不确定如何使用它,因为我不知道物体与相机的距离,这就是为什么我不确定如何以像素表示来表示它的大小,以便我可以消除任何其他不属于该范围的 Blob 。
更新
在第三步中,我描述了如何检测具有特定颜色的方 block 。以下是我得到的示例。
我将这个 HSV 范围用于红色:
Scalar(250, 129, 0), Scalar(255, 255, 255), params to OpenCV's inRange function
HMIN = 250, HMAX = 255; SMIN = 129, SMAX = 255; VMIN = 0, VMAX = 255; (Would like to see your suggestions on tweaking this values as well)
因此,在这张图片中您可以看到处理过程;高斯模糊(5*5), 形态闭合两次 (5*5)。并且带有标签“result”的图像显示了被跟踪的对象(请看绿色方 block )。
在第二帧上,您可以看到它无法检测到“红色方 block ”。这两张照片之间唯一的主要区别是我弯下了笔记本电脑的盖子(如果你没有注意到,请仔细看)。我想这是由于照明 造成的,这会导致阈值处理产生不想要的结果。
我能想到的唯一方法是对图像进行两个单独的处理。首先,像我在上面所做的那样,根据颜色进行阈值处理。然后,如果我找到要移动到下一帧的对象。如果不使用 this opencv's find squares方法。
但是,此方法将涉及对图像进行过多处理。
最佳答案
如果您有一个模板是目标对象图像的图像,您可以尝试使用 SIFT 或 SURF 进行特征匹配。 https://www.youtube.com/watch?v=ZXn69V-1kEM
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_surf_intro/py_surf_intro.html
注1:你可以在灰度中使用特征匹配,这样可以缩短你的处理时间
注意 2:您可以尝试替代回归方法,例如人工神经网络而不是 RANSAC
关于opencv - 要跟踪的好功能?增强现实无人机 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672762/