Opencv 什么是「;“左”;及;对",;值在haar cascade xml文件中是什么意思?

Opencv 什么是「;“左”;及;对",;值在haar cascade xml文件中是什么意思?,opencv,Opencv,在OpenCV的haar级联文件中,“左”和“右”值是什么,这是如何表示“阈值”的?谢谢 仅供参考,以下是文件的结构: <haarcascade_frontalface_alt type_id="opencv-haar-classifier"> <size>20 20</size> <stages> <_> <!-- stage 0 --> <trees>

在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></_></_>
        <_>

20 20
3 7 14 4 -1.
3 9 14 2 2.
0
4.0141958743333817e-003
0.0337941907346249
0.8378106951713562
左侧和右侧是指特定形状的渐变值。这些特定的形状并不是一个左矩形和一个右矩形。相反,它只引用特定配置的部分(如果有两个以上的部分,则有时不止一个部分)。David Haar的论文中有一个图表可以帮助解释这一点

以下是ascii表示法(=已填充,-未填充):


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

据我所知,原始文章是Paul Viola和Michael Jones的快速目标检测,使用了一系列简单功能。它基于类似哈尔的特征,因此得名。我建议把它从桌子上拿下来。(如果您没有帐户,请查看上的其他版本。)


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

在OpenCV的源代码中,您将找到
cvhaar.cpp
,它提供了一些关于Haar级联工作原理的见解。不幸的是,这根本不是评论,文档也没有多大帮助。以下是我对其工作原理的理解

在函数
icvevalhidhaarclassizer()
中,计算单个
CvHidHaarTreeNode
特征的总和

如果该总和小于阈值,则遵循“左”节点,并重复该过程。否则,将跟随“right”节点,再次重复。以下陈述反映了这一点:

idx = sum < t ? node->left : node->right;
idx=sum左:节点->右;
当“左”或“右”节点为负值时,循环中断。在这种情况下,不再计算该特征的和,而是返回该特征的阈值作为分类器的结果

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

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

<left_val>0.0337941907346249</left_val>
<right_val>0.8378106951713562</right_val>
0.0337941907346249
0.8378106951713562
这些数字实际上是使用
cvGetFileNodeByName()
查找的节点名。我不知道OpenCV内部是如何工作的,但现在我希望您至少对cascade的工作原理有一个更好的了解。

Paul,真的吗

我认为,左/右值用作:

sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val)
sum\u stage+=(sum\u feature
左节点1/左节点和右节点1/右节点是什么意思?我从网上下载的很多分类器中看到了这一点,但我不明白它们是什么意思;当特征总和低于阈值时,它会向左下降,否则会向右下降。
sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val)