首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGLWidget::convertToGLFormat()

QGLWidget::convertToGLFormat()
EN

Stack Overflow用户
提问于 2015-08-07 11:05:06
回答 1查看 819关注 0票数 1

我想在具有QGraphicsScene视口的QGLWidget中显示视频纹理。

我用openCV阅读了视频,我抓取每一帧,将其转换为QImage,然后我做了:

代码语言:javascript
复制
QImage img=QGLWidget::convertToGLFormat(videoFrame);//videoFrame is the frame got from openCV video reading and converted to QImage

我的问题是,它可以很好地处理很多视频(我使用.mp4),但是对于其他视频(仍然是.mp4),这一行代码会使我的应用程序崩溃,而我无法找到原因。

我的问题是如何在不知道确切原因的情况下防止坠机?我试过:

代码语言:javascript
复制
QImage img;
try{
    img=QGLWidget::convertToGLFormat(videoFrame);
}
catch(...)
{
    img=QImage("defaultImg.jpg");
}

但它仍然坠毁在

代码语言:javascript
复制
img=QGLWidget::convertToGLFormat(videoFrame);

并且没有执行catch部分。

编辑:我得到的图像是:

代码语言:javascript
复制
QImage VideoPlayer::getVideoFrame()
{
    IplImage* frame= cvQueryFrame( capture );
    m=cv::Mat(frame);//m is a member of class VideoPlayer

    return cvMatToQImage(m);
}

QImage VideoPlayer::cvMatToQImage(cv::Mat inMat)
{
    cv::Mat temp;
    cv::cvtColor(inMat, temp,CV_BGR2RGB);
    QImage cvMatToQImg((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);

    return QImage(cvMatToQImg);
}

在我的QgraphicsScene子类中:

代码语言:javascript
复制
QImage videoFrame = videoPlayerInstance->getVideoFrame();
QImage img=QGLWidget::convertToGLFormat(videoFrame);//crashes here
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits());

Qt医生说:

QImage QGLWidget::​转换the (const QImage & img)将图像img转换为OpenGL函数(如glTexImage2D() )所期望的未命名格式。返回的映像不能作为QImage使用,但是QImage::width()、QImage::height()和QImage::bits()可以与OpenGL一起使用。使用的GL格式是GL_RGBA。

实际上,由于glTexImage2D中使用了width()、height()和bits()。我可以从videoFrame输出它们,没有问题,也没有崩溃。同样,它也适用于一些.mp4。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-10 15:23:58

Qt代码不会抛出异常,因此try...catch块是多余的。它会崩溃,因为videoFrame为null或指向解除分配的数据或somesuch。这就是问题所在。convertToGLFormat崩溃是传递垃圾图像的症状。

具体来说,您在cvMatToQImage中使用的cvMatToQImage构造函数正在构造一个使用临时缓冲区的图像。构造函数的文档规定:

缓冲区必须在QImage的整个生命周期内保持有效,并且所有未被修改或与原始缓冲区分离的副本都必须有效。

您应该强制图像保留矩阵。您可能也不能通过强制矩阵参数的副本来过早地悲观--而是传递一个const引用。

代码语言:javascript
复制
static void cvMatQImageCleanup(void *info) {
  delete reinterpret_cast<cv::Mat*>(info);
}

QImage VideoPlayer::cvMatToQImage(const cv::Mat & inMat)
{
    auto temp = new cv::Mat;
    cv::cvtColor(inMat, *temp, CV_BGR2RGB);
    return QImage((uchar*) temp->data, temp->cols, temp->rows, temp->step, 
      QImage::Format_RGB888, &cvMatQImageCleanup, temp);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31876212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档