2012-09-05 22 views
8

El proyecto: Agregue una marca de fecha/hora en ejecución en cada fotograma de un video. (El resultado de una cámara de video digital, y mi padre me preguntó cómo puede agregar la marca de tiempo (a la resolución de milisegundos) de forma permanente al video.OpenCV 2.4 en python - Procesamiento de video

Un amigo me señaló opencv (emgucv en realidad), y debido a mis preferencias me probado suerte con OpenCV en Python

la documentación es cojo, y no tenía siquiera el tiempo duro (me tomó como 5 horas o así) sólo para instalar el paquete Fuentes:..

estoy trabajando en Windows 7 x64, así que tuve que rebajar mi pitón para trabajar con numpy (sin versión numpy para win64)

Trabajando con PyCharm IDE.

La instalación resultante me tiene que tener el archivo C: \ python27 \ Lib \ site-packages \ cv2.pyd

Estoy tratando de encontrar documentación para empezar a trabajar con, pero estoy muy confundido y no tienen idea de por dónde empezar, todos los ejemplos se confunde - es decir:

Mis preguntas:

  1. estoy haciendo algo mal? ¿No es esta la forma de instalar opencv?
  2. ¿Dónde puedo encontrar buena documentación?
  3. Supongamos que tengo mi texto listo (en una cadena) ¿alguien puede intentar ayudarme con el inicio de mi aplicación?

Gracias

+1

Look en [SimpleCV] (http://simplecv.org/docs/) como como una posible alternativa. – Blender

+0

Lo intentaré, pero ya he visto su sitio web y parece que hay muy poca documentación. y realmente no entiendo la cosa con el shell interactivo (¿tengo que trabajar con eso? ¿Puedo trabajar solo a través de un script de python?) –

+0

No uso el shell interactivo. La documentación está allí para mostrarle que las funciones existen, pero el resto de la funcionalidad es bastante autoexplicativa. – Blender

Respuesta

18

Su tarea debería ser relativamente fácil de lograr usando OpenCV y Python. Parece que eres nuevo en OpenCV, así que intentaré mantener mi explicación completa, pero no dudes en preguntar si necesitas alguna aclaración.

No estoy seguro de si está obteniendo sus datos de una transmisión de video de cámara en vivo, o si está grabando imágenes posteriormente. De cualquier forma ...

Obtener datos. Si se utiliza una transmisión en vivo:

capture = cv2.VideoCapture(0) 

Si se utiliza material grabado:

capture = cv2.VideoCapture("your_reading_file.avi") 

iniciación del escritor vídeo. Mire at this question para obtener ayuda con los códecs; encontrar un códec en funcionamiento no es trivial. También estoy usando Windows 7 x64, y el códec mencionado más abajo fue el único que funcionó para mí. Además, configure la variable fps lo más cerca posible de la velocidad de fotogramas de entrada entrante; no puede cambiarla una vez que haya comenzado a escribir cuadros.

flag, frame = capture.read() # **EDIT:** to get frame size 
width = np.size(frame, 1) #here is why you need numpy! (remember to "import numpy as np") 
height = np.size(frame, 0) 
writer = cv2.VideoWriter(filename="your_writing_file.avi", 
fourcc=cv2.cv.CV_FOURCC('I', 'Y', 'U', 'V'), #this is the codec that works for me 
fps=15, #frames per second, I suggest 15 as a rough initial estimate 
frameSize=(width, height)) 

Procese esta información y añada su texto. Por último, escriba el marco editado en un archivo de video.

while True: 
    flag, frame = capture.read() #Flag returns 1 for success, 0 for failure. Frame is the currently processed frame 

    if flag == 0: #Something is wrong with your data, or the end of the video file was reached 
     break 
    x = width/2 
    y = height/2 #change to the desired coordinates 
    text_color = (255,0,0) #color as (B,G,R) 
    cv2.putText(frame, "your_string", (x,y), cv2.FONT_HERSHEY_PLAIN, 1.0, text_color, thickness=1, lineType=cv2.CV_AA) 

    writer.write(frame) #write to the video file 

Tan simple como eso! Utilizo el código anterior para escribir texto en archivos de video casi a diario, así que definitivamente funciona. Los únicos problemas potenciales que puedo prever son los códecs, que desafortunadamente no conozco demasiado. Espero que esto pueda resolver su problema, siéntase libre de hacer más preguntas.

EDIT: Respuestas a las preguntas de su comentario.

1.) Por lo que sé, solo puede usar .avi porque tiene que usar un formato sin comprimir con OpenCV. Me temo que no tengo conocimiento de usar otros formatos (comprimidos). ¿Tal vez podría utilizar un programa de terceros para hacer pre/post conversión? El motivo de la excepción frame fue mi error. He editado la respuesta para incluir la línea faltante.

2.) Me temo que no tengo ni idea de cómo leer los metadatos. Si me entero, te lo haré saber. Mi propia solución de hack para encontrar framerate de video es dejar que OpenCV ejecute el video una vez, usando el módulo Time para calcular la tasa de fotogramas promedio. Esta estimación se puede usar al escribir el archivo de video.

3.) He encontrado que el tamaño del video resultante puede diferir significativamente del original dependiendo de varios factores, el más importante es qué tan cerca estuvo el elegido fps con la velocidad de fotogramas original.

4.) En cuanto a otras fuentes, hay varias disponibles. Puedo referirlo a this question para una descripción rápida. Aquí está la documentación pertinente:

fontFace – Font type. One of FONT_HERSHEY_SIMPLEX, 
FONT_HERSHEY_PLAIN, 
FONT_HERSHEY_DUPLEX, 
FONT_HERSHEY_COMPLEX, 
FONT_HERSHEY_TRIPLEX, 
FONT_HERSHEY_COMPLEX_SMALL, 
FONT_HERSHEY_SCRIPT_SIMPLEX, or 
FONT_HERSHEY_SCRIPT_COMPLEX, 
where each of the font ID’s can be combined with FONT_HERSHEY_ITALIC to get the slanted letters. 
+0

¡Genial! Esto es muy parecido a lo que necesito. algunas preguntas: 1. ¿por qué solo se pueden abrir archivos AVI? (arroja una excepción cuando intento leer el ancho/alto del marco), 2. ¿Cómo puedo leer los metadatos del archivo (y para ser exactos - hora/fecha de creación, y FPS) 3. ¿Por qué el video resultante es 3 o 4 veces más grande (espacio, no marco, por supuesto), 4. ¿Qué más fuentes, estilos tengo para la fuente? –

+0

He editado mi respuesta para incluir algunas de sus nuevas preguntas. Tenga en cuenta también que hubo un error en mi código original, pero que ahora se ha solucionado. Por favor, pregunte si algo aún no está claro. – casper

+0

Oye, ¿me puedes ayudar ?, no entiendo qué pasó con el audio del video –

1

usados ​​hachoir-metadata para leer los metadatos del archivo de vídeo (incluyendo la velocidad de fotogramas, la altura y la anchura

importación:.

from hachoir_core.error import HachoirError 
from hachoir_core.cmd_line import unicodeFilename 
from hachoir_parser import createParser 
from hachoir_core.tools import makePrintable 
from hachoir_metadata import extractMetadata 
from hachoir_core.i18n import getTerminalCharset 
from hachoir_metadata.metadata_item import QUALITY_BEST 

función:

def metaDataFile(filePath): 
    filename, realname = unicodeFilename(filePath), filePath 
    parser = createParser(filename, realname) 
    try: 
     metadata = extractMetadata(parser, QUALITY_BEST) 
    except HachoirError, err: 
     print "Metadata extraction error: %s" % unicode(err) 
     metadata = None 
    if not metadata: 
     print metadata 
     print "Unable to extract metadata" 
     exit(1) 
    return metadata 

uso:

metadata = metaDataFile(videoPath) 
width = metadata.get('width') 
height = metadata.get('height') 
fps = metadata.get('frame_rate') 

para ver propiedades relevantes:

for data in sorted(metadata): 
    if len(data.values) > 0: 
     print data.key, data.values[0].value 
Cuestiones relacionadas