'''
tilte: opencv haar特征人脸检测过程的一些理解
keyword: opencv2.x 人脸检测 HAAR特征 adaboost 积分图 图像金字塔 窗口放大检测(滤波器放大)
有文档和资料说opencv同时实现了窗口放大检测和图像缩小检测两种,
VJ的论文里也表示他是使用窗口放大检测这种方式。但是从对opencv代码(opencv-2.4.11)的阅读理解来看,
其只是实现了图像金字塔方式的缩小检测,并没有实现窗口放大检测。
ref: https://blog.csdn.net/qq_26898461/article/details/48802845
ref: https://www.bbsmax.com/A/o75NbO0N5W/
'''
关键代码如下:
void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects,
vector<int>& rejectLevels,
vector<double>& levelWeights,
double scaleFactor, int minNeighbors,
int flags, Size minObjectSize, Size maxObjectSize,
bool outputRejectLevels )
{
const double GROUP_EPS = 0.2; // 目标矩形相似度判断的参数,增大可以将更多的邻近窗口分类一类
CV_Assert( scaleFactor > 1 && image.depth() == CV_8U );
if( empty() )
return;
if( isOldFormatCascade() )
{
MemStorage storage(cvCreateMemStorage(0));
CvMat _image = image;
CvSeq* _objects = cvHaarDetectObjectsForROC( &_image, oldCascade, storage, rejectLevels, levelWeights, scaleFactor,
minNeighbors, flags, minObjectSize, maxObjectSize, outputRejectLevels );
vector<CvAvgComp> vecAvgComp;
Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
objects.resize(vecAvgComp.size());
std::transform(vecAvgComp.begin(), vecAvgComp.end(), objects.begin(), getRect());
return;
}
objects.clear();
if (!maskGenerator.empty()) {
maskGenerator->initializeMask(image);
}
if( maxObjectSize.height == 0 || maxObjectSize.width == 0 )
maxObjectSize = image.size();
Mat grayImage = image;
if( grayImage.channels() > 1 )
{
Mat temp;
cvtColor(grayImage, temp, CV_BGR2GRAY);
grayImage = temp;
}
// 缩放buffer
Mat imageBuffer(image.rows + 1, image.cols + 1, CV_8U);
vector<Rect> candidates;
for( double factor = 1; ; factor *= scaleFactor )
{
Size originalWindowSize = getOriginalWindowSize();
// windowSize的唯一用途是,得到当前缩放等级下,检出目标的实际大小,以便和maxObjectSize、minObjectSize比较
// 如果超了,就可以提前结束检测了,如果不足,则没有检测的必要,进入下一个缩放等级(目标更大)
Size windowSize( cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) );
// 缩放后的尺寸
Size scaledImageSize( cvRound( grayImage.cols/factor ), cvRound( grayImage.rows/factor ) );
// 此缩放条件下,窗口滑动的位置范围(用一个矩形的宽高描述)
Size processingRectSize( scaledImageSize.width - originalWindowSize.width, scaledImageSize.height - originalWindowSize.height );
if( processingRectSize.width <= 0 || processingRectSize.height <= 0 )
break;
if( windowSize.width > maxObjectSize.width || windowSize.height > m
opencv haar特征人脸检测过程的一些理解
最新推荐文章于 2024-01-02 14:29:31 发布