2012-09-05 8 views
8

Das Projekt: Fügen Sie einen laufenden Datums-/Zeitstempel für jeden einzelnen Frame eines Videos hinzu. (Das Ergebnis der digitalen Videokamera, und mein Vater fragte mich, wie kann er den Zeitstempel (in der Millisekunden-Auflösung) dauerhaft zum Video hinzufügen.OpenCV 2.4 in Python - Videoverarbeitung

Ein Freund wies mich auf opencv (emgucv tatsächlich), und wegen meiner Vorlieben ich versuchte mein Glück mit opencv in python

die Dokumentation ist lahm, und ich hatte auch harte Zeit (habe mich wie 5 Stunden oder so) nur das Paket zu installieren Quellen:..

Ich arbeite auf Windows 7 x64, also musste ich meinen Python degradieren mit numpy zu arbeiten (nein numpy Version für win64)

Arbeiten mit PyCharm IDE.

Die resultierende Installation hat mir die Datei C zu haben: \ Python27 \ Lib \ site-packages \ cv2.pyd

Ich versuche, Dokumentation zu finden, mit zu arbeiten, aber ich bin sehr verwirrt und haben keine Ahnung, wo aus, all Beispiele zu starten ist verwirrend - das heißt:

Meine Fragen:

  1. Bin ich etwas falsch? Ist das nicht die Art, opencv zu installieren?
  2. Wo finde ich gute Dokumentation?
  3. Angenommen, ich habe meinen Text bereit (in einer Zeichenfolge) kann jemand versuchen, mir mit einem Start zu meiner Anwendung zu helfen?

Dank

+1

Blick in [simplecv] (http://simplecv.org/docs/) als als mögliche Alternative. – Blender

+0

Ich werde es versuchen, aber ich habe bereits ihre Website überblickt und es sieht aus wie es zu wenig Dokumentation gibt. und ich verstehe die Sache mit der interaktiven Shell nicht wirklich (muss ich damit arbeiten? Kann ich nur durch ein Python-Skript arbeiten?) –

+0

Ich benutze die interaktive Shell nicht. Die Dokumentation ist nur da, um Ihnen zu zeigen, dass Funktionen existieren, aber der Rest der Funktionalität ist ziemlich selbsterklärend. – Blender

Antwort

18

sollte Ihre Aufgabe relativ einfach mit OpenCV und Python zu erreichen. Es scheint, dass Sie OpenCV neu sind, also werde ich versuchen, meine Erklärung gründlich zu halten, aber zögern Sie nicht zu fragen, ob Sie Klarheit brauchen.

Ich bin mir nicht sicher, ob Sie Ihre Daten von einem Live-Kamera-Video-Feed erhalten oder Post-Processing-Aufzeichnungen sind. So oder so ...

Daten abrufen. Wenn eine Live-Einspielung mit:

capture = cv2.VideoCapture(0) 

Wenn das aufgezeichnete Material mit:

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

Initialise Video Schreiber. Schauen Sie sich at this question an, um Hilfe bei Codecs zu erhalten. Einen funktionierenden Codec zu finden, ist nicht trivial. Ich benutze auch Windows 7 x64, und der unten erwähnte Codec war der einzige, der für mich funktionierte. Stellen Sie außerdem die Variable fps so nah wie möglich an der tatsächlichen Videoframerate ein - Sie können sie nicht mehr ändern, nachdem Sie mit dem Schreiben von Frames begonnen haben.

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)) 

Verarbeiten Sie diese Daten und fügen Sie Ihren Text hinzu. Schreiben Sie zuletzt den bearbeiteten Rahmen in eine Videodatei.

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 

So einfach ist das! Ich verwende den obigen Code, um fast täglich Text in Videodateien zu schreiben, also funktioniert es definitiv. Die einzigen möglichen Probleme, die ich vorhersehen kann, sind die Codecs, über die ich leider nicht viel weiß. Ich hoffe, dass dies Ihr Problem lösen kann, zögern Sie nicht, weitere Fragen zu stellen.

EDIT: Antworten auf die Fragen Ihres Kommentars.

1.) Soweit ich weiß, können Sie .avi nur verwenden, weil Sie ein unkomprimiertes Format mit OpenCV verwenden müssen. Ich fürchte, ich habe keine Ahnung von anderen (komprimierten) Formaten. Vielleicht könnten Sie ein Programm von Drittanbietern für die Vor-/Nachkonvertierung verwenden? Der Grund für die frame Ausnahme war mein Fehler, ich habe die Antwort bearbeitet, um die fehlende Zeile einzuschließen.

2.) Ich habe Angst, ich habe keine Ahnung, wie man Metadaten liest. Wenn ich es herausfinde, werde ich es dich wissen lassen. Meine eigene hackische Lösung zum Finden der Video-Framerate ist es, OpenCV einmal durch das Video laufen zu lassen, indem man das Time Modul benutzt, um die durchschnittliche Framerate zu berechnen. Diese Schätzung kann dann beim Schreiben der Videodatei verwendet werden.

3.) Ich habe festgestellt, dass die Größe des resultierenden Videos erheblich von dem Original abhängig von verschiedenen Faktoren abweichen kann, wobei die wichtigste davon ist, wie nah die gewählte fps der tatsächlichen Originalbildfrequenz war.

4.) Wie für andere Schriftarten gibt es mehrere verfügbar. Ich kann Sie für einen schnellen Überblick auf this question verweisen. Hier ist die entsprechende Dokumentation:

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

Großartig! Das ist sehr nah an dem, was ich brauche. Einige Fragen: 1. Warum können nur AVI-Dateien geöffnet werden? (löst eine Ausnahme aus, wenn ich versuche, die Breite/Höhe des Rahmens zu lesen), 2. Wie kann ich Metadaten der Datei lesen (und um genau zu sein - Zeit/Datum der Schöpfung, und FPS) 3. Warum das resultierende Video ist 3 oder 4 mal größer (Raum, nicht Rahmen natürlich), 4. Was mehr Schriftarten, Stile habe ich für die Schriftart? –

+0

Ich habe meine Antwort bearbeitet, um einige Ihrer neuen Fragen einzubeziehen. Bitte beachten Sie auch, dass in meinem ursprünglichen Code ein Fehler aufgetreten ist, dieser jedoch behoben wurde. Bitte fragen Sie, ob noch etwas unklar ist! – casper

+0

Hey, kannst du mir helfen ?, ich verstehe nicht, was mit dem Audio des Videos passiert ist –

1

hachoir-metadata verwendet, um Metadaten von Video-Datei zu lesen (einschließlich Framerate, Höhe und Breite

Import.

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 

Funktion:

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 

Verwendung:

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

sehen relevante Eigenschaften:

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