在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></_></_>
<_>
答案 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 website或CSA website上找到它。