haar cascade xml文件中“left”和“right”值的含义是什么?

时间:2009-06-11 00:15:29

标签: opencv

在OpenCV的haar级联文件中,“左”和“右”值是什么,这是如何引用“阈值”值的?谢谢!

仅供参考,这是文件的结构:

<haarcascade_frontalface_alt type_id="opencv-haar-classifier">
  <size>20 20</size>
  <stages>
    <_>
      <!-- stage 0 -->
      <trees>
        <_>
          <!-- tree 0 -->
          <_>
            <!-- root node -->
            <feature>
              <rects>
                <_>3 7 14 4 -1.</_>
                <_>3 9 14 2 2.</_></rects>
              <tilted>0</tilted></feature>
            <threshold>4.0141958743333817e-003</threshold>
            <left_val>0.0337941907346249</left_val>
            <right_val>0.8378106951713562</right_val></_></_>
        <_>

4 个答案:

答案 0 :(得分:2)

“左”和“右”是指特定形状的梯度值。这些特定形状不是特别是左矩形和右矩形。相反,它只是指特定配置的部分(如果有超过2个,有时会超过一个部分)。 David Haar的论文中有一张图解释了这一点。

这是一个ascii表示(=填充, - 未填充):

====    ==--   =--=
====    ==--   =--=
----    ==--   =--=
----    ==--   =--=

总的来说,命名是不好的惯例。相反,它应该命名为“渐变顶部”,“渐变底部”(2),“渐变左”,“渐变右”(2),“渐变左”,“渐变中心”,“渐变底部”(3),分别。应命名旋转,边缘和其他形状以唯一标识这些部分。

答案 1 :(得分:2)

在OpenCV的源代码中,您会发现cvhaar.cpp可以深入了解Haar级联的工作原理。不幸的是,这基本上没有评论,文档也没有多大帮助。以下是我对其工作原理的理解。

在函数icvEvalHidHaarClassifier()中,计算单个CvHidHaarTreeNode的要素的总和。

如果此总和小于阈值,则遵循“左”节点,并重复该过程。否则,遵循“右”节点,再次重复。这反映在以下声明中:

idx = sum < t ? node->left : node->right;

当“左”或“右”节点为负值时,循环被破坏。在这种情况下,不再为此要素计算总和,但会返回该要素的阈值作为分类器的结果。

我把“左”和“右”放在引号中,因为正如你所说,它们与特征位置无关。相反,它们反映了级联“下降”的方式:低于阈值,级联落在左侧,高于阈值,它落在右侧

现在让我们回到这些节点的表示。在XML中,您将看到节点的表示不是索引,而是值:

<left_val>0.0337941907346249</left_val>
<right_val>0.8378106951713562</right_val>

这些数字实际上是使用cvGetFileNodeByName()查找的节点名称。我不知道OpenCV中究竟是如何工作的,但现在我希望你至少能更好地了解级联的工作原理。

答案 2 :(得分:2)

保罗,真的吗?

我认为,left_val / right_val用作:

sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val)

答案 3 :(得分:0)

根据我的理解,最初的文章是Paul Viola和Michael Jones使用Boosted Cascade of Simple Features 进行快速对象检测。它基于类似Haar的特征,因此得名。我建议从IEEE website抓住它。 (如果您没有帐户,请查看Google Scholar上的其他版本。)

使用Haar分类器进行面部特征检测(Wilson,Fernandez)中也描述了分类器。您可以在ACM websiteCSA website上找到它。