Ich habe ein Problem, bei dem ich den Aufnahmezeitpunkt aus dem Video einer Überwachungskamera ablesen muss.
Die Zeit wird oben links im Video angezeigt. Unten ist ein Link zur Bildschirmaufnahme des Bereichs, der die Uhrzeit anzeigt. Außerdem ändert sich die Farbe der Ziffern (weiß / schwarz) während der Dauer des Videos.
Bitte leiten Sie mich in die Richtung, dieses Problem anzugehen. Ich bin ein Java-Programmierer und würde daher einen Ansatz über Java bevorzugen.
BEARBEITEN: Danke unhillbilly für den Kommentar. Ich habe mir die OCR-Bibliothek von Ron Cemer angeschaut und ihre Leistung liegt weit unter unseren Anforderungen.
Da die OCR-Leistung geringer als gewünscht ist, plante ich, einen Zeichensatz mit den Screen Grabs für alle Ziffern zu erstellen und eine Bild- / Pixelvergleichsbibliothek zu verwenden, um die Bildzeit mit dem Zeichensatz zu vergleichen, der angezeigt wird ein probabilistisches Ergebnis nach dem Vergleich.
Also habe ich nach einer guten Bildvergleichsbibliothek gesucht (ich wäre mit einer Nicht-Java-Bibliothek in Ordnung, die ich über die Befehlszeile ausführen kann). Auch jeder Hinweis auf den obigen Ansatz wäre sehr hilfreich.
Es scheint hier nicht so, als ob Sie eine vollständige OCR brauchen würden
Ich nehme an, dass die Zahlen immer in der gleichen Position im Bild sind. Sie erwarten nur Ziffern 0-9 an jeder der bekannten Positionen (in schwarz oder weiß).
Eine einfache Vorlage, die an jeder Position mit jeder der Ziffern übereinstimmt (Sie haben 20 Vorlagen für die 10 Ziffern bei jeder Farbe), ist sehr schnell (in Echtzeit) und sollte Ihnen sehr genaue Ergebnisse liefern.
In welchem Format ist die Quelle (VHS, DVD, Standbilder)? Es ist möglich, dass der Zeitstempel in den Daten codiert ist.
Aktualisierung mit mehr Details
Obwohl ich vollständig den Wunsch nach einem automatisierten End-to-End-Prozess verstehe (insbesondere wenn Sie diese App verkaufen, anstatt ein eigenes Tool zu erstellen), wäre es effizienter, jemanden manuell einzugeben die Startzeit für jedes Video (auch wenn es Hunderte von ihnen gibt), um dann Wochen des Codierens damit zu verbringen, dies automatisch zu arbeiten.
Was ich tun würde (wenn eine einfache, sehr schnell zu implementierende, sehr genaue OCR-Lösung fehlschlägt, von der ich glaube, dass sie nicht existiert):
Erstellen Sie ein paar Datenbanktabellen wie
%Vor% video_group
könnte
video
würde mit den Video-Dateinamen durch ein Import-Skript vorbelegt werden. Ordnen Sie zunächst alles a group_id
von 1 (nicht zugewiesen)
Erstellen Sie eine einfache Winforms- oder WPF-App (entschuldigen Sie meine ASCII-Kunst):
%Vor% Ein Benutzer (jeder könnte das tun - Sekretär, Hausmeister, sogar ein frischgebackener CS-Absolvent). Sie müssen nur die Zeit aus dem Vorschaubild lesen, sie in das Feld Start Time
eingeben und auf "Aktualisieren" oder "Weiter" klicken, um die Datenbank zu aktualisieren und mit der nächsten fortzufahren. Behalten Sie die Gruppenauswahl von einem Video zum nächsten bei, es sei denn, der Benutzer ändert es.
Wenn der Benutzer 30 Sekunden zum Lesen braucht, tippen Sie ein und klicken Sie auf Weiter. Sie könnten 100-150 Videos in einer Stunde fertigstellen (nennen Sie es 75 für eine realistischere Schätzung). Und Praktikanten sind viel billiger als Entwickler Zeit.
Wenn Sie wirklich "hunderte" Videos haben, ist es immer noch schneller, als mit OCR zu experimentieren. Wenn die OCR größtenteils funktioniert, müssen Sie höchstwahrscheinlich manuell alles überprüfen, um zu sehen, ob die Ergebnisse korrekt sind. was die Frage aufwirft, warum mit der OCR zu tun?
Java OCR wird perfekt für Ihre Situation funktionieren (Ron Cemer hier). Alles, was Sie tun müssen, ist das Hintergrundbild zu entfernen, oder es immer weniger als 50% weiß zu machen, so dass die weißen Zeichen weiß sind und der Hintergrund schwarz wird, wenn das Bild in monochrom umgewandelt wird.
Trainiere JavaOCR auf der Schriftart, extrahiere diese rechteckige Region aus dem Bild, entferne den Hintergrund und du bist fertig und los.
Ich schlage einen Algorithmus vor, der r, g, b betrachtet und alles auf schwarz setzt, wo r, g, b nicht genau dieselben Werte sind. Das wird nur Pixel lassen, die perfekte Grautöne sind. Da das Bild eine Farbe hat und die Ziffern einfarbig sind, hinterlässt das Ziffern und etwas Staub.
JavaOCR möchte schwarze Zeichen auf einem weißen Hintergrund sehen. Wenn Sie das oben genannte getan haben, müssen Sie auch das monochrome Bild invertieren (weiß = schwarz und umgekehrt). Führen Sie das dann durch die JavaOCR-Bibliothek durch und übergeben Sie ihm Referenzmuster aller Zeichen, von denen Sie erwarten, dass sie es erkennen, und Ihr Problem sollte (zumindest größtenteils) gelöst sein.
Tags und Links java ocr image-processing computer-vision video-processing