分析的OpenCV版本是:OpenCV 2.4.9
当使用void CascadeClassifier::detectMultiScale做人脸识别的时候,根据滑窗机制会产生很多的候选框,候选框间会相互交叠,相互包含等,读了opencv的源码之后,发现最后合并候选框的函数是groupRectangles,最后贴出源码,进行简单的分析。
void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects,
double scaleFactor, int minNeighbors,
int flags, Size minObjectSize, Size maxObjectSize)
void groupRectangles(vector<Rect>& rectList, int groupThreshold, double eps, vector<int>* weights, vector<double>* levelWeights)
{
/*
当组合阈值groupThreshold小于等于0的时候,如果输出weights,
则weights中返回与rectList同样个数个1,函数直接返回,不进行合并操作
*/
if( groupThreshold <= 0 || rectList.empty() )
{
if( weights )
{
size_t i, sz = rectList.size();
weights->resize(sz);
for( i = 0; i < sz; i++ )
(*weights)[i] = 1;
}
return;
}
// 调用partition函数对rectList中的矩形进行分类
// 其中nclasses表示组合类别,labels表示每个rect属于哪个类别的,相似度计算使用SimilarRects类
vector<int> labels;
int nclasses = partition(rectList, labels, SimilarRects(eps));
vector<