title: OpenCV Face Detection(Haar Classifier): 0xC0000005: Access violation reading location 0xFFFFFFFF3F46895C
body: <p>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 <strong>face detector</strong> (just the face not the eyes) given at the OpenCV tutorials.<br></p>
  
  <p><strong>Details you may be interested to know:</strong><br>
  <strong>OpenCV version:</strong> 3.0.0 Beta(official site)<br>
  <strong>OS</strong>: Windows 7 x64<br>
  <strong>Project Configuration:</strong> x64<br>
  <strong>IDE used:</strong> MS Visual Studio 2013<br>
  <strong>C++ Compiler:</strong> MS VC++<br>
  <strong>Programming Language:</strong> C++<br></p>
  
  <p><strong>[In properties]</strong><br>
  <strong>Included headers:</strong> <br>
  C:\opencv\build\include\<br>
  C:\opencv\build\include\opencv\<br>
  C:\opencv\build\include\opencv2\<br></p>
  
  <p><strong>Linker->General->Additional Library Directories:</strong><br>
  C:\opencv\build\x64\vc12\lib\<br>
  C:\opencv\build\x64\vc12\bin\<br></p>
  
  <p><strong>Libraries used:</strong>(These libraries contain the combined of all object binaries)<br>
  opencv_world300d.lib<br>
  opencv_ts300d.lib<br></p>
  
  <p><strong>Note:</strong> The libraries used are prebuilt binaries with OpenCV.</p>
  
  <p><strong>Debugging options:</strong><br>
  <strong>Environment Path:</strong> PATH=C:\opencv\build\x64\vc12\bin\<br></p>
  
  <p>Here is the code:<br></p>
  
  <pre><code>    #include "opencv2/objdetect.hpp"
      #include "opencv2/videoio.hpp"
      #include "opencv2/highgui.hpp"
      #include "opencv2/imgproc.hpp"
  
      #include &lt;iostream&gt;
      #include &lt;stdio.h&gt;
  
      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&lt;Rect&gt; 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 &lt;&lt; faces.size();
  
          for (size_t i = 0; i &lt; 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&lt;Rect&gt; 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 &lt; 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);
      }
  </code></pre>
  
  <p>I then tried a different classifier, i.e, the <strong>banana_classifier</strong> provided by <strong>mrnugget</strong> : <a href="https://github.com/mrnugget/opencv-haar-classifier-training/blob/master/trained_classifiers/banana_classifier.xml" rel="nofollow noreferrer">https://github.com/mrnugget/opencv-haar-classifier-training/blob/master/trained_classifiers/banana_classifier.xml</a><br></p>
  
  <p>I made changes to the above code. I wrote the following code:(for banana classifier)<br></p>
  
  <pre><code>#include "opencv2/objdetect.hpp"
  #include "opencv2/videoio.hpp"
  #include "opencv2/highgui.hpp"
  #include "opencv2/imgproc.hpp"
  
  #include &lt;iostream&gt;
  #include &lt;stdio.h&gt;
  
  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&lt;Rect&gt; 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 &lt;&lt; bananas.size();
  
      for (size_t i = 0; i &lt; 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);
  }
  </code></pre>
  
  <p><strong>My Problem:</strong> <br>
  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.<br>
  This commented code(if uncommented) and the code for <strong>banana_classifier</strong> both give me same error: <strong>OpenCV : 0xC0000005: Access violation reading location 0xFFFFFFFF3F46895C</strong><br></p>
  
  <p><strong>What I tried:</strong><br>
  I debugged the program and found the exception occurs at the call to <code>eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));</code>
  and,</p>
  
  <pre><code>banana_cascade.detectMultiScale(frame_gray, bananas, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
  </code></pre>
  
  <p>The stack trace is given as:<br></p>
  
  <pre><code>&gt;   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] 
  </code></pre>
  
  <p><strong>Problem Screenshots:</strong><br>
  <img src="https://i.stack.imgur.com/Z14A9.png" alt="Exception"></p>
  
  <p>And, if I run it without Debugging,<br>
  <img src="https://i.stack.imgur.com/0Segi.png" alt="Run without Debugging"></p>
  
  <p>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.</p>