【问题标题】:Fusing Multiple Haar Classifiers for face detection融合多个 Haar 分类器进行人脸检测
【发布时间】:2014-08-29 02:58:20
【问题描述】:

我正在尝试将视频分割成前景和背景。假设我的视频主要包含人脸,我从人脸检测器开始,并使用人脸检测器内的所有像素作为 GrabCut 的可能前景种子。

问题是有时(在几帧中),人脸检测器不会检测到人脸,尽管人脸肯定存在。特别是当用户从屏幕上移开视线并且可以看到脸部的侧面轮廓时。

有解决办法吗?

我想到的一个明显答案是使用侧面轮廓 Haar 分类器,但我如何融合它们呢?从某种意义上说,在任何时候,我都应该拥有脸部的正面轮廓或侧面轮廓(或根本没有)。

我想知道检测到的人脸是否有任何相关的置信度值,因此我可以使用来自级联的检测来提供更可靠的检测。

【问题讨论】:

  • 您可以减少级联检测中的“邻居”参数(例如,从 3 减少到 1 或 2)。这将拒绝更少的面孔。
  • 我试过了,但这会产生更多的错误检测,这也是不可接受的,因为这会破坏我在检测到的面部上训练的颜色模型。我在框架中只有一次脸的约束下工作。为了在检测到的多个面部中进行选择,如果我可以将置信度分数与检测相关联会更好。

标签: c++ opencv image-processing computer-vision haar-classifier


【解决方案1】:

CascadeClassifier::detectMultiScale() 有一个(未记录的)重载:

virtual void detectMultiScale( InputArray image,
                               CV_OUT std::vector<Rect>& objects,
                               CV_OUT std::vector<int>& rejectLevels,
                               CV_OUT std::vector<double>& levelWeights,
                               double scaleFactor,
                               int minNeighbors, int flags,
                               Size minSize, Size maxSize,
                               bool outputRejectLevels ) = 0;

rejectLevels 应该是您正在寻找的置信度值

【讨论】:

  • 好的。谢谢!我刚刚意识到我实际上是在使用 C 函数进行检测。也就是说,我使用的是 cvHaarDetectObjects 而不是 detectMultiScale。如果 cvHaarDetectObjects 也有类似的重载,我会查找。
  • 哦,请不要。将您的代码移至 c++ api。请!!
  • 哦?我会这样做的。您有什么强烈建议这样做的理由?
  • 他们已经在 2010 年离开了 c-api,它已被弃用。另外,根据我的经验,使用 c++ 的事情变得更加简单,因为您不必预先分配结果 Mats,进行手动内存管理等。还请注意,cvHaarDetectObjects 只能读取 haarcascades,而 CascadeClassifier::detectMultiScale() 可以也读 hog 或 lbp 的。更新的功能只能在 c++ 中使用。
猜你喜欢
  • 2017-08-08
  • 2016-10-26
  • 2015-08-23
  • 2015-06-17
  • 2011-11-14
  • 2016-02-01
  • 1970-01-01
  • 2020-05-14
  • 2020-12-23
相关资源
最近更新 更多