OpenCV 3.4 / c++ CascadeClassifier 使用旧的 xml 文件

Posted

技术标签:

【中文标题】OpenCV 3.4 / c++ CascadeClassifier 使用旧的 xml 文件【英文标题】:OpenCV 3.4 / c++ CascadeClassifier use old xml file 【发布时间】:2018-06-22 04:39:05 【问题描述】:

我有 OpenCV 3.4,我正在使用 c++ 在 Linux 计算机上进行开发。

我正在做一些人脸识别的工作,并想使用 Haar-Cascade 分类器。我找到了预训练的口鼻级联分类器,但它们是“旧”的 .xml 格式,如下所示:

<opencv_storage>
    <Boca_17stages type_id="opencv-haar-classifier">
       <size>
        25 15</size>
       <stages>
       <_>
       <!-- stage 0 -->
          <trees>
       ...

OpenCV 提供的 .xml 文件运行良好。这些文件是新版本,如下所示:

<opencv_storage>
<cascade type_id="opencv-cascade-classifier"> 
 <stageType>BOOST</stageType>
  <featureType>HAAR</featureType>
  <height>20</height>
  <width>20</width>
  <stageParams>
  ...

我在不同的帖子中读到,OpenCV 仍然可以处理那些旧的 .xml 文件,甚至可以转换它们。但是当我调用cv::CascadeClassifier::convert(const String&amp; oldcascade, const String&amp; newcascade) 时,什么也没有发生,它返回false

当我加载一个旧的 .xml 文件并尝试 detectMultiScale(... 时,我得到了一个断言:

OpenCV Error: Assertion failed (!empty()) in detectMultiScale, file opencv-location/modules/objdetect/src/cascadedetect.cpp, line 1698
terminate called after throwing an instance of 'cv::Exception'
  what():  opencv-location/modules/objdetect/src/cascadedetect.cpp:1698: error: (-215) !empty() in function detectMultiScale

我的代码如下所示:

 //Greyscale image myGrayMat is given
 Vector<Rect> eyes;
 Vector<Rect> mouth;
 CasscadeClassifier eyes = CascadeClassifier ("haarcascade_frontalface_alt.xml")
 CasscadeClassifier mouthCas1 = CascadeClassifier("mouth.xml");
 CassCadeClassifier mouthCas2= CascadeClassifier();
 mouthCas1.load("mouth.xml");

 //nothing happens here, returns false, no file is created
 CascadeClassifier::convert("mouth.xml","mouth_new.xml");

 //works well:
 eyesCas.detectMultiScale(myGrayMat,eyes,1.1,2,0|CV_HAAR_FIND_BIGGEST_OBJECT,Size(20,20));
 //Assertion fail
 mouthCas.detectMultiScale(myGrayMat,mouths,1.1,2,0|CV_HAAR_FIND_BIGGEST_OBJECT,Size(15,25));
 //assertion fail
 mouthCas.detectMultiScale(myGrayMat,mouths,1.1,2,0|CV_HAAR_FIND_BIGGEST_OBJECT,Size(15,25));

谁能帮帮我?或者任何人都可以转换 .xml 文件吗?那很好啊。 非常感谢!

【问题讨论】:

你可以试试opencv 2.4吗?在那里,旧的和新的级联肯定会起作用。如果那里也有问题,可能是您的级联已损坏。 我会试试的。太糟糕了 OpenCV 在 3.4 版本中存在这样的问题。感谢您的回复。 【参考方案1】:
CasscadeClassifier eyes = CascadeClassifier("haarcascade_frontalface_alt.xml")

cd /home/user/opencv-3.4.0/data/haarcascades

CasscadeClassifier eyes = CascadeClassifier ("/home/user/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt.xml")

【讨论】:

请在您的答案中添加一些解释/文字。 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。

以上是关于OpenCV 3.4 / c++ CascadeClassifier 使用旧的 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3.4发布啦!

python 3.6 安装 opencv 3.4

Python 3.6 + opencv 3.4 中imshow 函数报错

Mac 使用brew安装低版本的软件,如opencv

c++结合opencv能给载入图像并处理,我想知道,c++结合啥,可以实现处理gif图像

无法使用 OpenCV 4 (C++) 创建 FisherFaceRecognizer