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

时间:2016-08-26 09:02:41

标签: c++ qt opencv

我一直在尝试使用OpenCV捕获相机Feed,并在Qt中将其显示为QLabel。根据我发现的指南,这在一定程度上起作用。但是,如果我在创建QImage并设置Pixmap之前尝试调整Mat的大小,应用程序就会完全崩溃。崩溃的类型是“CameraSoftware.exe已经停止工作”,因此除了找出它崩溃的地方之外,很难进行调试。

环境是使用QtCreator 3.6.0(Qt 5.5.1)和OpenCV 3.10的64位窗口。

以下是重要的代码:

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);
}

将其发送回QLabel小部件:

void VideoStreamWidget::receiveFrame(QImage frame){
    this->setPixmap(QPixmap::fromImage(frame));
}

这就是它在“setpixmap”行上崩溃的地方。

Qlabel简单地添加到QMainWindow中:

QVBoxLayout *pictureLayout = new QVBoxLayout;
VideoStreamWidget *video = new VideoStreamWidget();
pictureLayout->addWidget(video);

无论出于何种原因,原始上限图片为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).

1 个答案:

答案 0 :(得分:0)

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

emit sendFrame(output.copy());

诀窍。我仍然不确定为什么这首先发生的事情以及为什么这会解决问题。