OpenCV中未记载的groupRectangles变体

时间:2014-04-30 03:01:34

标签: opencv

在OpenCV的cascadedetect.cpp中,有groupRectangles函数的几种变体:

void groupRectangles(std::vector<Rect>& rectList, int groupThreshold, double eps);
void groupRectangles(std::vector<Rect>& rectList, std::vector<int>& weights, int groupThreshold, double eps);
void groupRectangles(std::vector<Rect>& rectList, std::vector<int>& rejectLevels, std::vector<double>& levelWeights, int groupThreshold, double eps);

但在OpenCV document中,只清楚地记录了第一个变体,提到了第二个变体,但没有解释weights参数。第三个甚至没有提到。

任何人都可以解释weightsrejectLevelslevelWeights的含义吗?

1 个答案:

答案 0 :(得分:4)

我阅读了groupRectangles源代码,并在一定程度上理解了这些参数的含义。

groupRectangles在cascadedetect.cpp中定义,由openCV中的traincascade项目使用。该项目使用viola-jones的级联adaboost框架来检测对象,因此它有几个级联阶段,每个阶段都是一个强大的分类器。默认情况下,级联分类器仅在输入样本通过每个阶段时才输出正数,但如果要绘制ROC曲线,也可以将其设置为输出拒绝样本的阶段索引。

所以rejectLevels表示拒绝矩形的阶段索引。根据源代码,weight的效果与rejectLevels相同。

以上两个参数对我们来说可能不太实用,但levelWeights有时很有用。它最初是由拒绝它的舞台输出的矩形的分数,但我们可以将它用于更一般的目的。如果每个矩形都有一个分数(无论它来自哪里),并且我们想要获得分组矩形的分数,groupRectangles的记录变体不会帮助我们。我们必须使用第三个,rejectLevels设置为零:

vector<int> levels(wins.size(), 0);
groupRectangles(wins, levels, scores, groupThreshold, eps);

其中scoreswins的得分。它们的大小相同。