C++ OpenCV人脸检测ROI断言失败

C++ OpenCV人脸检测ROI断言失败,c++,opencv,face-recognition,face,C++,Opencv,Face Recognition,Face,我对OpenCV有点陌生,我想用一个简单的人脸检测和图像裁剪来练习 具体来说,我使用cv::glob从文件夹加载图像,然后检测人脸,在检测到的人脸上绘制一个矩形,然后仅裁剪检测到的人脸区域 一切正常,人脸被检测到,矩形就在这个点上画出来。除了最后一部分:裁剪。我得到了臭名昭著的断言失败错误。下面是我的代码和错误: void faceDetectFolder() { Mat source; CascadeClassifier face_cascade; face_casc

我对OpenCV有点陌生,我想用一个简单的人脸检测和图像裁剪来练习

具体来说,我使用
cv::glob
从文件夹加载图像,然后检测人脸,在检测到的人脸上绘制一个矩形,然后仅裁剪检测到的人脸区域

一切正常,人脸被检测到,矩形就在这个点上画出来。除了最后一部分:裁剪。我得到了臭名昭著的
断言失败
错误。下面是我的代码和错误:

void faceDetectFolder()
{
    Mat source;

    CascadeClassifier face_cascade;
    face_cascade.load("C:/OpenCV-3.2.0/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml");

    String path(path on my PC);
    std::vector<cv::String> fn;
    glob(path, fn, true);

    for (size_t i = 0; i < fn.size(); i++)
    {
        source = imread(fn[i]);
        if (source.empty()) continue;

        std::string imgname = fn[i].substr(45, std::string::npos); //File name
        std::vector<Rect> faces;
        face_cascade.detectMultiScale(source, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

        for (int i = 0; i < faces.size(); i++)
        {

            if (faces[i].width > 80 && faces[i].height*0.5 > 80) //Threshold, some detections are false
            {
                int x = faces[i].x;
                int y = faces[i].y;
                int h = y + faces[i].height;
                int w = x + faces[i].width;

                rectangle(source, Point(x, y), Point(w, h), Scalar(255, 0, 0), 2, 8, 0); //Drawing rectangle on detected face

                imshow(imgname, source);

                Rect roi;
                roi.x = x;
                roi.y = y;
                roi.height = h;
                roi.width = w;      

                Mat detectedface = source(roi);

                imshow("cropped image", detectedface);

                waitKey(0);
            }
        }
    }
}
void faceDetectFolder()
{
垫源;
层叠式分级机;
face_cascade.load(“C:/OpenCV-3.2.0/OpenCV/sources/data/haarcascade/haarcascade_frontalface_alt2.xml”);
字符串路径(我的电脑上的路径);
std::载体fn;
glob(路径,fn,true);
对于(size_t i=0;i80&&faces[i].height*0.5>80)//阈值,则某些检测为假
{
int x=面[i].x;
int y=面[i].y;
int h=y+面[i]。高度;
int w=x+面[i]。宽度;
矩形(源,点(x,y),点(w,h),标量(255,0,0),2,8,0);//在检测到的面上绘制矩形
imshow(imgname,来源);
直接感兴趣区;
roi.x=x;
roi.y=y;
roi.height=h;
roi.width=w;
Mat detectedface=源(roi);
imshow(“裁剪图像”,检测到的脸);
等待键(0);
}
}
}
}
错误是:


OpenCV错误:断言失败(0在
roi.height
roi.width
中,尝试给出
faces[i]。height
faces[i]。width

确实,你会认为错误应该出现在前面,但它在绘制矩形时起作用,因为矩形以两个对角的顶点作为参数,而不是宽度/高度(在
Rect roi
的情况下)。你可以用
点(x,y)
点(w,h)来初始化
Rect
而且应该可以很好地工作。

很好,工作非常顺利。比我想象的要简单得多。谢谢Rick的快速回答!非常感谢。很高兴有帮助!我添加了评论作为答案!欢迎来到StackOverflow!我批准了它。很高兴认识你们大家。我从SO那里得到了很多答案,但是刚决定加入。希望我们能在不久的将来再次交谈。祝你有愉快的一天!