OpenCV QT, отображение кадров видео (без использования L oop) - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть простой личный проект, в котором для отображения видео в QLabel используются платформы QT и OpenCV. Я знаю, как сделать преобразования в QImage и настроить Pixmap.

Однако видео работает слишком быстро при l oop, и когда я проверял, fps равен 29 или 30, независимо от того, какое видео Я загружаю. Чтобы противостоять этому, я также реализовал QTimer для запуска при загрузке видео. Я не уверен, как использовать это для отображения кадров с соответствующей частотой кадров, которую мне нужно установить.

Любая идея, как я могу это реализовать?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я уже делал преобразование mat в QImage в своем проекте.

static QImage Mat2QImage(const cv::Mat3b &src) {
    QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
    for (int y = 0; y < src.rows; ++y) {
        const cv::Vec3b *srcrow = src[y];
        QRgb *destrow = (QRgb*)dest.scanLine(y);
        for (int x = 0; x < src.cols; ++x) {
            destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
        }
    }
    return dest;
}

использование может быть таким:

void foo::timeout() // A slot which QTimer's timeout signal is connected to
{
    // I didn't tested the code but it should work
    Mat frame;
    m_cap >> frame;
    QImage img = Mat2QImage(frame);

    QPixmap pixmap = QPixmap::fromImage(img);
    ui->streamDisplay->setPixmap(pixmap);
}

Насколько я помню, изображение Mat должно быть ARGB32. Это было сработано на скорости 30 кадров в секунду.

Я слышал, что наилучшим эффективным решением является использование QOpenglWidget, но я не знаю, как реализовать такую ​​же функциональность. Может быть, вы можете посмотреть.

моя старая ссылка на репо

display-code- cpp

изображения conversion- cpp

0 голосов
/ 04 февраля 2020

Нет ничего плохого в использовании while-l oop, вам просто нужно правильно рассчитать частоту кадров и затем уснуть для каждого l oop, просто сделайте это так:

int FPS = static_cast<int>(capture.get(cv::CAP_PROP_FPS));
uint delayTime = static_cast<uint>(1000 / FPS);
while(capture.read(frame))
{
    // process the frame 
    ...
    // now sleep (milli secconds)
    QThread::msleep(delayTime);
}

Теперь видео будет отображаться с нормальной скоростью.

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