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

媽媽再也不擔心我的程序崩潰了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章