| Re: [pymecavideo] [Attention rev 319 : gros hack dans testfilm.py] |
[ Thread Index | Date Index | More lists.tuxfamily.org/pymecavideo Archives ]
Jean-Baptiste BUTET a écrit : > http://ashashiwa.free.fr//perseidfireball.mov Je t'envoie un exemple de code, pour que tu retires le gros gros hack de tout à l'heure. j'ai ajouté une ligne à l'initiatilation de la structure film : self.filesize=os.path.getsize(filename) et un test après passage par les détecteurs d'OpenCv : assert 1.0*self.filesize/self.framecount > 2000, "fichier aberrant en taille" Effectivement si tu décommentes/recommentes l'assetion, tu observes que le test est sélectif ou non. Ci-joints deux fichiers. Tu lances "python qualifieFilm.py". Amitiés, Georges.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv
import sys, threading
class film:
"""
Une classe pour accéder aux images d'un film
"""
def __init__(self,filename):
"""
le constructeur
@param filename le nom d'un fichier video
"""
self.filename=filename
self.filesize=os.path.getsize(filename)
self.capture=cv.CreateFileCapture(self.filename)
t=threading.Thread(target=self.autoTest)
t.start()
t.join(5.0) # attente de 5 secondes au plus
def autoTest(self):
self.ok=False
try:
self.frame=cv.QueryFrame(self.capture)
self.num=0
self.fps=cv.GetCaptureProperty(self.capture,cv.CV_CAP_PROP_FPS)
self.framecount=cv.GetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_COUNT)
assert 1.0*self.filesize/self.framecount > 2000, "fichier aberrant en taille"
# plus de 200 octets par trame
self.ok=True
except:
pass
def __int__(self):
return int(self.ok)
def __nonzero__(self):
return self.ok
def image(self,num,recode=None):
"""
accès à une image du film, avec rembobinage du film si nécessaire
@param num l'image recherchée
@param recode recodage si nécessaire, peut valoir 'PIL'. None par défaut
@return un objet de type IplImage ou None si la fin du film est dépassée
"""
if num>self.num:
for i in range(self.num,num):
self.frame=cv.QueryFrame(self.capture)
elif 0<=num<self.num:
#cv.ReleaseCapture(self.capture)
self.capture = cv.CreateFileCapture(self.filename)
for i in range (0, num+1):
self.frame=cv.QueryFrame(self.capture)
self.num=num
if recode == 'PIL':
return Ipl2PIL(self.frame)
else:
return self.frame
def nbTrames(self):
"""
@return Le nombre de trames du film
"""
return int(self.framecount)
def tramesParSeconde(self):
"""
@return le nombre de trames par seconde
"""
return int(self.fps)
def totalTrames(self):
"""
@return le nombre total de trames dans le film
"""
return int(self.framecount)
##################### ci-dessous, des fonctions de démonstration seulement #####
import os.path, re
def showSlowAVI(fname):
f=film(fname)
if f:
print "vidéo : %s %d trames %d trames par seconde" %(fname, f.nbTrames(), f.tramesParSeconde())
loop = True
forward = None
num=0
frame=f.image(num)
while(loop):
if forward == True:
num+=1
frame = f.image(num)
elif forward == False and num>0:
num-=1
frame = f.image(num)
forward=None
if (frame == None):
break;
cv.ShowImage("Example2", frame)
char = cv.WaitKey(33)
if (char != -1):
if char==1048603: #ESC
loop = False
elif char==1048678: #f
forward=True
elif char==1048674: #b
forward=False
else:
print "la vidéo %s n'est pas bien acceptée par OpenCV" %fname
cv.DestroyWindow("Example2")
def showMovies(arg, dirname,names):
aviPattern=re.compile(".*\.avi$|.*\.mov$", re.I)
for f in names:
if aviPattern.match(f):
showSlowAVI(os.path.join(dirname,f))
if __name__ == '__main__':
if len(sys.argv)>1:
basedir=sys.argv[1]
else:
basedir='/usr/share/python-mecavideo/video'
print "forward='f' backward='b' next='Esc'"
cv.NamedWindow("Example2", cv.CV_WINDOW_AUTOSIZE)
os.path.walk(basedir, showMovies, None)
cv.DestroyWindow("Example2")
#! /usr/bin/python
from film import film
if __name__=='__main__':
f=film('perseidfireball.mov')
print "le film est [%s] : fps, frames = %s, %s" %(bool(f), f.fps, f.framecount)
Attachment:
signature.asc
Description: Digital signature
| Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |