Обнаружение лиц с помощью OpenCV CascadeClassifier: .exe сработал точку останова

Я пытаюсь написать простую программу, которая считывает изображение, обнаруживает лицо на изображении и отмечает лицо прямоугольником на изображении. Я использую Visual Studio 2012 и OpenCV 2.4.9.

Я использую cv :: CascadeClassifier и haarcascade_frontalface_default.xml, которые предоставляются OpenCV. Вот мой код:

#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/objdetect/objdetect.hpp>

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

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{

    //load image, in this case it's allready gray
    Mat img = imread("H:/BioID/BioID-FaceDatabase-V1.2/BioID_0000.pgm");

    Mat grayImg;   
    cvtColor(img, grayImg, CV_BGR2GRAY);

    //create vector of rectangles that will represent the faces
    vector<Rect> faces;

    CascadeClassifier* faseCascade = new CascadeClassifier("C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml");

    faseCascade->detectMultiScale(grayImg, faces);

    //draw rectangle on img; param: image, rectangle, color
    cv::rectangle(img, faces[0],Scalar(255,0,0),2); 

    //display image
    imshow("image", img);

    waitKey(0);     

    return 0;
}

Программа работает нормально, в итоге показывает мне изображение с синим прямоугольником вокруг лица. Но после того, как я нажимаю клавишу, и программа пытается закрыть, она ломается.

Вывод показывает:

HEAP[myProgram.exe]: Invalid address specified to RtlValidateHeap( 00000004F9F30000, 00000004FC23ECE0 )
myProgram.exe has triggered a breakpoint.

Если я закомментирую функцию detectMultiscale и функцию рисования прямоугольника. Программа работает без ошибок.

У кого-нибудь есть идеи, что я сделал не так?

Спасибо за вашу помощь!


person elHam    schedule 25.05.2016    source источник
comment
Можете ли вы добавить освобождение faseCascade перед возвратом?   -  person saurabheights    schedule 26.05.2016
comment
Есть ли конкретная причина использовать устаревшую версию OpenCV? Режим отладки или выпуска? С какими библиотеками вы связались?   -  person Dan Mašek    schedule 26.05.2016
comment
@saurabheights Когда я делаю delete faceCascade перед возвращением, я получаю то же сообщение об ошибке, что и раньше, только после команды удаления в конце программы.   -  person elHam    schedule 26.05.2016
comment
@ DanMašek Нет другой причины, кроме того, что мои предшественники использовали версию 2.4.9, а я продолжал ее использовать. Я нахожусь в режиме отладки. Я связан с этими библиотеками: opencv_calib3d249d.lib opencv_contrib249d.lib opencv_core249d.lib opencv_features2d249d.lib opencv_flann249d.lib opencv_gpu249d.lib opencv_highgui249d.lib opencv_imgproc249d.lib opencv_legacy249d.lib opencv_ml249d.lib opencv_nonfree249d.lib opencv_objdetect249d.lib opencv_photo249d.lib opencv_stitching249d.lib opencv_ts249d. библиотека opencv_video249d.lib opencv_videostab249d.lib   -  person elHam    schedule 26.05.2016


Ответы (1)


Проблема заключалась в том, что у меня был неправильный путь к папке bin opencv в моих переменных среды. Недавно я перестал использовать Visual Studio 2010, начал использовать VS2012 и забыл изменить путь. Мне пришлось изменить его с
C: \ opencv \ build \ x64 \ vc10 \ bin;
на
C: \ opencv \ build \ x64 \ vc11 \ bin;
и перезагрузить компьютер.

Теперь вроде все работает нормально.

person elHam    schedule 26.05.2016