最近编写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);
妈妈再也不担心我的程序崩溃了