【问题标题】:Debug Assertion Failed _pFirstBlock == pHead using Opencv调试断言失败 _pFirstBlock == pHead 使用 Opencv
【发布时间】:2017-07-21 10:16:20
【问题描述】:

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

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

【问题讨论】:

  • 你尝试调试了吗?即使崩溃发生在系统或库文件中,您也可以将调用堆栈向上遍历到您的代码以查看它发生的位置。
  • 确保链接到正确的库。在调试模式下构建并链接到发布模式库可能会导致此类问题。
  • @CaptainObvlious 我已经检查过了。所有库都在调试和发布模式下正确链接。
  • @JoachimPileborg 我尝试调试它并在库文件中停止在 _pFirstBlock == pHead 行。

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


【解决方案1】:

我刚刚遇到这个问题,经过认真的网络拖网,找到了答案,至少它在我的情况下有效......

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

似乎此错误来自试图在多线程项目中运行的单线程 DLL,或类似性质的东西。

祝你好运!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 请查看调用堆栈,找出调用该例程的函数。
      • 调试在 dbgheap.c 文件的这一行停止。 _ASSERTE(_pFirstBlock == pHead) 和调用堆栈在这种情况下没有预期的帮助,因为 _pFirstBlock 和 pHead 包含内存引用。
      • 你需要付出一些努力。学习调试。
      【解决方案4】:

      我有同样的错误,

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

      表达式:_pFirstBlock == pHead

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

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

      无论如何,特别是在发布时,我必须更新的部分位于属性 -> C++ -> 附加包含目录中;和属性 -> 链接器 -> 输入 -> 附加依赖项。之后,代码在调试模式和发布模式下运行无错误。如果你不知道用什么设置,opencv网站的设置说明页里都有,vs12说明是here

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-28
          • 1970-01-01
          相关资源
          最近更新 更多