6

在 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

4 回答 4

2

保罗,真的吗?

我认为,left_val/right_val 用作:

sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val)
于 2011-11-13T17:24:42.427 回答
2

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

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

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

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

于 2009-06-23T17:14:28.193 回答
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 中是如何工作的,但现在我希望你至少对级联是如何工作的有一个更好的了解。

于 2010-03-29T15:32:02.437 回答
0

据我了解,原始文章是Paul Viola 和 Michael Jones的使用 Boosted Cascade of Simple Features 的快速对象检测。它基于类似 Haar 的特征,因此得名。我建议从IEEE 网站获取它。(如果您没有帐户,请在Google Scholar上查看其他版本。)

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

于 2009-09-28T16:19:18.040 回答