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.
QMediaPlayer::setVideoOutput
. 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.