这些特征可以由两个、三个或四个矩形组成。以下是一个示例。
鉴于探测器的基本分辨率为24x24,矩形特征的详尽集非常大,超过180,000。请注意,与Haar基不同,矩形特征集是过完备的。
以下声明在论文中没有明确说明,因此它们是我假设的:
1.只有2个双矩形特征,2个三矩形特征和1个四矩形特征。其背后的逻辑是我们观察突出显示的矩形之间的差异,而不是明确的颜色、亮度或其他任何形式的差异。
2.我们不能将A型特征定义为1x1像素块;它必须至少为1x2像素。同样,D型特征必须至少为2x2像素,并且此规则相应地适用于其他特征。
3.我们不能将A型特征定义为1x3像素块,因为中间像素无法分区,将其从自身中减去等同于1x2像素块;这种特征类型仅适用于偶数宽度。此外,C型特征的宽度必须可被3整除,并且此规则相应地适用于其他特征。
4.我们不能定义宽度和/或高度为0的特征。因此,我们将x和y迭代到24减去特征的大小。
基于这些假设,我已经计算了详尽的集合:
const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
int sizeX = feature[i][0];
int sizeY = feature[i][1];
// Each position:
for (int x = 0; x <= frameSize-sizeX; x++) {
for (int y = 0; y <= frameSize-sizeY; y++) {
// Each size fitting within the frameSize:
for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
count++;
}
}
}
}
}
结果为162,336。
我找到的唯一逼近维奥拉和琼斯所说的“超过180,000”的方法是放弃假设#4,并在代码中引入错误。这涉及将四行分别更改为:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
结果是180,625。请注意,这将有效地防止特征接触子框的右侧和/或底部。现在当然的问题是:他们在实现中犯了错误吗?考虑表面积为零的特征有意义吗?还是我看错了?