Mat格式转QImage格式,对QImage对象操作时崩溃(QImge::scaled或其他操作)

最近编写QT+opencv视觉计算框架时,遇到了崩溃问题,已经解决,今天记录一下。
环境:QT5.9.0(MSVC2015 32bit编译器)+opencv4.1.1(MSVC2015 32bit自行编译版)
问题描述:重写QThread的run函数,开启了一个子线程进行摄像头图像采集,然后通过信号槽将QImage对象发送到主界面进行显示,结果在主界面槽中对QImage对象进行缩放的时候,程序异常崩溃了。
崩溃原因:子线程中通过opencv采集到了Mat格式的图片:

    Mat mat=camera->read();
    

然后使用MattoQImage转化函数转成QImage格式:

QImage image =camera->MattoQImage(mat);
/*函数原型
QImage Camera::MattoQImage(Mat mat)
{
    cvtColor(mat,mat,CV_BGR2RGB);
    QImage image(mat.data,
                 mat.cols,
                 mat.rows,
                 QImage::Format_RGB888);
    return image;
}
*/

之后,我将这个QImage对象直接通过信号槽进行了传递:

emit updateImage(image);

主界面类中的槽函数:

void MainWindow::updateImagefrom_threadCameraBelow(	QImage image)
{
    QImage image2=image_camerabelow.scaled(480,360,Qt::IgnoreAspectRatio); //执行到这句程序崩溃
    ui->label_camera->setPixmap(QPixmap::fromImage(image2)); 
}

解决方法:
不要将image对象直接传递,换成使用QImage::copy将image拷贝一份,然后进行传递

    QImage image =camera->MattoQImage(mat);
    image_copy=image.copy(image.rect());
    emit updateImage(image_copy);

妈妈再也不担心我的程序崩溃了

发布了18 篇原创文章 · 获赞 5 · 访问量 6686

猜你喜欢

转载自blog.csdn.net/Sun_tian/article/details/103275596
今日推荐