Partage
  • Partager sur Facebook
  • Partager sur Twitter

Enregistrement accelere - Opencv

5 juillet 2010 à 16:49:27

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.

Voici comment mon cvvideowriter est créé :
CvVideoWriter* MaVideo = cvCreateVideoWriter("./record/testTrack.avi",CV_FOURCC('X','V','I','D'),30,cvGetSize(tmp_frame),1);


Ensuite j'utilise simplement un cvwriteframe. J'ai tester avec plusieurs codec differents mais rien ne change (DIVX,XVID,MPG).

Merci !
  • Partager sur Facebook
  • Partager sur Twitter
5 juillet 2010 à 19:05:13

et si tu met un delai avant de reboucler sa donne quoi?
essai 20 ms
  • Partager sur Facebook
  • Partager sur Twitter
http://jacen92.free.fr
8 juillet 2010 à 18:00:00

J'ai essayé d'attendre 140ms avant chaque frame avec un cvWaitKey() mais la video enregistré est toujours en accélèré.
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2010 à 19:02:03

tu peut nous mettre tout ton code sa sera plus simple
  • Partager sur Facebook
  • Partager sur Twitter
http://jacen92.free.fr
13 juillet 2010 à 11:52:51

Oui oui...
C'est à dire que le projet est un peu long ^^ Voici la fonction ou je souhaite enregistrer ma video :

void control::process()
{
	tmp_frame = cvQueryFrame(cap);
	CvVideoWriter* MaVideo = cvCreateVideoWriter("./record/testTrack.avi",CV_FOURCC('X','V','I','D'),30,cvGetSize(tmp_frame),1);
	cvNamedWindow("test_tracking", 1);
	int xtr=0,ytr=0,ztr=100;
	bool initOK=true;
	cvWaitKey(60);

	for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++ )
	{
		if(enableTrack)
		{
			stateSwitch->process(tmp_frame);
			if(stateSwitch->getActive()==TRACKING_STATE)
			{
				xtr=(int)(stateSwitch->getTarget()->x+(stateSwitch->getTarget()->width/2))*704/320;
				ytr=(int)(stateSwitch->getTarget()->y+(stateSwitch->getTarget()->height/2))*576/240;

				if(stateSwitch->getTarget()->width*stateSwitch->getTarget()->height<8000)
				{
					ztr=101;
				}
				else if(stateSwitch->getTarget()->width*stateSwitch->getTarget()->height>10000)
				{
					ztr=99;
				}
				else
				{
					ztr=100;
				}
				http->setAreaZoom(xtr,ytr,ztr);
				initOK=false;
			}
			else if(!initOK && stateSwitch->getActive()==BG_STATE)
			{
				http->goToInit();
				initOK=true;
			}
		}
		info = stateSwitch->getInfo();
		cvWriteFrame(MaVideo,tmp_frame);
		cvShowImage("test_tracking", tmp_frame);
	}
	cvReleaseVideoWriter(&MaVideo);
}


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 !

La doc complète du projet est ici : http://www.ecole.ensicaen.fr/~fayel/st [...] mentation.php si vous voulez plus de précision.
  • Partager sur Facebook
  • Partager sur Twitter
13 juillet 2010 à 19:50:45

a vu de nez je dirais que tu devrait mettre une sorte d'indicateur pour voir a partir de quel moment sa met du temps

en faite je pense qu'une fonction doit prendre beaucoup de temps et bloquer le reste de la fonction
comme un delai tres long.

en tout cas je suis pas tres sur mais sa expliquerai la video accelerer
  • Partager sur Facebook
  • Partager sur Twitter
http://jacen92.free.fr
14 juillet 2010 à 13:43:47

Je pense la même chose.

Citation : cochet.stephanie

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.
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

14 juillet 2010 à 14:00:51

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
  • Partager sur Facebook
  • Partager sur Twitter
http://jacen92.free.fr
14 juillet 2010 à 15:17:50

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.
  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2010 à 17:17:32

Oui effectivement 15 frames au lieux de 30, faut carémet retirer le cvkeywait et alléger un peu le code.

Comme par exemple :
CvVideoWriter* MaVideo = cvCreateVideoWriter("./record/testTrack.avi",CV_FOURCC('X','V','I','D'),30,cvGetSize(tmp_frame),1);


Qui pourrait être déclaré hors de la fonction.

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.
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

14 juillet 2010 à 17:40:55

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 .
  • Partager sur Facebook
  • Partager sur Twitter
http://jacen92.free.fr
19 juillet 2010 à 14:13:02

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 ;)
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2018 à 0:10:29

For me opencv writevideo n enregistre pas la vidéo le média créer est à 0 octet je travaille avec python 2'.7 sous windows 

Voilà mon programme :

import time

import datetime

import cv2

import numpy as np

video=cv2.VideoCapture(0)

fourcc=cv2.VideoWriter_fourcc(*'XVID')

out=cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))

t=time.time()+20

while(time.time() < t ):

  ret,frame=video.read()

  if (ret==True):

    out.write(frame)

    cv2.imshow('Frame',frame)

  else:

    break

video.release()

out.release()

cv2.destroyAllWindows()

J ai essayer de l exécuter sous linux sa marche bien mais moi faut que je reste sous Windows svp qlq un pe maider

-
Edité par MouniaHenni1 11 octobre 2018 à 0:11:50

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2018 à 2:25:49

Bonjour,

Déterrage

Citation des règles générales du forum :

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

Je ferme ce sujet. Me contacter par MP si besoin.

  • Partager sur Facebook
  • Partager sur Twitter