7

设想 :

我正在尝试跟踪两个不同颜色的对象。一开始,提示用户将第一个彩色对象(例如,可能是红色)保持在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序会占用帧的那部分(ROI) 并分析其中的颜色,以找到要跟踪的颜色。同样对于第二个对象也是如此。然后像往常一样,cv.inRange在 HSV 颜色平面中使用函数并跟踪对象。

做了什么:

我将要跟踪的对象的 ROI 转换为 HSV 并检查色调直方图。我有两个案例如下:

在此处输入图像描述 在此处输入图像描述

(这里只有一个主要的中心峰。但在某些情况下,我得到两个这样的峰,一个是更大的峰,周围有一些像素簇,第二个峰比第一个小,但大小很大,周围也有小簇.我现在没有它的示例图像。但它几乎看起来像下面(在油漆中创建))

在此处输入图像描述

问题 :

How can I get best range of hue values from these histograms?

我的意思是最佳范围,可能是 ROI 中大约 80-90% 的像素位于该范围内。

还是有比这更好的方法来跟踪不同颜色的物体?

4

1 回答 1

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 是平均值的长度,也是高斯的长度。

于 2012-10-29T18:08:00.510 回答