【发布时间】:2023-03-16 10:39:01
【问题描述】:
场景:
我正在尝试跟踪两个不同颜色的对象。一开始,提示用户将第一个彩色对象(例如,可能是红色)保持在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序会占用帧的那部分(ROI) 并分析其中的颜色,以找到要跟踪的颜色。同样对于第二个对象也是如此。然后像往常一样,在 HSV 颜色平面中使用cv.inRange 函数并跟踪对象。
做了什么:
我获取了要跟踪的对象的 ROI,将其转换为 HSV 并检查了色调直方图。我有两种情况如下:
(这里只有一个主要的中心峰。但在某些情况下,我会得到两个这样的峰,一个是较大的峰,周围有一些像素簇,第二个峰小于第一个峰,但具有小簇的显着尺寸也在它周围。我现在没有它的示例图像。但它几乎看起来像下面(在油漆中创建))
问题:
How can I get best range of hue values from these histograms?
我的意思是最佳范围,可能是 ROI 中大约 80-90% 的像素位于该范围内。
或者有没有比这更好的方法来跟踪不同颜色的对象?
【问题讨论】:
-
在计算直方图之前,您是否尝试过标准化颜色(例如使用
equalizeHist)? -
不,我没有。它有什么好处?
-
它会提高图像的对比度,并且(也许)不会有这样两个峰值 - 只有一个。
-
您是否考虑过使用贝叶斯分类器等统计模型?如果您有两类对象,它将告诉您未知的第三个对象属于每一类的相对可能性。然后,您可以通过使其多变量来改进它(例如,不仅使用色调,还使用值)您还可以添加类来描述背景......
-
@AbidRahmanK 贝叶斯分类器非常简单:根据您的像素分布,您可以简单地计算均值和标准差。使用这两个,您可以拟合正态分布。然后,可以计算任何像素值成为分布一部分的可能性。你可以自己实现它,但是opencv有一个实现。这很有趣,因为您可以捕捉到变化(您不仅在手段上工作)。当然,如果你有多模态直方图,你可以拟合混合高斯而不是高斯......
标签: python image-processing opencv computer-vision histogram