Выражение сбоя утверждения отладки: _pFirstBlock == pHead с использованием OpenCV и C++ пытается вызвать SurfFeatureDetector

У меня есть эта функция в C++ с использованием OpenCV:

vector<KeyPoint> test(Mat img)
{
  int minHessian = 400;
  SurfFeatureDetector detector( minHessian );

  vector<KeyPoint> vKeypoints;
  detector.detect( img, vKeypoints );

  return vKeypoints;
}

Когда я вызываю эту функцию в моем основном методе, все работает нормально.

int main( int, char** argv )
{
    // path to a image-file
    char* input = "image.jpg";

    // read image into Mat img
    Mat img = imread( input, CV_LOAD_IMAGE_GRAYSCALE );

    // call function test
    test(img);

    waitKey(0);
    return 0;
}

Но как только я вызываю этот метод дважды...

int main( int, char** argv )
{
    // path to a image-file
    char* input = "image.jpg";

    // read image into Mat img
    Mat img = imread( input, CV_LOAD_IMAGE_GRAYSCALE );

    // call function test
    test(img);
    test(img); // <-- !!! second call

    waitKey(0);
    return 0;
}

... я получаю следующую ошибку:

Может кто-нибудь сказать мне, где моя ошибка и как я мог это исправить? Мне нужно вызвать эту функцию дважды с двумя разными изображениями, но каждый раз, когда я делаю это, я получаю эту ошибку.

Я использую Visual Studio 2012.

3 ответа

Решение

Я нашел свою ошибку. Я случайно скопировал openCV-dll из папки VC12, потому что я забыл, что Visual Studio 2012 - это VC11. Теперь это работает. Может быть, это поможет кому-то, кто имеет ту же проблему и скопировал dll из неправильной папки.

У меня также был тот же сбой отладочного утверждения (строка dbgheap.c: выражение 1424: _pFirstBlock == pHead). Я использую Visual Studio 2012 Professional (vc11) для компиляции с OpenCV 2.4.9.

int main(){
    SurfFeatureDetector detector(50);
    std::vector<KeyPoint> keypoints[502];
    //In my case, some ranges in for-loop may success without Assertion failed.
    for(int j=0;j<502;j++){
        sprintf(filename, "../../%06d.bmp", j);
        img[j] = imread(filename);
        detector.detect(img[j], keypoints[j]);
        waitKey(10);
    }
    printf("leaving main()\n");
    //Debug Assertion Failed after leaving main()
}

Моя ошибка заключается в том, что я установил системную переменную PATH равным OpenCV x64 path (c:\opencv\build\x64\vc11\bin), но я связал свой код с библиотеками x86 в проекте VC2012.

После переопределения переменной PATH в Windows, чтобы исправить путь OpenCV x86 (c:\opencv\build\x86\vc11\bin) и перезапустить мой VC2012, сбой подтверждения dbgheap.c(1424) больше не произойдет.

@TheMotivation, Ваш ответ вдохновил меня. Спасибо.

Это проблема библиотеки, в моем случае изменившее свойство проекта "Использование mfc" со статического на "Использовать MFC в общей DLL".

Другие вопросы по тегам