Debug Assertion Failed Expression:_pFirstBlock == pHead使用OpenCV和C ++试图调用SurfFeatureDetector

时间:2014-01-21 15:02:29

标签: c++ opencv dll surf visual-c++-runtime

我使用OpenCV在C ++中使用此函数:

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

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

  return vKeypoints;
}

当我在main方法中调用此函数时,一切正常。

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;
}

...我收到以下错误:

enter image description here

谁能告诉我我的错误在哪里以及如何解决这个问题?我需要使用两个不同的图像调用此函数两次,但每次执行此操作时都会出现此错误。

我正在使用Visual Studio 2012。

3 个答案:

答案 0 :(得分:8)

我发现了自己的错误。我不小心复制了VC12文件夹的openCV-dll,因为我忘记了Visual Studio 2012是VC11。现在它有效。也许这会帮助其他有相同问题的人并复制错误文件夹的dll。

答案 1 :(得分:5)

我也有相同的Debug Assertion Failed(dbgheap.c Line:1424 Expression:_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路径(c:\ opencv \ build \ x64 \ vc11 \ bin),但我将我的代码与VC2012项目中的x86库链接。

在Windows中重新定义PATH变量以更正OpenCV x86路径(c:\ opencv \ build \ x86 \ vc11 \ bin)并重新启动VC2012后,dbgheap.c(1424)的断言失败将不会再次发生。< / p> @TheMotivation,你的回答激发了我的灵感。谢谢。

答案 2 :(得分:0)

这是库问题,在我的情况下改变了项目属性&#34;使用mfc&#34;从static到&#34;在共享DLL中使用MFC&#34;诀窍。