我一直在改编 维奥拉 · 琼斯的人脸检测算法。该技术依赖于在图像中放置一个24x24像素的子帧,然后在每个位置尽可能放置矩形特征。
这些特性可以由两个、三个或四个矩形组成。
他们声称全套装备超过18万(第2节) :
考虑到检测器的基本分辨率是24x24,所以矩形特征的穷举集相当大,超过180,000。注意,与 Haar 基不同,矩形的集合 功能过于完整。
以下声明在文件中没有明确说明,因此是我的假设:
基于这些假设,我详细计算了一下:
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。
我发现唯一能接近 Viola & Jones 所说的“超过180,000”的方法是放弃假设 # 4,并在代码中引入 bug。这涉及将四行分别改为:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
结果就是 180,625。(请注意,这将有效地防止功能永远接触的权利和/或底部的子框架。)
当然,现在的问题是: 他们在实施过程中是否犯了错误?考虑表面为零的特征有意义吗?还是我想错了?