使用Opencv调试断言失败_pFirstBlock == pHead

时间:2014-11-07 14:58:14

标签: c++ opencv visual-c++ computer-vision assertions

我正在使用以下代码进行背景扣除。我给它视频路径,视频运行成功,但最后它给出了 Debug Assertion Failed error

enter image description here

我在Microsoft Visual Studio中使用以下代码来解决使用opencv的计算机视觉问题。

#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>
#include<vector>    
#include "opencv2/video/background_segm.hpp"
using namespace cv;
using namespace std;

int main()
{   
    Mat frame;
    Mat back;
    Mat fore;

    VideoCapture cap;
    cap.open("H:/competition.avi");

    BackgroundSubtractorMOG2 bg(100,16,true);    
    bg.set("nmixtures",3);

    vector<vector<Point> > contours;

    namedWindow("Frame");
    namedWindow("Background");

    for(;;)
    {
        cap >> frame;
        if(!frame.empty())
        {
            bg.operator ()(frame,fore);
            bg.getBackgroundImage(back);
            erode(fore,fore,Mat());
            dilate(fore,fore,Mat());
            findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
            drawContours(frame,contours,-1,Scalar(0,0,255),2);
            imshow("Frame",frame);
            imshow("Background",back);
            if(waitKey(30) >= 0) break;
        }
        else
            break;
    }
    return 0;
}

5 个答案:

答案 0 :(得分:4)

我刚刚遇到这个问题并经过严肃的网络拖网搜索后找到了答案,至少它在我的案例中起作用了......

您需要转到Visual Studio项目设置,c / c ++,代码生成以及将运行时库更改为多线程调试DLL(/ MDd)。

似乎这个错误来自试图在多线程项目中运行的单线程DLL,或者那种性质的东西。

祝你好运!

答案 1 :(得分:1)

由于未知原因,某些版本的opencv(至少2.x)有一个CMake变量“BUILD_WITH_STATIC_CRT”,默认设置为on,从而导致类似的问题。禁用该标志,然后应该使用/ MDd定义生成解决方案。

其次,在依赖walker中打开你的exe文件。查找多个版本的MS C ++运行时库。例如,您可能有针对msvcp110.dll(visual studio 2012)构建的QT版本,但您当前的项目使用msvcp120.dll(visual studio 2013)。

答案 2 :(得分:0)

好的。第一件事:点击Retry,假设您正在调试( F5 ),并且没有通过点击( Ctrl + F5 )启动(运行)程序。一旦你点击Retry,你就会在调试器中看到调用堆栈。

调用堆栈将为您提供可能的提示,其中发生无效/双重释放/删除。这将是您分析问题的起点。查看是否有一些内存被双重释放,使用不同的堆分配(例如,使用malloc,并且delete d)。或者,如果由VC9(例如)分配的内存被VC8中编写的DLL释放。

答案 3 :(得分:0)

我有同样的错误,

文件:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c第1424行

表达式:_pFirstBlock == pHead

在测试用于增强现实的opencv代码时在vs12上使用调试模式时,为了参考,我使用的代码来自here

对我有用的解决方案:在我更新了发布模式的visual studio设置之后,问题就消失了,即使我只使用调试。其他opencv代码在调试模式下运行没有问题,所以我没有费心完全配置发布设置。

无论如何,在发布时我必须更新的部分是属性 - &gt; C ++ - &gt;附加包含目录;和属性 - &gt;链接器 - &gt;输入 - &gt;额外的依赖关系。之后,代码在调试模式和发布模式下无错运行。如果您不知道要使用哪些设置,它们会列在opencv网站的设置说明页面中,vs12说明为here

答案 4 :(得分:0)

我遇到了同样的问题。 我通过这个URL找到解决方案。 Debug Assertion Failed Expression: _pFirstBlock == pHead using OpenCV and C++ trying to call SurfFeatureDetector

此错误的原因是配置问题,vs2012与vc11文件夹匹配。 这可能会对你有帮助。