cv::CascadeClassifier::detectMultiScale 中的断言失败 (!empty())

Posted

技术标签:

【中文标题】cv::CascadeClassifier::detectMultiScale 中的断言失败 (!empty())【英文标题】:Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale 【发布时间】:2021-11-08 15:37:24 【问题描述】:

我一直试图了解 OpenCV 和面部识别的工作原理,但我不断收到错误消息。

我收到以下错误消息:OpenCV:调用终止处理程序!最后一个 OpenCV 错误是:

OpenCV(4.5.3) 错误:断言失败 (!empty()) in cv::CascadeClassifier::detectMultiScale,文件 C:\build\master_winpack-build-win64-vc15\opencv \modules\objdetect\src\cascadedetect.cpp,第 1689 行

谁能告诉我这个错误信息是什么意思?

程序在运行几秒钟后崩溃,我看不到视频源。在我自己的代码失败了几次之后,我最终直接从教程中复制了代码。我使用了来自“https://www.youtube.com/watch?v=RY6fPxpN10E”的代码,但仍然收到错误消息。

(Main.cpp)

#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv )

    double scale = 1.0;

    cv::CascadeClassifier faceCascade;
    faceCascade.load("C:/ComputerVision/opencv/build/etc/haarcascades_frontalface_alt.xml");

    cv::VideoCapture video(0);

    if(video.isOpened())
    
      std::cout<<"Video funktioniert"<<std::endl;
    

    //Frame speichern
    cv::Mat frame;

    //Loop yur Ausgabe von Video
    while (video.read(frame))
    
        video >> frame;

        cv::Mat grayscale;
        cvtColor(frame, grayscale, cv::COLOR_BGR2GRAY);

        resize(grayscale, grayscale, Size(grayscale.size().width / scale, grayscale.size().height / scale));

        vector<Rect> faces;
        faceCascade.detectMultiScale(grayscale, faces, 1.1, 3.0, 0, Size(30, 30));

        for (Rect area : faces)
        
            Scalar drawColour = Scalar(255, 0, 0);
            rectangle(
                frame,
                Point(
                    cvRound(area.x * scale),
                    cvRound(area.y * scale)),
                Point(
                    cvRound((area.x + area.width - 1) * scale),
                    cvRound((area.y + area.height - 1) * scale)),
                drawColour);

        

        cv::imshow("video feed", frame);

        if (cv::waitKey(25) >= 0)
        
            break;
        
    


    return 0;

(.pro)

    TEMPLATE = app
    CONFIG += console c++11
    CONFIG -= app_bundle
    CONFIG -= qt
    
    SOURCES += \
            main.cpp
    
    INCLUDEPATH += C:\ComputerVision\opencv\build\include\
    
    LIBS += C:\ComputerVision\opencv\build\x64\vc15\lib\opencv_world453.lib

【问题讨论】:

detectMultiScale 调用之前检查grayscale 是否为空(if (!grayscale.data)/*error message*/ 刚试了一下,不是空的。 【参考方案1】:

OpenCV 使用断言进行错误检查。这可能被认为是懒惰的,因为失败的断言不是可以捕获的异常(无论如何在 C++ 中,AFAIK)。

此特定断言表明您创建了级联分类器,但找不到 xml 文件,或者在加载分类器数据时存在其他问题。要得出这个结论,您需要阅读指定位置的 OpenCV 源代码。您会找到断言,然后深入了解empty(),它会准确检查这种情况。

您可以在.load() 致电后立即查看此情况:

assert(!faceCascade.empty());

这与断言中的测试相同,只是在您自己的代码中,并且在您尝试使用级联分类器之前

【讨论】:

完美,是的,这就是问题所在。我的路径或文件名有问题。谢谢。

以上是关于cv::CascadeClassifier::detectMultiScale 中的断言失败 (!empty())的主要内容,如果未能解决你的问题,请参考以下文章