C++ OPENCV 4.3.0 x64 为什么face_cascade会出错?

问题描述 投票:1回答:1

我正在使用OpenCV为我的C++程序添加一个人脸识别功能。我以前从未使用过它,但我似乎无法让面部识别的级联功能工作。我想知道他们是否在新版本中对FLAGS做了一些改变。我可以显示一个图像,但当进入级联时,它总是抛出一个错误。有谁能告诉我,我缺少了什么?

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    #include <stdio.h>
    #include <iostream>
    #include <opencv2\objdetect.hpp>

    using namespace std;
    using namespace cv;

    String face_cascade_name  = "sources/data/haarcascades/haarcascade_frontalface_default.xml";
    String eyes_cascade_name  = "sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";
    String smile_cascade_name = "sources/data/haarcascades/haarcascade_smile.xml";

    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    CascadeClassifier smile_cascade;

    string window_name = "Capture - Face detection";
    RNG rng(12345);

    int main()
    {
        //-- 1. Load the cascades
        if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading file 1\n"); return -1; };
        if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading file 2\n"); return -1; };
        if (!smile_cascade.load(smile_cascade_name)) { printf("--(!)Error loading file 3\n"); return -1; };

        std::string image_path = samples::findFile("test.jpg");
        Mat img = imread(image_path, IMREAD_COLOR);
        Mat img_gry;

        if (img.empty())
        {
            std::cout << "Could not read the image: " << image_path << std::endl;
            return 1;
        }

        imshow("Display window", img);

        // Detect faces
        std::vector<Rect> faces;
        cvtColor(img, img_gry, COLOR_BGR2GRAY);
        equalizeHist(img, img_gry);

        //I GET ERROR HERE
        face_cascade.detectMultiScale(img_gry, faces, 1.1, 2, CASCADE_SCALE_IMAGE, Size(30, 30), Size(130, 130)); //I GET ERROR HERE

/*...REST WILL BE PARSING faces...*/

        int g_key = waitKey(0); // Wait for a keystroke in the window

        if (g_key == 's')
        {
            imwrite("starry_night.png", img); //save image in same path
        }

        return 0;
    }
c++ opencv cascade
1个回答
1
投票

我修改了代码。

/*...
OTHER CODE
...*/
std::vector<Rect> faces;
cvtColor(img, img_gry, COLOR_BGR2GRAY);
equalizeHist(img_gry, img_gry);
face_cascade.detectMultiScale(img_gry, faces);

for (size_t i = 0; i < faces.size(); i++)
{
       /*...PARSE...*/
}

imshow("Display window", img);

就像@SourceCode提到的那样:

equalizeHist( smallImg, smallImg); //my variable is img_gry instead.

但是,我也修改了.NET Framework 2.0。

face_cascade.detectMultiScale(img_gry, faces, 1.1, 2, CASCADE_SCALE_IMAGE, Size(30, 30), Size(130, 130));

修改为

face_cascade.detectMultiScale(img_gry, faces);

否则,在我的情况下,它不工作。

如果有帮助,请提供源码。https:/docs.opencv.org3.4dbd28tutorial_cascade_classifier.html。


0
投票

你有没有试过使用类似:

face_cascade.detectMultiScale(img_gry, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30));
© www.soinside.com 2019 - 2024. All rights reserved.