我正在Qt上以15fps的速度从相机显示2800x2200的图像。
它以BGR格式发送数据,因此我使用QImage :: rgbSwapped()函数将BGR格式转换为RGB格式。
但是在我的PC上大约需要83毫秒,这导致了很多滞后。
我尝试使用QGLWidget,并且效果很好,但是它使其他小部件(例如,拆分栏,滑动条等)变慢。
是否可以直接显示BGR格式或加快Qt中的rgbSwapped()速度?
答案 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中进行了极大的优化(不记得它降落的位置了)