Haar-Cascade源码haar.cpp中CvHidHaar系列结构体成员含义咨询
以下是你提到的几个结构体成员的具体含义,这些是OpenCV早期Haar级联目标检测器的内部隐藏结构体,专门针对检测推理做了优化:
涉及的结构体定义
typedef struct CvHidHaarFeature { struct { sumtype *p0, *p1, *p2, *p3; float weight; } rect[CV_HAAR_FEATURE_MAX]; } CvHidHaarFeature; typedef struct CvHidHaarTreeNode { CvHidHaarFeature feature; float threshold; int left; int right; } CvHidHaarTreeNode; typedef struct CvHidHaarClassifier { int count; CvHidHaarTreeNode* node; float* alpha; } CvHidHaarClassifier; typedef struct CvHidHaarStageClassifier { int count; float threshold; CvHidHaarClassifier* classifier; int two_rects; struct CvHidHaarStageClassifier* next; struct CvHidHaarStageClassifier* child; struct CvHidHaarStageClassifier* parent; } CvHidHaarStageClassifier; typedef struct CvHidHaarClassifierCascade { int count; int isStumpBased; int has_tilted_features; int is_tree; double inv_window_area; CvMat sum, sqsum, tilted; CvHidHaarStageClassifier* stage_classifier; sqsumtype *pq0, *pq1, *pq2, *pq3; sumtype *p0, *p1, *p2, *p3; void** ipp_stages; } CvHidHaarClassifierCascade;
成员含义解释
CvHidHaarFeature 结构体的 weight
单个Haar特征由最多3个矩形区域组成,weight是当前矩形的权重系数:计算特征值时,先通过积分图指针p0/p1/p2/p3算出当前矩形的像素和,乘以weight,所有矩形的计算结果累加就是当前Haar特征的最终输出值。
CvHidHaarTreeNode 结构体成员
threshold:当前树节点的判定阈值。将前面计算得到的Haar特征值和该阈值比对,决定分支走向。left:特征值小于阈值时的跳转位置。如果值≥0,代表当前分类器树节点数组的下标,跳转后继续做下一级节点判定;如果值<0,代表当前是叶子节点,绝对值减1就是alpha数组的索引,直接取对应alpha值作为该弱分类器的输出。right:特征值大于等于阈值时的跳转位置,跳转规则和left完全一致。
CvHidHaarClassifier 结构体成员
count:当前弱分类器对应的决策树的节点总数。如果是常用的树桩分类器(单节点决策树),count值为1。alpha:Adaboost训练得到的弱分类器输出权重数组,每个叶子节点对应一个alpha值。所有弱分类器的输出累加后和阶段阈值比对,即可判断当前检测窗口是否为目标。
内容的提问来源于stack exchange,提问作者Roni Polak
相关产品推荐
相关产品推荐

