Bonjour,
Voila pour mon projet de stage je dois traiter le flux video provenant d'une camera IP puis ensuite l'enregistrer. Le traitement et l'affichage se passe bien. L'enregistrement quant à lui reccupère bien toutes les frames mais lorsque je lis la video ".avi" enregistrée, elle est en accéléré. Je ne comprends pas pourquoi, car je lui donne bien le même FPS que celui du flux video de la camera, à savoir 30 frames par seconde.
Il s'agit de la fonction de la classe principal qui est censé traiter l'image, bouger la caméra en fonction de la cible trouvée tout ca tout ca, puis enregistrer l'image. Tout se passe bien, y compri la visualisation en direct (avec le showImage). En revanche la video que j'enregistre est en accéléré. Je dirais au moins du x10 Pour l'instant je bidouille à la recaler à la main mais ça n'est pas très pratique !
J'ai essayé d'attendre 140ms avant chaque frame avec un cvWaitKey() mais la video enregistré est toujours en accélèré.
Plus ta fonction sera rapide plus ta video sera lente. Plus ta fonction sera lente plus ta vidéo sera rapide.
Essay peut-etre de reduire cvWaitKey(60).
Peut-etre aussi que ton problème ne viens pas de là mais essai quand même.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
dans le cas ou une fonction bloque le processus trop longtemps il est inutile de mettre le cvkeywait justement mais il faut optimiser la fonction qui bloque tout
Effectivement il est fort possible que la fonction qui traite les images soit lourde. J'utilise alternativement un algo de background subtraction et le camshift pour détecter et suivre mes cibles. Mais il s'agit là de la base de mon projet, les algo sont assez lourd, mais je ne peux pas les changer (à moins de recoder toutes les fonctions d'opencv). Je ne comprend pas la logique du "si une fonction est lente, la vidéo est accéléré". Pourriez vous m'expliquer ?
Pourquoi le traitement vidéo fonctionne pour la visualisation en direct mais pour pour l'enregistrement ? La détection et le tracking de cible marche très bien en temps réel, on voit bien les petits carré autour des cibles en temps réel.
edit : Je viens de comprendre le principe "si c'est lent alors c'est rapide" En fait ma fonction n'enregistre peut être que 15 frames par seconde au lieu de 30... Je vois... Je vais donc examiné mes fonctions pour tenté de les améliorer. Par contre, je ne comprends pas pourquoi la visualisation ne saccade pas dans ce cas là ! Si ma fonction est trop longue et ne traite pas toutes les images, je devrais le constater sur la vidéo en direct. Et je devrais avoir une vidéo saccadée lorsque je ralenti artificiellement ma vidéo enregistrée avec mon logiciel de traitement vidéo (genre after-effect)... Ce qui n'est pas le cas.
Enfin faut mettre le minimum dans cette fonction.
Essaie aussi de ne traiter qu'une image sur 2, pas sûr que ce soit 2 fois plus rapide (même certain que non) mais sa accélèrera un peu la fonction.
Citation : cochet.stephanie
La détection et le tracking de cible marche très bien en temps réel, on voit bien les petits carré autour des cibles en temps réel.
EDIT: Désolé je n'avait pas vue qu'il y avait un tracking sur la visualisation. la visualisation risque de n'être pas très belle si le petit carré n'apparait que sur une image sur 2.
Enfin tu peux toujours t'arrangé.
Bonne chance.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
Il suffit de laisser le carré au derniere coordonnée calculer comme sa sa ne s'intillera pas mais il sera peut etre plus lent a ce deplacer .
Faut tester toute facon.
Test aussi en enlevant les traitements de ta boucle histoire de voir quel fonction ralenti la boucle et voir si sans les fonction ta video est a vitesse normal .
Effectivement le problème semble bien venir de ça. Je ne traite plus que une image sur trois ce qui ralenti drolement la video enregistrée. De plus j'ai supprimé de cette fonction l'affichage en temps réel. Ces algorithmes sont décidement très gourmands en temps de calcul...
Merci de votre aide
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.