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 cuncommented) 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:
And, if I run it 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.