Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Lire une vidéo / OpenCV [réglé]  (Lu 9961 fois)

0 Membres et 1 Invité sur ce sujet

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Lire une vidéo / OpenCV [réglé]
« le: Mai 12, 2012, 03:37:12 pm »
Bonjour!

Je suis actuellement en train de regarder les compatibilité d'OpenCV pour la lecture de vidéos, dans le but de créer un jeu.
Mais avant de faire le choix de la librairie, j'aimerais pouvoir y ajouter des vidéos, qui feraient office de cut-scènes ou d'intro du jeu.
J'ai réussi à faire fonctionner la librairie OpenCV, qui permets la décomposition d'un flux vidéo en frame, avec la librairie SDL. Cependant, j'ai quand même une grosse préférence pour la SFML, sur laquelle j'ai déjà travaillé. Cependant, je ne parvient pas à passer une image d'OpenCV (IplImage) a un format d'image de la SFML (Image ou Texture, peu importe).
En effet, le format OpenCV permet d'obtenir un char*, représentant l'image, mais impossible de le rendre compatible avec un void* (cast refusé) ou un Uint8*...

Je suppose que je m'y prends mal ou que j'ai raté quelque chose...
Je code sous Win7 / Codeblocks.

Quelqu'un se serait déjà penché sur ce problème ou a déjà trouvé une solution?
« Modifié: Mai 12, 2012, 08:15:06 pm par Jio Freed »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Lire une vidéo / OpenCV
« Réponse #1 le: Mai 12, 2012, 03:50:09 pm »
Ce serait plus simple avec :
- ton code
- le message d'erreur
Laurent Gomila - SFML developer

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV
« Réponse #2 le: Mai 12, 2012, 04:07:25 pm »
Oui, excusez moi, je ne l'avais pas mis car je faisais encore des tests, hélas infructueux...
Voilà le code que j'ai:

while(key != 'q')
    {
        sf::Event event;
        while (window->pollEvent(event))
        {
            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Q))
                key = 'q';
        }

        // gestion du temps pour lire la vidéo selon le framerate déjà calculé
        temps += clock.getElapsedTime().asMilliseconds();
        clock.restart();
        if(temps>next)
        {
            next += delay;
            // On capture le frame (img : IplImage*)
            img = cvRetrieveFrame( capture );

            // On crée l'iamge SFML qui va l'accueillir
            sf::Image sfmlImg = Image();
           
            sfmlImg.loadFromMemory((void*)img->imageData, (size_t)(img->imageSize));
            tex.loadFromImage(sfmlImg);
            sprite = new Sprite(tex);


        }

    window->clear();
    window->draw(*sprite);
    window->display();
    }


je n'ai plus d'erreur de compilation, mais lors de l’exécution, j'ai une erreur de chargement de l'image :
"Failed to load image to memory"

Je suppose que cela vient du fait que ce n'est pas une image qui a un type (.jpg ou autre...), mais du coup, comment je dois m'y prendre?

« Modifié: Mai 12, 2012, 04:18:57 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Lire une vidéo / OpenCV
« Réponse #3 le: Mai 12, 2012, 04:24:26 pm »
Pourquoi faire simple quand on peut faire compliqué ;)

img = cvRetrieveFrame(capture);
tex.update(img->imageData);

Mais attention : les pixels doivent être au format RGBA 32-bits.

Et pourquoi recrées-tu le sprite ? Et pourquoi dynamiquement ?
Laurent Gomila - SFML developer

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV
« Réponse #4 le: Mai 12, 2012, 04:29:12 pm »
J'ai essayé la fonction que tu as donnée, mais j'ai maintenant une erreur de compilation :

||=== sfml2, Debug ===|
C:\Users\Anthony\Prog\sfml2\Video.cpp||In member function 'void Video::Play()':|
C:\Users\Anthony\Prog\sfml2\Video.cpp|82|error: invalid conversion from 'char*' to 'const sf::Uint8*'|
C:\Users\Anthony\Prog\sfml2\Video.cpp|82|error:   initializing argument 1 of 'void sf::Texture::update(const sf::Uint8*)'|
||=== Build finished: 2 errors ===|

edit : j'ai tenté le cast en remaplcant ta fonction par  tex.update((sf::Uint8*)img->imageData);
Mais l'image reste toujours noire. j'ai vérifié que ca ne venait pas d'OpenCV, car je sauvegarde a chaque fois l'image courante, et elle est bonne

edit2 : Pour le sprite, je sais pas pk j'avais fait ca, j'ai changé ca, je l'ai remplacé par un simple srite->SetTexture(tex);
Et j'ai également créé une deuxieme image IplImage avec un format 32bits, j'ai convertit le frame capturé, afin d'être sur que le format respecte ce que tu m'as dit, mais l'image reste toujours noire

img = cvRetrieveFrame( capture );
    resizedImg = cvCreateImage(cvSize(img->width, img->height), 32, img->nChannels);

    // Tant qu'on n'a pas appuyé sur Q, on continue :
    while(key != 'q')
    {
        sf::Event event;
        while (window->pollEvent(event))
        {
            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Q))
                key = 'q';
        }

        temps = clock.getElapsedTime().asMilliseconds();
        if(temps>next)
        {

            next += delay;
            img = cvRetrieveFrame( capture );

            cvConvertScale(img, resizedImg);

            // Cette fonction me permet de sauvegarder l'image pour vérifier qu'elle soit bonne à la base
            cvSaveImage("test.jpg", resizedImg);

            tex.update((sf::Uint8*)resizedImg->imageData);
            sprite->setTexture(tex);

            if(!cvGrabFrame( capture ))
            key = 'q';


        }

        window->clear();
        window->draw(*sprite);
        window->display();
    }
« Modifié: Mai 12, 2012, 05:59:01 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Lire une vidéo / OpenCV
« Réponse #5 le: Mai 12, 2012, 05:57:41 pm »
Il y a une meilleure façon de faire la conversion de type :
tex.update(reinterpret_cast<sf::Uint8*>(img->imageData));

Citer
Mais l'image reste toujours noire
Quel est le format des pixels de l'image renvoyée par OpenCV ?

Citer
je l'ai remplacé par un simple srite->SetTexture(tex);
Même pas besoin, c'est toujours la même texture. Seul son contenu a changé.
Laurent Gomila - SFML developer

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV
« Réponse #6 le: Mai 12, 2012, 06:05:14 pm »
Ah mince, apparemment, c'est du RGB et non du RGBA, faut que je trouve le moyen de passer dans ce format là alors

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re : Lire une vidéo / OpenCV
« Réponse #7 le: Mai 12, 2012, 07:10:48 pm »
Si je puis me permettre, bien que je ne sache pas dans quel format est la vidéo que tu veux lire, il existe déjà des lecteurs vidéo pour SFML. Tels que sfeMovie ou sfTheora.

Après à toi de voir si l'une ou l'autre correspond à tes besoins, ou si tu préfères réaliser ton propre module (aucune des deux bibliothèques que je cite n'est basée sur OpenCV).
Want to play movies in your SFML application? Check out sfeMovie!

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV
« Réponse #8 le: Mai 12, 2012, 07:24:53 pm »
Ah tiens, je n'avais pas encore vu ca!
Etrange, vu le temps de recherche que ca m'a pris deja pour trouver OpenCV...
Je vais jeter un oeil! (La vidéo est en avi mais je peux la convertir au besoin, j'ai ce qu'il faut ;) )

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV
« Réponse #9 le: Mai 12, 2012, 08:14:40 pm »
Hey, Merci!
C'est très simple à utiliser et ca marche super bien!
Avec le logiciel SUPER pour convertir mes vidéos, j'suis tranquille!

Merci :D

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re : Lire une vidéo / OpenCV [réglé]
« Réponse #10 le: Mai 12, 2012, 09:08:04 pm »
Héhé, content que ça ait pu t'aider :) .

Par curiosité, peux-tu dire quelle solution tu as choisie et pour quelles raisons ?
« Modifié: Mai 12, 2012, 09:46:50 pm par Ceylo »
Want to play movies in your SFML application? Check out sfeMovie!

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV [réglé]
« Réponse #11 le: Mai 12, 2012, 11:25:52 pm »
Et bien en fait, j'me suis pas trop posé de questions ^^
sfeMovie avait une présentation en français, j'ai donc commencer par celui-là, et ca a marché tout de suite, et très facilement ^^

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re : Lire une vidéo / OpenCV [réglé]
« Réponse #12 le: Mai 13, 2012, 12:31:41 am »
À vrai dire, pour ce qui est de sfTheora, il y a peut-être une page en français mais je ne l'ai pas trouvée.

Et je suis content que sfeMovie te plaise :) . Si jamais tu as un soucis avec cette bibliothèque, n'hésite pas à m'en parler.
Want to play movies in your SFML application? Check out sfeMovie!

Jio Freed

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Lire une vidéo / OpenCV [réglé]
« Réponse #13 le: Mai 13, 2012, 04:42:10 pm »
D'accord, je saurais m'en souvenir ^^
Mais comme a priori, ca a l'air de marcher, et que je ne voulais rien faire d'autre que lire une vidéo et la stopper, ca devrait aller sans soucis ;)