Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/01/2013, à 13:38

girerdc

[RESOLU] OpenCV - Saut d'images dans une vidéo

Bonjour à tous, et merci d'avance pour toute l'aide que vous pourrez m'apporter.

Je travaille avec des amis sur un projet de simulateur de vélo. Nous filmons un parcours depuis une voiture à vitesse constante, et nous traitons ensuite cette vidéo en temps réel avec la bibliothèque de traitement OpenCV en C++, pour synchroniser la vitesse de la vidéo sur celle de l'utilisateur.
Vu qu'il n'est pas possible d'accélérer indéfiniment la vidéo, on doit faire des sauts d'image.
Par exemple si on film à 10km/h et que le cycliste va à 20km/h, on affiche 1 image sur 2, en gardant la même tempo entre chaque image. 30km/h, on affiche 1 image sur 3 etc...

Au début, j'ai donc pensé à faire des boucles de cvQueryFrame comme suit, pour sauter des images :

for(int i=0; i<n+1; i++)
{
    img=cvQueryFrame(capture);
}

et du coup on affiche l'image en sortie de la boucle (donc la dernière). Mais c'est très lourd parce que ça oblige à lire quand même les images que l'on saute.

Je voudrais donc savoir s'il y a un moyen d'atteindre une image donnée dans une vidéo en sautant les précédentes, sans avoir à les lire, pour optimiser un peu le code. En donnant la position de l'image dans la vidéo par exemple, où directement le nombre d'images à sauter depuis la dernière, où un truc dans ce goût là.

Je vous remercie pour votre intérêt.

Dernière modification par girerdc (Le 20/01/2013, à 20:33)

Hors ligne

#2 Le 16/01/2013, à 13:40

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

De toute façon à moins d'utiliser un format vidéo brut (sans compression ou alors de type mjpeg par ex), tu sera obliger de lire les images intermédiaire pour afficher la frame n + i (ou du moins le codec !!) ... C'est intrinsèque à la compression vidéo ! Et pourquoi open cv ??? As tu besoin des primitives de vision par ordi apportées par cette lib pour faire ça ?  gstreamer pourrait faire l' affaire, et en étant plus efficace !

NB: cvQueryFrame() c'est pour la capture , quelle est le rapport avec le fait de ne lire qu'une image tout les n fois dans une video ?

réedit : autant pour moi tu peux l'utiliser , mais ton intitulé est flou ...

Dernière modification par sogyam (Le 16/01/2013, à 15:40)

#3 Le 16/01/2013, à 14:32

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Excuses moi je viens de comprendre ce que tu essayes de faire  (enfin comment tu le fais) .... Tu te compliques la vie pour rien.
Je serais à ta place , je filmerais une vidéo normal (sans utiliser la capture) à très faible vitesse constante connue ( c''est + optimisé),en réglant le framerates au max (connu aussi, pour les calculs) et je la convertirais en mjpeg (succession d'images jpeg) ou enregistre là directement en mjpeg si cest possible.Une fois que tu as la video (donc les images en  jpeg) , tu peux faire un mix entre accélération et saut d'image ( ce que permet ce format car la compression est intrinsèque à la frame) et les modifiés à ta guise.
Ce que tu cherches à faire est plus un travail de lecture que de capture (enfin c'est plus simple).

réedit : encore une belle incompréhension de ma part houlàlà LOL. C'est juste qu'utiliser openvc pour lire une video ça me parait inapproprié s'il n'y a pas de traitement lourd d'image derrière.Je laisse mes bêtises en l'état, car le fond du problème reste le même ! je reste persuadé que gstreamer est plus adapté ...
NB : j'ai le cerveau ramolli aujourd'hui , tiens je vais aller faire une sieste LOL.

Dernière modification par sogyam (Le 16/01/2013, à 15:48)

#4 Le 16/01/2013, à 16:09

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

A la limite, si tu veux absolument utiliser open cv utilise plutôt cvGrabFrame pour sauter les images c'est plus rapide et moins lourd .car en fait cvQueryFram utilise cvGrabFrame  pour extraire la frame de la vidéo et après la décompresse avec cvRetrieveFrame . Tu devrais y gagner en rapidité et en charge.

Dernière modification par sogyam (Le 16/01/2013, à 16:09)

#5 Le 16/01/2013, à 16:11

girerdc

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Salut !
Tout d'abord, merci pour ta réponse. Et désolé si mon message n'était pas clair.
En fait, je suis dans une école d'ingé en mécanique (ce qui peut expliquer ce post ^^) et notre prof nous avait orienté vers OpenCV parce que cette biblio gère la transformation d'images, et on a besoin par exemple de faire pivoter la vidéo lorsque l'utilisateur se trouve dans un virage etc...
La partie lecture du programme se résume à ça :

#include <stdio.h>
#include <stdlib.h>
#include "highgui.h"
#include "cv.h"

int main()
{
        // DECLARATION
	char key; // Touche clavier
	int tempo;
	IplImage* img; // Image
	CvCapture* capture; // Capture vidéo

	// Initialisation des paramètres de la vidéo
	tempo=33;

	// Ouvrir le flux vidéo
	capture=cvCreateFileCapture("/home/cgirerd/Descente 10kmh.MOV"); // chemin pour un fichier

	cvNamedWindow("projet2a", CV_WINDOW_AUTOSIZE); // Définition de la fenêtre

	while(key!='q'&&key!='Q') // Boucle tant que l'utilisateur n'appuie pas sur la touche q (ou Q)
	{
	   img=cvQueryFrame(capture); // On récupère une image
	   cvShowImage("projet2a", img); // On affiche l'image dans une fenêtre
	   key=cvWaitKey(tempo); // On attend Xms
        }
	cvReleaseCapture(&capture);
	cvDestroyWindow("projet2a");
	return 0;
}

Voilà pour la petite histoire big_smile (Et s'il y a des gens qui nous rejoignent)
et je pensais cumuler les img=cvQueryFrame(capture) pour sauter les images.

Du coup ta solution avec mjpeg parait intéressante si on peut directement sélectionner la bonne image. Tu me conseillerais quoi du coup pour gérer ça, Gstreamer ou OpenCV, sachant que je dois faire pivoter la vidéo à un angle donné (et pourquoi pas d'autres effets comme des déplacement de l'image dans la fenêtre) ?

En tout cas je viens d'essayer avec cvGrabFrame, il y a une très légère amélioration mais rien de significatif, ça reste très lourd et ça pompe encore un paquet de ressources hmm

Dernière modification par girerdc (Le 16/01/2013, à 23:17)

Hors ligne

#6 Le 17/01/2013, à 12:41

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

As tu essayé d' encoder ta vidéo en mjpeg avant de la lire ? C'est vrai que cela prend plus de place , mais pompe beaucoup moins de ressources.En gros, quand tu vas sauter des frames , le codec n'aura pas besoin de décoder la frame malgré que tu ne veuille que la droper , en fait il a juste à sauter dans le buffer,  aucune décompression, contrairement aux autres formats comme ton .MOV qui lui te bouffe pas mal de ressource pour rien(c'est un des pires au niveau charge, le h264).Juste pour avoir la frame que tu veux afficher,il va devoir décompresser toutes les frames  après la dernière B frame de référence.
De plus, même en occultant le problème précédent, intrinsèquement la décompression jpeg est beaucoup plus rapide !.

J'ai testé en mjpeg avec ton code, en dropant des frames, et la différence est vraiment flagrante !! (très flagrante).

Donne moi un feedback!

NB :Open CV est une excellente lib,je t'aurais bien conseillé gstreamer, gst-clutter et clutter  (tu peux faire faire danser la samba à ta video avec ça big_smile ).Mais là faut vraiment que tu sois motivé !!
Autrement opencv peut utiliser ffmeg ou gstreamer en backend, donc tu pourrais peut être voir pour activer l'accélération matériel, mais vu que tu veux droper des frames, j'ai peur des aller retour entre la carte graphique et le processeur si la carte ne peux les sauter elle même (j' avoue ne pas connaître les modalités de dvpau ou vaapi, juste fait quelques essais en opengl et le temps de rapatriement des images était conséquent)

Dernière modification par sogyam (Le 17/01/2013, à 13:35)

#7 Le 17/01/2013, à 13:17

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Tiens une petite video avec gst-clutter ,bon il ne fait qu'une rotation sur la demo ,mais tout est possible !

Clutter Demonstration Application

#8 Le 17/01/2013, à 19:31

girerdc

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Ahh effectivement je viens d'essayer les cvGrabFrame sur une vidéo mjpeg est il y a une nette amélioration au niveau de la consommation de ressources ! Un très bon point donc !! Merci sogyam ! smile
Par contre la vidéo sature en vitesse après 4 ou 5 sauts environ, si l'on saute d'autres frames la vitesse de défilement semble être la même...
Peut-être que ça se mort la queue au bout d'un moment non ? Parce que les cvGrabFrame prennent quand même un petit temps, négligeable pour une frame, mais cumulés ça augmente le temps de traitement entre l'affichage de 2 frames non ? Et donc ça ralenti les affichages... ?

Après je suis loin d'être expérimenté en programmation, j'ai juste eu quelques cours en première année sur les bases, et on a effleuré le concept de classes et de pointeurs à la fin du semestre... Mais je suis prêt à apprendre, il y a aucun soucis là-dessus, donc s'il y a moyen de faire quelque chose de propre avec autre chose qu'OpenCV, je suis partant. (J'avoue que de ce côté-là OpenCV a l'avantage d'être plutôt bien documenté tongue)
A voir par contre que le but de ce projet est de proposer un logiciel qui pourrait tourner chez monsieurtoutlemonde (donc sous windows)... Et donc il y a peut-être des outils auxquels on ne peut pas faire appel.

Dernière modification par girerdc (Le 17/01/2013, à 19:42)

Hors ligne

#9 Le 17/01/2013, à 21:16

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Pour être honnête (et ça faisait longtemps que j'avais pas touché à opencv), je pense qu'il a une recopie inutile en mémoire (faudrait que je regarde le code ), en fait il y a la fonction :

cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, (double)n_frame);

où tu saute direct à la frame n_frame ... mais elle plante misérablement aussi bien avec la 2.3 q' avec la 2.4 (enfin chez moi), d où mon silence à ce sujet ,d'ailleurs je suis loin d'être le seul en recherchant sur le web ...
Tiens je vais tester de récupérer les images avec gstreamer (avec saut), après une fois que tu les as en brut, tu peux faire ce que tu veux  avec, que ce soit open cv ou n'importe quelle bibliothèque !

NB: Pour windows va demander sur un forum windows, car je ne sais même plus si ma VM démarre encore ... Une question tiens ! C'est pour un vélo de salle de sport ?? car un simulateur de vélo, je n'en voit pas trop l'intéret justement, sur windows chez mr tout le monde ... à moins de vouloir faire un soft pour vélo d'appartement !

Chez moi je drope 30 frames sans soucis et dans les temps !!

réedit  : après avoir regardé les sources d'open cv, il  apparait que cvGrabFrame décode entièrement l'image ... d'où la très légère amélioration.En fait cvRetrieveFrame ne fait que convertir le format d'un espace de couleur à un autre (type yuv vers rgb24 par exemple), et à initialisé l' IplImage correspondante.

Dernière modification par sogyam (Le 23/01/2013, à 02:51)

#10 Le 18/01/2013, à 01:20

girerdc

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Disons qu'avant tout c'est un projet à but pédagogique, pas dit qu'on retrouve ça dans le commerce dans les années à venir ^^. Mais je trouve l'idée vraiment bien au fond.
En gros pour nous, ça revient à créer un logiciel qui permette à l'utilisateur de s’entraîner sur un parcours réel filmé, soit qu'on lui fourni, soit dans le meilleur des cas qu'il peut réaliser lui, et de recréer l'effort qu'il fournirait en réalité sur ce même parcours en gérant le frein du home trainer (fonction de la pente, de son poids, et des forces aérodynamiques grosso modo). Et pour retranscrire l'effort, on se sert d'un .gpx généré par un iphone pendant que l'on film. Il nous renseigne sur l'altitude et nous donne l'heure exacte du relevé (il fait ça à peu près 20 fois par minute... disons que c'est un chiffre acceptable pour la réactivité du système...), et en synchronisant ce petit .gpx avec la vidéo(qui évolue en temps réel), ça devrait marcher smile
Avant tout destiné aux professionnels si on lit notre cahier des charges, mais on peut très bien élargir ça à M. tout le monde, plutôt que de pédaler en face d'un mur... lol
C'est pour ça que le plus simple est que l'utilisateur fasse tourner ça sur son PC, et ensuite branche un videopro s'il veut, ou alors l'écran de sa télé selon ses envies smile
En tout cas merci pour tes recherches ! Je croise les doigts pour que ça fonctionne wink

Hors ligne

#11 Le 18/01/2013, à 03:05

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Récupérer les frames avec gstreamer c'est un jeux d'enfant ... , accélérer pas très compliqué (une option existe et il calcul le drope de frames ). Le truc c'est que c'est quand même à toi de le realiser !! je veux bien te tuyauté , mais t' amené le soft sur un plateau  (surtout la compatibilté windows en plus ...), ça je ne le ferai pas .Tu vas avoir du mal si t'apprend pas à lire une doc et à rechercher les informations.
Et en plus je respecte l'esprit pédagogique du projet big_smile

#12 Le 18/01/2013, à 03:21

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Concernant le ralentissement (seulement 5 frames), tu compilerais pas avev visual studio ? car après prise de renseignement, il a quelque problème d'éfficacité avec opencv que n'a pas mingw
t'es en quelle definition de video ?

Tu as testé avec la fonction cvSetCaptureProperty que je t'ai donné plus haut ??

Dernière modification par sogyam (Le 18/01/2013, à 03:25)

#13 Le 18/01/2013, à 21:05

girerdc

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Ah nan j'attendais pas du tout que tu me livres ça tout cuit, c'est simplement que j'ai écris ce message à vers les 1ou 2h du mat' et que je ne voulais pas me replonger là-dedans à cette heure tardive (ou plutôt cette heure matinale lol)

J'ai essayé aujourd'hui la fonction cvSetCaptureProperty que tu m'avais proposé, et oh bonheur, elle fonctionne à merveille chez moi !! Donc on peut considérer que le problème est résolu. M'enfin à moitié vu que ça à l'air de fonctionner au random selon les utilisateurs... Personnellement j'ai utilisé la 2.3. Pour l'instant je pense m'en tenir à ça et me concentrer sur d'autres parties du programme, mais est-ce que Gstreamer ou autre seraient moins foireux pour les sauts ? (D'après ce que j'ai compris, oui !) Si j'ai le temps je pense que je retravaillerai cette partie si ça vaut vraiment le détour. En plus Gstreamer a l'air omniprésent dans les appli vidéo, alors pourquoi pas y jeter un oeil maintenant que l'occasion se présente, histoire d'en apprendre un peu plus. Ça me tente bien en tout cas.

Par rapport à la vidéo, je suis en 1280 x 720, à 30fps

Et pour en revenir à windows en fait, mes préoccupations étaient (et sont toujours) les suivantes (c'est peut-être des questions bêtes mais le mieux c'est encore de les poser tongue) :
- Par exemple je sais qu'OpenCV est multiplateforme, ça veut dire qu'on peut l'utiliser aussi bien sur GNU/Linux que sur windows (ça je crois que je peux en être sûr ^^). Mais si je règle mon compilateur (sous linux) pour qu'il me sorte un .exe, est-ce qu'il est directement utilisable sur windows, où est-ce qu'il y a des modifs à faire ?
En fait je crois que ce premier tiret résume toutes les questions que je me posais smile

Encore merci à toi ! smile

Dernière modification par girerdc (Le 18/01/2013, à 21:06)

Hors ligne

#14 Le 20/01/2013, à 11:38

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Ben en théorie non , tu n'as rien à modifier, c'est le but d'une lib portable , c'est le préprocesseur qui fait le boulot.Après et c'est à tester, tu peux avoir quelques que trucs, comme le chemin de ta video qui peuvent être à modifier, par exemple ,etc.
Essaye avec mingw-32/64 comme cross compilateur,en theorie ça devrait passer.
Concernant gstreamer, je me suis renseigné, en théorie avec clutter-gst , si t'utilise l'accélération matériel, tout reste au niveau de la carte graphique.Le seul truc c'est que tu vas devoir recompilé les plugins-bad car le plugin vdpau par exemple ,n'est plus présent et activé même sur la 0.10 où il fonctionne (debian et dérivés, utilisent le pilote nouveau part défaut, et pensent à ta place en te privant d'accélération matérielle même si tu installe les pilotes proprios ...).De plus c'est plus chaud à gérer car ils peuvent être sur ATI, ou intel ... Ce que j'attend avec impatience c'est la 1.2 de gstreamer car ils sont entrain de faire un super boulout pour proposé une interface simple pour ça !!     Faut juste être patient, c'est un des but de la prochaine release : roadmap gstreamer

Dernière modification par sogyam (Le 20/01/2013, à 16:28)

#15 Le 20/01/2013, à 20:27

girerdc

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

Oui pour les trucs comme le chemin j'en suis conscient smile. J'essayerai de bricoler une petite interface en GTK+  pour ça et le reste côté utilisateur.
J'irai chercher du côté de mingw comme tu me le conseilles si je rencontre un problème pour le portage sous windows.
Pas terrible pour une distrib libre comme Debian d'imposer ses choix à l'utilisateur en tout cas, c'est pas vraiment dans la philosophie de l'OS (surtout dans le cas de Debian)...
Pour l'instant je pense marquer le topic comme résolu vu que je n'ai plus de problème au niveau du saut avec cvSetCaptureProperty.
Et j'attendrai la sortie de la dernière release pour reprendre ce travail si j'ai le temps, mais je m'en tiens là pour le moment, il y a d'autres priorités. Par contre, si je poursuis ce travail à titre personnel après la fin du projet, j'irai creuser un peu plus loin, ça c'est sûr.
En tout cas, merci beaucoup pour ton aide. Je manque encore cruellement d'expérience aujourd'hui, mais j'espère prochainement pouvoir aider un membre de la même façon que tu l'as fait avec moi smile

Dernière modification par girerdc (Le 20/01/2013, à 20:56)

Hors ligne

#16 Le 21/01/2013, à 00:16

compte supprimé

Re : [RESOLU] OpenCV - Saut d'images dans une vidéo

De rien ! tu sais je suis pas un dieu en programmation , je suis juste un amateur passionné autodidacte !