Debug Assertion失败了!在detectAndDisplay中,人脸识别openCv的功能

时间:2016-07-11 14:34:47

标签: c++ opencv face-recognition

我正在尝试运行该程序并且构建良好但无法调试。捕获第一帧然后给出以下错误。

我试图检查调试模式并且可以找出

imshow(window_name, frame);

Error !!!

以下是从OpenCV博客中复制的工作代码

            #include "opencv2/objdetect/objdetect.hpp"
            #include "opencv2/video/video.hpp"
            #include "opencv2/highgui/highgui.hpp"
            #include "opencv2/imgproc/imgproc.hpp"

            #include <iostream>
            #include <stdio.h>

            using namespace std;
            using namespace cv;

            /** Function Headers */
            void detectAndDisplay(Mat frame);

            /** Global variables */
            String face_cascade_name = "haarcascade_frontalface_alt.xml";
            String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
            CascadeClassifier face_cascade;
            CascadeClassifier eyes_cascade;
            string window_name = "Capture - Face detection";
            RNG rng(12345);

            /** @function main */
            int main(int argc, const char** argv)
            {
                CvCapture* capture;
                Mat frame;

                //-- 1. Load the cascades
                if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading\n"); return -1; };
                if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading\n"); return -1; };

                //-- 2. Read the video stream
                capture = cvCaptureFromCAM(CV_CAP_ANY);



                if (capture)
                {
                    while (true)
                    {
                        frame = cvQueryFrame(capture);

                        //-- 3. Apply the classifier to the frame
                        if (!frame.empty())
                        {
                            detectAndDisplay(frame);
                        }
                        else
                        {
                            printf(" --(!) No captured frame -- Break!");
                            break;
                        }

                        int c = waitKey(10);
                        if ((char)c == 'c') { break; }
                    }
                }
                return 0;
            }

            /** @function detectAndDisplay */
            void detectAndDisplay(Mat frame)
            {
                std::vector<Rect> faces;
                Mat frame_gray;

                cvtColor(frame, frame_gray, CV_BGR2GRAY);
                equalizeHist(frame_gray, frame_gray);

                //-- Detect faces
                face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

                for (size_t i = 0; i < faces.size(); i++)
                {
                    Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
                    ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);

                    Mat faceROI = frame_gray(faces[i]);
                    std::vector<Rect> eyes;

                    //-- In each face, detect eyes
                    eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

                    for (size_t j = 0; j < eyes.size(); j++)
                    {
                        Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);
                        int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
                        circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);
                    }
                }
                //-- Show what you got
                imshow(window_name, frame);
            }

中选择值时出错
 capture = cvCaptureFromCAM(-1) 

是-1。

我正在获得没有错误的灰色窗口。 imshow with Grey Window, No Error

2 个答案:

答案 0 :(得分:2)

我将平台工具集从 Visual Studio 2015(v140)更改为 Visual Studio 2013(v120),如附图所示。我不知道为什么,但它有效。

Visual Studio 2015(v140)

Visual Studio 2013(v120)

答案 1 :(得分:0)

如果您的面部投资回报率超出框架范围,可能会发生这种情况。 因为您尝试复制此区域时出现内存错误。

if(faces[i].x>=0 && faces[i].y >= 0 && faces[i].x+faces[i].width<frame_gray.cols && faces[i].y+faces[i].height < frame_gray.rows)
{
faceROI=frame_gray(faces[i]);
}