0
votes

So, I extracted OpenCV 3.0.0 in C:/ and after 3 days of troubleshooting here and there, I was able to run the example code for face detector (just the face not the eyes) given at the OpenCV tutorials.

Details you may be interested to know:
OpenCV version: 3.0.0 Beta(official site)
OS: Windows 7 x64
Project Configuration: x64
IDE used: MS Visual Studio 2013
C++ Compiler: MS VC++
Programming Language: C++

[In properties]
Included headers:
C:\opencv\build\include\
C:\opencv\build\include\opencv\
C:\opencv\build\include\opencv2\

Linker->General->Additional Library Directories:
C:\opencv\build\x64\vc12\lib\
C:\opencv\build\x64\vc12\bin\

Libraries used:(These libraries contain the combined of all object binaries)
opencv_world300d.lib
opencv_ts300d.lib

Note: The libraries used are prebuilt binaries with OpenCV.

Debugging options:
Environment Path: PATH=C:\opencv\build\x64\vc12\bin\

Here is the code:

    #include "opencv2/objdetect.hpp"
    #include "opencv2/videoio.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/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";

    /** @function main */
    int main(void)
    {
        VideoCapture capture;
        Mat frame;

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

        //-- 2. Read the video stream
        capture.open(0);
        if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }

        while (capture.read(frame))
        {
            if (frame.empty())
            {
                printf(" --(!) No captured frame -- Break!");
                break;
            }

            //-- 3. Apply the classifier to the frame
            detectAndDisplay(frame);

            int c = waitKey(10);
            if ((char)c == 27) { break; } // escape
        }
        return 0;
    }

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

        //Conversion of frame to grayscale
        cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 
        //Contrast enhance(Spread out intensity distribution)
        equalizeHist(frame_gray, frame_gray);       

        //-- Detect faces
        face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
        cout << faces.size();

        for (size_t i = 0; i < faces.size(); i++)
        {
            Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
            ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 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 | CASCADE_SCALE_IMAGE, Size(30, 30));
            /*
            for (size_t j = 0; j < eyes.size(); j++)
            {
                Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
                int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
                circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
            }*/
        }
        //-- Show what you got
        imshow(window_name, frame);
    }

I then tried a different classifier, i.e, the banana_classifier provided by mrnugget : https://github.com/mrnugget/opencv-haar-classifier-training/blob/master/trained_classifiers/banana_classifier.xml

I made changes to the above code. I wrote the following code:(for banana classifier)

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

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

using namespace std;
using namespace cv;

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

/** Global variables */
String banana_cascade_name = "banana_classifier.xml";
CascadeClassifier banana_cascade;
String window_name = "Capture - Face detection";

/** @function main */
int main(void)
{
    VideoCapture capture;
    Mat frame;

    //-- 1. Load the cascades
    if (!banana_cascade.load(banana_cascade_name)){ printf("--(!)Error loading face cascade\n"); return -1; };

    //-- 2. Read the video stream
    capture.open(0);
    if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }

    while (capture.read(frame))
    {
        if (frame.empty())
        {
            printf(" --(!) No captured frame -- Break!");
            break;
        }

        //-- 3. Apply the classifier to the frame
        detectAndDisplay(frame);

        int c = waitKey(10);
        if ((char)c == 27) { break; } // escape
    }
    return 0;
}

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

    //Conversion of frame to grayscale
    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    //Contrast enhance(Spread out intensity distribution)
    equalizeHist(frame_gray, frame_gray);
    //-- Detect Banana
    banana_cascade.detectMultiScale(frame_gray, bananas, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    cout << bananas.size();

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

    }
    //-- Show what you got
    imshow(window_name, frame);
}

My Problem:
As you can see that, I have commented some code in the face detector code(my first code), i.e, the code to detect individual eyes.
This commented code(if uncommented) and the code for banana_classifier both give me same error: OpenCV : 0xC0000005: Access violation reading location 0xFFFFFFFF3F46895C

What I tried:
I debugged the program and found the exception occurs at the call to eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); and,

banana_cascade.detectMultiScale(frame_gray, bananas, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

The stack trace is given as:

>   opencv_world300d.dll!000007fed4974939() Unknown
    opencv_world300d.dll!000007fed496bf7b() Unknown
    opencv_world300d.dll!000007fed495eecb() Unknown
    opencv_world300d.dll!000007fed4985367() Unknown
    opencv_world300d.dll!000007fed496bb78() Unknown
    opencv_world300d.dll!000007fed41b2b27() Unknown
    opencv_world300d.dll!000007fed41b2bd6() Unknown
    opencv_world300d.dll!000007fed41b3b92() Unknown
    opencv_world300d.dll!000007fed41b280a() Unknown
    opencv_world300d.dll!000007fed41b29cf() Unknown
    opencv_world300d.dll!000007fed41b0172() Unknown
    [External Code] 

Problem Screenshots:
Exception

And, if I run it without Debugging,
Run without Debugging

Why is the exception occurring for eyes and banana. Is it related to values of the parameters passed or the classifier used or the OpenCV library itself! Anyone knowing anything in this regard, please share a solution here.

1

1 Answers

0
votes

You can remove from your included headers:

C:\opencv\build\include\opencv\
C:\opencv\build\include\opencv2\

and

C:\opencv\build\x64\vc12\bin\

from your additional library path.

About your problem, as your code seem correct, it looks like it's a problem between opencv3.0.0 and the haar cascades. You could try another eyes cascade?