'weight'参数在Opencv对象检测中的含义是什么

时间:2013-10-22 20:25:13

标签: c++ opencv

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);

我猜它的某种参数表明分类器是如何确定它找到了对象的,但是,我不知道细节:

  • 最小值和最大值是多少?
  • 正面值和负面值是什么意思?
  • 是线性还是指数?
  • 它与分类器的各个阶段有关吗?

1 个答案:

答案 0 :(得分:0)

我已经从cascadedetect source code找到了它。它使用符号sum作为权重。

代码(下面)迭代通过添加到sum变量的给定阶段中的树。在阶段结束时,总和必须大于阶段的阈值(可以是负数)才能继续。然后在每个新阶段开始时将总和重置为零。

因此,重量输出参数为:

  • 未能大于失败阶段的阈值的值。
  • OR ..通过分类器最后阶段的值。

我仍然不明白绝对意味着什么。

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;
}