Comment saisir des images vidéo dans Qt?

Je suis nouveau sur Qt, je ne connais que les bases: créer des interfaces et connecter des slots. En quelques mots, mes connaissances ne sont pas du tout approfondies.

J’ai besoin d’ouvrir un fichier vidéo et de capturer toutes ses images pour obtenir les canaux R, V, B et, plus tard, pour traiter le stream optique (c’est déjà fait), image par image pour finalement le représenter sur une fenêtre.

Est-il possible d’obtenir les images vidéo avec Qt? J’ai fait beaucoup de recherches mais je n’ai rien trouvé de concluant.

Vous pouvez utiliser QMediaPlayer pour y parvenir.

  1. Instanciez le QMediaPlayer .
  2. Sous-classe la QAbstractVideoSurface .
  3. Définissez votre implémentation comme sortie pour le lecteur multimédia via QMediaPlayer::setVideoOutput .
  4. Fournissez au lecteur multimédia le fichier nécessaire et il commencera éventuellement à appeler QAbstractVideoSurface::present(const QVideoFrame & frame) sur votre implémentation de QAbstractVideoSurface si la vidéo a été chargée avec succès. Ensuite, vous pouvez accéder aux canaux et à tous les éléments de QVideoFrame et dessiner le cadre sur un widget.

Je ne sais pas pourquoi je ne pouvais pas inclure les en-têtes Qt nécessaires pour traiter les images (elles semblaient toujours avoir des dépendances non résolues et certaines n’existaient pas), alors je me suis tourné vers OpenCV 3.0 et je l’ai fait comme suit:

 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::Point(x,y)); r[y * w + x] = color[2]; g[y * w + x] = color[1]; b[y * w + x] = color[0]; } } } cap.release(); 

Cela a parfaitement fonctionné pour mon objective, je n’ai donc pas poursuivi mes recherches.

Merci quand même.