Как получить видеокадры в Qt?

Я новичок в Qt, я знаю только основы: создание интерфейсов и подключение слотов. В нескольких словах мои знания совсем не глубокие.

Мне нужно открыть видеофайл и захватить все его кадры, чтобы получить каналы R, G, B и, позже, обрабатывать оптический поток (это уже сделано) кадр за кадром, чтобы, наконец, представить его в окне.

Можно ли получить кадры видео с помощью Qt? Я много исследовал, но не нашел ничего убедительного.

2 ответа

Решение

Я не знаю, почему я не смог включить необходимые заголовки Qt для обработки фреймов (они, казалось, всегда имели неразрешенные зависимости, а некоторые не существовали), поэтому я обратился к OpenCV 3.0 и сделал это следующим образом:

cv::VideoCapture cap(videoFileName);

if(!cap.isOpened())  // check if we succeeded
    return;

while (cap.isOpened())
{
    cv::Mat frame;
    cap >> frame;
    cv::flip(frame, frame, -1);
    cv::flip(frame, frame, 1);

    // get RGB channels
    w = frame.cols;
    h = frame.rows;
    int size          = w * h * sizeof(unsigned char);
    unsigned char * r = (unsigned char*) malloc(size);
    unsigned char * g = (unsigned char*) malloc(size);
    unsigned char * b = (unsigned char*) malloc(size);

    for(int y = 0; y < h;y++)
    {
        for(int x = 0; x < w; x++)
        {
            // get pixel
            cv::Vec3b color = frame.at<cv::Vec3b>(cv::Point(x,y));
            r[y * w + x] = color[2];
            g[y * w + x] = color[1];
            b[y * w + x] = color[0];
        }
    }
}

cap.release();

Это отлично сработало для моей цели, поэтому я не продолжал исследования.

Спасибо, в любом случае.

Вы можете использовать QMediaPlayer для достижения этой цели.

  1. Создайте экземпляр QMediaPlayer.
  2. Подкласс QAbstractVideoSurface.
  3. Установите вашу реализацию в качестве выхода для медиаплеера через QMediaPlayer::setVideoOutput,
  4. Накормите медиаплеер нужным файлом, и в конце концов он начнет звонить QAbstractVideoSurface::present(const QVideoFrame & frame) на вашей реализации QAbstractVideoSurface если видео было успешно загружено. Затем вы можете получить доступ к каналам и всему из QVideoFrame и нарисовать рамку на виджете.
Другие вопросы по тегам