我正在使用以下代码进行背景扣除。我给它视频路径,视频运行成功,但最后它给出了 Debug Assertion Failed error 。
我在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;
}
答案 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文件夹匹配。 这可能会对你有帮助。