设想 :
我正在尝试跟踪两个不同颜色的物体。一开始,系统会提示用户将第一个彩色对象(例如,可能是红色)放在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序将获取帧的该部分(ROI)并分析其中的颜色,找到要跟踪的颜色。对于第二个对象也是如此。然后像往常一样,使用cv.inRange
在 HSV 颜色平面中运行并跟踪对象。
做了什么:
我获取了要跟踪的对象的 ROI,将其转换为 HSV 并检查了色调直方图。我收到以下两个案例:
(这里只有一个主要的中心峰。但在某些情况下,我得到两个这样的峰,一个是较大的峰,周围有一些像素簇,第二个峰比第一个峰小,但尺寸很大,周围也有小簇.我现在没有它的示例图像。但它几乎如下所示(在绘画中创建))
问题 :
How can I get best range of hue values from these histograms?
我所说的最佳范围是指 ROI 中大约 80-90% 的像素可能位于该范围内。
或者还有比这更好的方法来跟踪不同颜色的物体吗?
如果我理解正确的话,这里唯一需要的就是找到图中的最大值,其中最大值不一定是最高峰,而是密度最大的区域。
这是一个非常简单的不太科学但快速的 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 是平均值的长度,也是高斯的长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)