当前位置: 首页 > 知识库问答 >
问题:

OpenCV人脸检测ROI断言失败

归誉
2023-03-14

我是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);
            }
        }
    }
}

OpenCV错误:断言失败(0<=ROI.X&&0<=ROI.Width&&ROI.X+ROI.Width<=M.cols&&0<=ROI.Y&&0<=ROI.Height&&ROI.Y+ROI.Height<=M.rows),在CV::MAT中,文件C:\build\master_winpack-build-win64-vc14\OpenCV\modules\core\src\matrix.cpp,第522行

现在我明白了,出现错误是因为ROI超出了范围。但让我烦恼的是。

>

  • 当我一开始试图绘制矩形时,我不应该得到这个错误吗?为什么我在ROI上得到错误,而不是在我绘制的矩形上?

    为什么ROI越界?我显示的图像与矩形画在它和一切看起来很好。为什么当ROI与绘制的矩形具有相同的值时会出现此错误?

    请原谅我的任何新秀错误,我们都是从某个地方开始的。谢谢你的阅读,祝你有一个愉快的一天!

  • 共有1个答案

    强德厚
    2023-03-14

    roi.heightroi.width中,尝试分别给出面[i].height面[i].width。实际上,您可能会认为错误应该出现在前面,但在rect ROI的情况下,它可以使用矩形作为参数,使用两个对角相反的顶点,而不是宽度/高度。您可以用点(x,y)点(w,h)来初始化rect,它应该可以正常工作。

     类似资料:
    • 主要内容:第1步:加载OpenCV本机库,第2步:实例化CascadeClassifier类,步骤3:检测脸部包的类包含使用系统摄像头捕获视频的类和方法。 让我们来看看它是如何做到这一点。 第1步:加载OpenCV本机库 在使用OpenCV库编写Java代码时,需要做的第一步是使用加载OpenCV本地库。加载OpenCV本机库,如下所示。 第2步:实例化CascadeClassifier类 包的类用于加载分类器文件。 通过传递xml文件来实例化这个类,如下所示。 步骤3:检测脸部 可以使用类的方

    • 以下程序演示如何使用系统相机检测脸部并使用JavaFX窗口显示脸部。 参考以下示例代码 - 执行上面示例代码,得到以下结果 - 系统提示:头像太丑,无法显示…

    • 本文向大家介绍OpenCV实现人脸检测功能,包括了OpenCV实现人脸检测功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了OpenCV实现人脸检测功能的具体代码,供大家参考,具体内容如下 1、HAAR级联检测 2、 DNN人脸检测 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

    • 1.接口描述 对照片中的人脸进行检测,返回人脸数目和每张人脸的位置信息 图片要求 格式为 JPG(JPEG),BMP,PNG,GIF,TIFF 宽和高大于 8px,小于等于4000px 小于等于 5 MB 请求方式: POST 请求URL: https://cloudapi.linkface.cn/face/face_detect 2.请求参数 字段 类型 必需 描述 api_id string

    • 问题内容: 我正在尝试在android上进行人脸检测,并且正在遵循指南http://www.richardnichols.net/2011/01/java- facial-recognition-haar-cascade-with-jjil- guide/ 但是在android上。当我做 尽管确切的代码使用netbeans代码返回了2张面孔,但pushAndReturn似乎只从Android图像上

    • 调用人脸检测接口,返回人脸检测的结果 requestsyntax image = Image(uri="fds://cnbj2.fds.api.xiaomi.com/vision-test/test_img.jpg") detect_faces_request = DetectFacesRequest(image) faces_list = vision_client.analysis_faces