情景:
我正在尝试跟踪两个不同颜色的物体。开始时,提示用户将第一个彩色对象(例如,可能是红色)保持在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序获取该部分帧(ROI)并分析其中的颜色,找到要跟踪的颜色。同样对于第二个对象也。然后像往常一样,在HSV颜色平面中使用cv.inRange
函数并跟踪对象。
做了什么:
我获取了要跟踪的对象的ROI,将其转换为HSV并检查了Hue直方图。我有两个案例如下:
(这里只有一个主要的中心峰值。但是在某些情况下,我得到两个这样的峰值,一个是一个更大的峰值,周围有一些像素簇,第二个峰值,小于第一个,但是具有小簇的显着大小我也没有它的样本图像。但它几乎看起来像下面(在油漆中创建))
问题:
How can I get best range of hue values from these histograms?
根据最佳范围我的意思是,ROI中大约80-90%的像素位于该范围内。
或者有没有比此更好的方法来跟踪不同颜色的物体?
答案 0 :(得分:3)
如果我理解正确,这里你唯一需要的是在图表中找到最大值,其中最大值不一定是最高峰值,而是密度最大的区域。
这是一个非常简单的不太科学但快速的O(n)方法。通过低通滤波器运行直方图。例如。移动平均线。平均值的长度可以说是20.在这种情况下,新修改的直方图的第10个值将是:
mh10 = (h1 + h2 + ... + h20) / 20
其中h1,h2 ...是直方图中的值。下一个值:
mh11 = (h2 + h3 + ... + h21) / 20
使用先前计算的mh10,通过删除它的第一个组件并在结尾添加一个新组件,可以更容易地计算:
mh11 = mh10 - h1/20 + h21/20
您唯一的问题是如何处理直方图边缘的数字。您可以将移动平均线的长度缩小到可用长度,或者可以在已有的前后添加值。但无论哪种方式,你都无法处理边缘的峰值。
最后,当你有这个修改过的直方图时,只需获得最大值。这是有效的,因为现在直方图中的每个值不仅包含他自己,还包含邻居。
更复杂的方法是使用高斯曲线对平均值进行加权。但那不再是线性的。它将是O(k * n),其中k是平均值的长度,也是高斯的长度。