2015-06-12 5 views
6

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

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

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

+0

Вы проверили документацию? http://doc.qt.io/qt-5/videooverview.html –

+0

Эта [ссылка] (http://stackoverflow.com/questions/38468644/getting-video-frame-in-provided-time-qt/38484477 # 38484477) может помочь вам захватить кадры из видеофайла. – Jeet

ответ

1

Я не знаю, почему я не мог включить необходимые заголовки 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(); 

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

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

6

Для этого вы можете использовать QMediaPlayer.

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

Я не могу найти QMediaPlayer в любом месте. Я установил Qt через qt-unified-mac-x64-2.0.1-online.dmg, но у меня нет пакета мобильности – Leo

+0

@Leo Это не должно быть в пакете мобильности, просто добавьте '#include < QMediaPlayer> 'для ваших источников и' QT + = multimedia' в ваш файл '.pro', как указано в http://doc.qt.io/qt-5/qmediaplayer.html. Также я не знаком с версиями osx, но 2.0.1 кажется странным - какая версия QT? –

Смежные вопросы