QImage :: rgbSwapped()函数工作非常慢

时间:2019-04-09 03:00:32

标签: qt

我正在Qt上以15fps的速度从相机显示2800x2200的图像。

它以BGR格式发送数据,因此我使用QImage :: rgbSwapped()函数将BGR格式转换为RGB格式。

但是在我的PC上大约需要83毫秒,这导致了很多滞后。

我尝试使用QGLWidget,并且效果很好,但是它使其他小部件(例如,拆分栏,滑动条等)变慢。

是否可以直接显示BGR格式或加快Qt中的rgbSwapped()速度?

2 个答案:

答案 0 :(得分:2)

您可以通过内置函数OpenCV来做到这一点,例如:

QImage matToQImage(const cv::Mat &mat)
{
    if(mat.channels() == 1) { // if grayscale image
        return QImage((uchar*)mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_Grayscale8).copy();
    } 
    if(mat.channels() == 3) { // if 3 channel color image
        cv::Mat rgbMat;
        cv::cvtColor(mat, rgbMat, cv::COLOR_BGR2RGB); // invert BGR to RGB
        return QImage((uchar*)rgbMat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_RGB888).copy();
    }
    return QImage();
}

现在它将足够快地工作。

答案 1 :(得分:1)

这些都是大图像,因此它们总是要花费一些时间,但是您可以通过在rvalueref上执行来加快rgbSwapped的速度,如下所示:

img = std::move(img).rgbSwapped();

如果您输入的是RGB32,则可以尝试使用QImage :: reinterpretAsFormat(QImage :: RGBX8888)。这将在低端字节序的架构(x86和现代ARM)上执行相同的rgbSwapped(),但不会触碰单个像素。绘制它的例程虽然不会被优化:/

最后,在RGB32以外的格式上切换到rgb在Qt 5.12或5.13中进行了极大的优化(不记得它降落的位置了)