2015-06-12 8 views
6

Jestem nowy w Qt, znam tylko podstawy: tworzenie interfejsów i łączenie gniazd. W kilku słowach moja wiedza wcale nie jest głęboka.Jak pobrać klatki wideo w Qt?

Potrzebuję otworzyć plik wideo i przechwycić wszystkie jego klatki, aby uzyskać kanały R, G, B, a następnie, przetwarzać przepływ optyczny (to już zrobiono) klatkę do ramki, aby w końcu przedstawić ją w oknie .

Czy można uzyskać klatki wideo za pomocą Qt? Wiele się dowiedziałem, ale nie znalazłem niczego rozstrzygającego.

+0

Czy sprawdziłeś dokumentację? http://doc.qt.io/qt-5/videooverview.html –

+0

Ten [link] (http://stackoverflow.com/questions/38468644/getting-video-frame-in-provided-time-qt/38484477 # 38484477) może pomóc w przechwytywaniu klatek z pliku wideo. – Jeet

Odpowiedz

1

Nie wiem, dlaczego nie może zawierać niezbędne nagłówki Qt do przetwarzania ramek (wydawało się, że zawsze mają nierozwiązane zależności i niektóre nie istniały), więc zwrócił się do OpenCV 3.0 i zrobił to w ten sposób:

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(); 

Udało się to idealnie do mojego celu, więc nie kontynuowałem badań.

Dzięki i tak.

6

Możesz użyć QMediaPlayer, aby to osiągnąć.

  1. Utworzenie numeru QMediaPlayer.
  2. Podklasa QAbstractVideoSurface.
  3. Ustaw implementację jako dane wyjściowe odtwarzacza multimedialnego za pośrednictwem QMediaPlayer::setVideoOutput.
  4. Nakarm odtwarzacz multimediów wymaganym plikiem i ewentualnie zacznie dzwonić pod numer QAbstractVideoSurface::present(const QVideoFrame & frame) po implementacji QAbstractVideoSurface, jeśli film został pomyślnie załadowany. Następnie możesz uzyskać dostęp do kanałów i wszystkiego od QVideoFrame i narysować ramkę na widżecie.
+0

Nie mogę znaleźć QMediaPlayer w dowolnym miejscu. Zainstalowałem Qt przez qt-unified-mac-x64-2.0.1-online.dmg, ale nie mam pakietu mobilności – Leo

+0

@Leo To nie powinno być w pakiecie mobilności, po prostu dodaj "#include < QMediaPlayer> 'do twoich źródeł i' QT + = multimedia' do twojego pliku '.pro' jak podano w http://doc.qt.io/qt-5/qmediaplayer.html. Również nie jestem zaznajomiony z wersjami osx, ale 2.0.1 wydaje się dziwny - która wersja qt to jest? –

Powiązane problemy