在runAt
method的开放式CV文档中,以及detectMultiScale method的开放式CV文档中。有一个神秘的无证“重量”输出参数。
通过试验我的2阶段分类器,我看到它吐出这样的值:
-2.093535
-2.715030
2.000000 // Positive values seem to be output when the classifier was successful
0.034417
我还查看了源代码,发现groupRectangles
方法使用了权重。
void groupRectangles(vector<Rect>& rectList,
int groupThreshold,
double eps,
vector<int>* weights,
vector<double>* levelWeights);
我猜它的某种参数表明分类器是如何确定它找到了对象的,但是,我不知道细节:
答案 0 :(得分:0)
我已经从cascadedetect source code找到了它。它使用符号sum
作为权重。
代码(下面)迭代通过添加到sum
变量的给定阶段中的树。在阶段结束时,总和必须大于阶段的阈值(可以是负数)才能继续。然后在每个新阶段开始时将总和重置为零。
因此,重量输出参数为:
我仍然不明白绝对意味着什么。
inline int predictOrderedStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &_featureEvaluator, double& sum )
{
int nodeOfs = 0, leafOfs = 0;
FEval& featureEvaluator = (FEval&)*_featureEvaluator;
float* cascadeLeaves = &cascade.data.leaves[0];
CascadeClassifier::Data::DTreeNode* cascadeNodes = &cascade.data.nodes[0];
CascadeClassifier::Data::Stage* cascadeStages = &cascade.data.stages[0];
int nstages = (int)cascade.data.stages.size();
for( int stageIdx = 0; stageIdx < nstages; stageIdx++ )
{
CascadeClassifier::Data::Stage& stage = cascadeStages[stageIdx];
sum = 0.0;
int ntrees = stage.ntrees;
for( int i = 0; i < ntrees; i++, nodeOfs++, leafOfs+= 2 )
{
CascadeClassifier::Data::DTreeNode& node = cascadeNodes[nodeOfs];
double value = featureEvaluator(node.featureIdx);
sum += cascadeLeaves[ value < node.threshold ? leafOfs : leafOfs + 1 ];
}
if( sum < stage.threshold )
return -stageIdx;
}
return 1;
}