最近編寫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);
媽媽再也不擔心我的程序崩潰了