我正在尝试从相机实现对象跟踪(只有一个摄像头,没有Z信息)。相机具有720 * 1280分辨率,但我通常将其重新缩放至360 * 640以便更快地处理。
这种跟踪是从机器人相机完成的,我想要一个尽可能健壮的系统。
我将列出我到目前为止所做的事情以及结果是什么。
// 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)
然后我检查了
坚固性> 0.85和纵横比在0.85和1.15之间
但结果仍然没有我想象的那么强劲,特别是尺寸。如果有几个正方形,则找不到所需的正方形。
所以,现在我需要一些建议,我可以使用该对象的其他 功能 来改进跟踪以及如何使用?正如我上面多次提到的,其中一个主要问题是 size 。而且我知道物体的大小。但是,我不知道如何使用它,因为我不知道物体与相机的距离,这就是为什么我不知道如何用像素表示来表示它的大小,以便我可以消除任何其他不属于该范围的斑点。
更新
在第三步中,我描述了如何检测具有特定颜色的方块。以下是我得到的例子。
我将此HSV范围用于红色:
标量(250,129,0),标量(255,255,255),参与OpenCV的inRange函数
HMIN = 250,HMAX = 255; SMIN = 129,SMAX = 255; VMIN = 0,VMAX = 255; (希望看到你关于调整这些值的建议)
所以,在这张图片中你可以看到处理过程;高斯模糊(5 * 5), 形态闭合两次(5 * 5)。带有“结果”标签的图像显示被跟踪的对象(请查看绿色方块)。
在第二帧上,您可以看到它无法检测到“红色方块”。这两张照片之间唯一的主要区别是我弯下了笔记本电脑的盖子(如果你不注意的话,请仔细看看)。我认为这是因为 照明 ,这会导致阈值处理产生不理想的结果。
我能想到的唯一方法是对图像进行两次单独的处理。首先,根据我上面的颜色进行阈值处理。然后,如果我发现对象移动到下一帧。如果不使用this opencv's find squares方法。
然而,这种方法将涉及对图像进行过多处理。
答案 0 :(得分:0)
如果您有一个模板是目标对象图像的图像,则尝试使用与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
答案 1 :(得分:0)
正如您在要求中提到的那样,您只需要跟踪一个红色的平坦区域。因此,您已经有两个用于跟踪目的的特征:
这是一个算法:
您可以尝试的其他方法是为您的目的调整Harris角落探测器:
Harris Corner Detector
在Harris Corner检测器中,通过使用2×2矩阵的特征值来确定分数。如果两个特征值都很小,则意味着它是一个平坦的区域。它在OpenCV教程中得到了很好的解释。然后,您可以使用颜色信息细化标识的平坦区域。它应该合理地处理透视变换。
答案 2 :(得分:0)
如果你重新考虑你的第二点,找到带圆圈的物体,你实际上应该寻找椭圆,因为它与物体的角度。为了检测图片中的省略号,我复制粘贴了Samarth Brahmbhatt的“Practical OpenCV”一书中的代码(你应该在Google上找到它)。所用算法的理论是这篇文章:http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=765658