C++ 当OpenCV中的图片太大时,Qt崩溃

C++ 当OpenCV中的图片太大时,Qt崩溃,c++,qt,opencv,C++,Qt,Opencv,我一直在尝试使用OpenCV来捕获一个摄像头提要,并在Qt中将其显示为QLabel。根据我找到的指南,这在一定程度上是有效的。但是,如果我在制作QImage并设置Pixmap之前尝试调整Mat的大小,应用程序就会彻底崩溃。崩溃类型为“CameraSoftware.exe已停止工作”,因此除了找出崩溃的位置外,很难进行调试 环境是带有QtCreator 3.6.0(Qt 5.5.1)和OpenCV 3.10的64位windows 以下是重要的代码位: void VideoStreamOpenCVW

我一直在尝试使用OpenCV来捕获一个摄像头提要,并在Qt中将其显示为
QLabel
。根据我找到的指南,这在一定程度上是有效的。但是,如果我在制作
QImage
并设置Pixmap之前尝试调整Mat的大小,应用程序就会彻底崩溃。崩溃类型为“CameraSoftware.exe已停止工作”,因此除了找出崩溃的位置外,很难进行调试

环境是带有QtCreator 3.6.0(Qt 5.5.1)和OpenCV 3.10的64位windows

以下是重要的代码位:

void VideoStreamOpenCVWorker::receiveGrabFrame()
{
    if(!toggleStream) return;

    (*cap) >> frameOriginal;
    if(frameOriginal.empty()) return;

    process();

    qDebug() << frameProcessed.cols << "x" << frameProcessed.rows;

    QImage output((const unsigned char *) frameProcessed.data, frameProcessed.cols, frameProcessed.rows, QImage::Format_RGBA8888);

    emit sendFrame(output);
}


void VideoStreamOpenCVWorker::process()
{
    cv::cvtColor(frameOriginal, frameProcessed, cv::COLOR_BGR2RGBA);
    cv::Size size(641,481);
    cv::resize(frameProcessed, frameProcessed, size);
}
这就是它具体崩溃的地方,在“setpixmap”行

Qlabel被添加到QMainWindow中,只需执行以下操作:

QVBoxLayout *pictureLayout = new QVBoxLayout;
VideoStreamWidget *video = new VideoStreamWidget();
pictureLayout->addWidget(video);
最初的cap图片是640x480,无论出于什么原因,我使用的相机是全高清相机。知道是什么引起的吗?Qt窗口的大小似乎并不重要,因为我可以直接添加一张大图片。我就是不能调整任何东西的大小而不崩溃

如果我没有提供足够的信息,就直接问吧

编辑:我更新了我的调试器,并在执行setPixmap行时收到此错误消息:

The inferior stopped because it triggered an exception.
Stopped in thread 0 by: Exception at 0x7ffe38fdadbb, code: 0xc0000005:
read access violation at: 0x0, flags=0x0 (first chance).

感谢Mailerdaimon提供了答案。将输出作为副本发出

emit sendFrame(output.copy());

这就是诀窍。我仍然不确定为什么首先会发生这种情况,为什么会解决问题。

为什么很难调试?在调试器下运行你的应用程序。我知道它在哪里崩溃,我只是不知道如何、为什么或者怎么做。很难调试的原因是,我没有收到可以读取的错误消息。应用程序只是硬锁,其中一个窗口“thisapplication.exe已停止工作”,而不是通常的错误消息。@Excludos确保frameProcessed有足够的内存来存储映像。@Excludos尝试使用运算符new创建QImage(在堆上分配)并将指针发送到插槽。或者尝试显式复制:
emit-sendFrame(output.copy())
之所以发生这种情况,是因为
QImage
包装了一个帧,该帧的生存期和内容没有绑定到
QImage
的生存期。当
QImage
仍然引用数据时,源帧可能会重新分配或被销毁。如果不是因为不调整大小它就可以工作,这听起来是一个不错的解释。谢谢它解决了问题!!!
emit sendFrame(output.copy());