Функция QImage :: rgbSwapped () работает очень медленно - PullRequest
0 голосов
/ 09 апреля 2019

Я отображаю изображение 2800x2200 с камеры со скоростью 15 кадров в секунду на Qt.

Он отправляет данные в формате BGR, поэтому я преобразовал формат BGR в формат RGB с помощью функции QImage :: rgbSwapped ().

Но на моем компьютере это занимает около 83 мс, что приводит к таким большим задержкам.

Я попытался использовать QGLWidget, и он работает хорошо, но он замедляет работу других виджетов, например, разделить панель, слайдерbar и т. д.

Есть ли способ напрямую отобразить формат BGR или ускорить rgbSwapped () в Qt?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Вы можете сделать это с помощью 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 голос
/ 24 апреля 2019

Это большие изображения, поэтому они всегда будут занимать некоторое время, но вы можете ускорить rgbSwapped, выполнив его на rvalueref, например так:

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

Один хак, который вы можете попробовать, если ваш вводRGB32 использует QImage :: reinterpretAsFormat (QImage :: RGBX8888).Это будет на архитектурах с прямым порядком байтов (x86 и современный ARM) делать то же самое, что и rgbSwapped (), но не касаясь ни одного пикселя.Хотя подпрограммы, рисующие его, будут менее оптимизированы: /

Наконец, rgbSwapped для форматов, отличных от RGB32, значительно оптимизирован в Qt 5.12 или 5.13 (не помню, где он приземлился)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...