调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)

Posted

技术标签:

【中文标题】调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)【英文标题】:Debug Assertion Failed (unsigned)(c+1) <= 256 (in VideoCapture::open [Qt Creator]) 【发布时间】:2013-07-10 16:30:15 【问题描述】:

我一直在尝试在 QtCreator 中使用 cv::VideoCapture::open("")(opencv 添加)。即使程序在“bebug 模式”(调试版本)下运行时没有错误,它也会在 “发布模式”中出现以下运行时错误(发布版本)。

调试断言失败文件: f:/dd/vctools/crt_bld/self_x86/src/isctype.c 行:56 表达式: (无符号)(c+1)

这是一个简单的程序,仅使用 cv::VideoCapture::open() [用于测试目的]

下面是 .pro 文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp   
HEADERS  += mainwindow.h   
FORMS    += mainwindow.ui   

INCLUDEPATH += C:/C/opencv/build/include
INCLUDEPATH += C:/C/opencv/build/include/opencv  

LIBS += C:/C/opencv/build/x86/vc10/lib/opencv_highgui240d.lib
LIBS += C:/C/opencv/build/x86/vc10/lib/opencv_highgui240.lib


LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240d.dll
LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll

下面是头文件

#include <QMainWindow>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    cv::VideoCapture vcap;
;

以下是 .cpp 文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    vcap.open("C:/Users/ANURUDDHA/pedestrians/ThreePastShop2cor.mpg");


MainWindow::~MainWindow()

    delete ui;

当我将 int 作为参数传递给 cv::VideoCapture::open() [例如:vcap.open(0)] 时,它在调试和发布版本中运行时都没有错误,并成功打开网络摄像头.只有当我将字符串传递给参数时才会出现问题。

请有人对此有所了解。真的很感激。

【问题讨论】:

【参考方案1】:

看起来您正在链接库的调试和发布版本(两次?)。这在过去给我造成了问题。尝试仅将LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll 用于发布版本,将LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240d.dll 用于调试版本。

此外,0 与 NULL 相同。在断言失败之前,库可能会中止它正在做的任何事情(无论是调试还是发布)。您不应该在发布模式下遇到断言失败,但您这样做的事实告诉我,调试库已加载到您为发布模式编译的程序中。

编辑:

看起来有人已经在这里回答了你: http://answers.opencv.org/question/15838/videocaptureopenqt-creatordebug-assertion-failed/

【讨论】:

感谢彼得的回复。是的,我确实按照您的建议将它们单独包含在内。但是当我使用LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll 时,它就这样结束了; 程序意外结束。 C:\Users\ANURUDDHA\C++\untitled\release\untitled.exe 退出,代码为 -1073741515。当构建器找不到正确的库时,我遇到了这种情况。 请让我补充一点。当我在 release build 中仅使用 LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll 时出现上述错误。当我在 debug build 中仅使用 LIBS += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240d.dll 时,没有发生此类错误。程序运行成功。无法弄清楚为什么程序在发布版本中找不到opencv_highgui240.dll。 (如果这就是问题所在)。任何建议将不胜感激。 我不熟悉 Qt Creator,但在 MinGW 和 VC++ 编译器和链接器上,我不必将 DLL 文件指定为 lib —— 只需指定 lib 文件。您是否尝试过删除 LIB += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll 以进行发布(以及调试)? AFAIK,链接到 .lib 告诉程序它需要知道的关于它在运行时需要知道的 DLL 内容的所有信息。此外,在您的发布版本中,正确的 DLL 是否与发布版本的 exe 位于同一目录中? 彼得,再次感谢您的回复。删除 LIB += C:/C/opencv/build/x86/vc10/bin/opencv_highgui240.dll 并没有真正帮助。以前 dll 不包含在 exe 所在的目录中。我将 dll (opencv_highgui240.dll) 复制到工作目录中。但没有解决问题。我感兴趣的是,当我将 0 传递给 VideoCapture() 时,程序执行得很好。那是vcap.open(0);。仅当将 String 传递给它时才会出现错误。那是vcap.open("C:/Users/ANURUDDHA/pedestrians/ThreePastShop2cor.mpg"); VideoCapture() 应该同时采用 int 和 String (explained in opencv docs),但不知道为什么它在传递 String 时会中止..【参考方案2】:

我想我找到了答案,虽然这对我来说似乎有点模棱两可。无论如何,现在程序在发布模式下工作。 希望这可能对某人有所帮助。

我将 C:/C/opencv/build/x86/vc10/bin/ 中的 dll 文件复制到 Windows 系统文件夹。即 C:\Windows\SysWOW64。如果有人使用的是 32 位版本的 Windows,它应该是 System32。

【讨论】:

以上是关于调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PInvoke 连接 C/C++ DLL 的调试断言失败

c++错误:调试断言失败

使用 Opencv 时 C++ 调试断言失败

C++ 调试断言失败。向量下标超出范围

C-调试断言失败:_CrtIsValidHeapPointer(block)

堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)