Comment lire l'heure à partir de la caméra de surveillance vidéo enregistrée?

j'ai un problème lorsque je dois lire le moment de l'enregistrement de la vidéo enregistrée par une caméra de surveillance.

Le temps s'affiche sur la zone en haut à gauche de la vidéo. Ci-dessous est un lien à l'écran grab de la zone qui montre l'heure. En outre, la couleur du chiffre(blanc/noir) continue de changer pendant la durée de la vidéo.

alt text http://i55.tinypic.com/2j5gca8.png

S'il vous plaît guidez-moi dans la direction d'aborder ce problème. Je suis un programmeur Java, donc je préférerais une approche par Java.

EDIT: Grâce unhillbilly pour le commentaire. J'avais regardé la bibliothèque RON Cemer OCR et son rendement est bien en dessous de nos exigences.

puisque la performance ocr est moins que désirée, j'avais l'intention de construire un jeu de caractères en utilisant les captures d'écran pour tous les chiffres, et en utilisant certains bibliothèque de comparaison d'image / pixel pour comparer le temps d'image avec le jeu de caractères qui affichera un résultat probabiliste après comparaison.

donc je cherchais une bonne bibliothèque de comparaison d'image(je serais D'accord avec une bibliothèque Non-java que je peux exécuter en utilisant la ligne de commande). Également des conseils sur l'approche ci-dessus serait vraiment utile.

9
demandé sur stressed_geek 2010-12-21 23:14:59

4 réponses

il ne semble pas que vous ayez besoin d'une OCR complète ici.

Je suppose que les nombres sont toujours dans la même position dans l'image. Vous n'attendez que des chiffres 0-9 à chacune des positions connues (en noir ou blanc).

Un simple modèle correspondant à chaque position de chacun des chiffres (vous aurez 20 modèles pour les 10 chiffres à chaque couleur) est très rapide (en temps réel) et devrait vous donner des résultats très précis.

6
répondu Adi Shavit 2010-12-27 12:08:34

dans quel format est la source (vhs, dvd, photos)? Il est possible que l'horodatage est codée dans les données.

mise à jour avec plus de détails

bien que je comprenne parfaitement le désir d'avoir un processus automatisé de bout en bout (surtout si vous vendez cette application plutôt que de créer un outil interne), il serait plus efficace d'avoir quelqu'un entrer manuellement l'Heure de début pour chaque vidéo (même s'il y a des centaines d'entre eux) puis de passer des semaines de codage pour que cela fonctionne automatiquement.

Ce que je fais (à défaut d'un simple, très rapide à mettre en œuvre, super-précision de l'OCR solution à laquelle je ne crois pas qu'il existe):

créer un couple de tables de base de données, comme

video           video_group
-------         -----------
id              id
filename        title
start_time      date_created
group_id        date_modified
date_created    date_deleted
date_modified
date_deleted

video_group pourrait contenir

id| title
-----------
1 | Unassigned
2 | 711 Mockingbird @ 75
3 | Kroger storage room

video serait pré-peuplé avec les noms de fichiers vidéo par un script d'importation. Initialement affecter tout un group_id de 1 (non attribué)

Créer un simple Winforms ou WPF application (pardon pour mon ASCII art):

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  Group: [=========]\/ [New group...]                            |
|                                                                 |
|  File:  [=========]\/                                           |
|                                                                 |
|  Preview                                                        |
|  |--------------------------------------| [Next Video]          |
|  | (first frame of selected video here) | [Prev]                |
|  |                                      |                       |
|  |                                      |                       |
|  |                                      |                       |
|  |--------------------------------------|                       |
|  Start Time                                                     |
|  [(enter start time value here as displayed on preview frame)]  |
|                                                                 |
|  [Update]                                                       |
-------------------------------------------------------------------

un utilisateur (n'importe qui pourrait le faire - Secrétaire, Concierge, même un récent diplômé CS). Tout ce qu'ils ont à faire est de lire le temps à partir de la fenêtre de prévisualisation, de le taper dans le champ Start Time , et de cliquer sur "update" ou "Next" pour mettre à jour la base de données et passer à la suivante. Gardez la sélection de groupe d'une vidéo à l'autre à moins que les modifications de l'utilisateur.

en supposant qu'il faut 30 secondes à l'utilisateur pour lire, taper et cliquer suivant, il pourrait réaliser 100-150 vidéos en une heure (appelez-le 75 pour une estimation plus réaliste). Et, les internes sont beaucoup moins chers que le temps des développeurs.

si vous avez vraiment des" centaines " de vidéos, il sera encore plus rapide de le faire de cette façon que de faire avec OCR. Si la ROC fonctionne pour la plupart, vous aurez très probablement besoin de quelqu'un inspecter manuellement tout pour voir si les résultats sont corrects. ce qui pose la question, pourquoi s'embêter avec la ROC?

1
répondu 3Dave 2010-12-23 16:47:23

Java OCR conviendra parfaitement à votre situation (ici Ron Cemer). Tout ce que vous devez faire est de supprimer l'image de fond, ou de les rendre toujours moins de 50% de blanc, de sorte que les caractères blancs seront en blanc sur fond noir lorsque l'image est convertie en monochrome.

Train JavaOCR sur la police, extraire cette région rectangulaire de l'image, Supprimer l'arrière-plan et vous êtes hors et en cours d'exécution.

je suggère un algorithme qui ressemble à r,g,b et met tout de noir où r,g,b ne sont pas exactement les mêmes valeurs. Cela ne laissera que les pixels qui sont des nuances parfaites de gris. Puisque l'image est couleur et les chiffres sont monochromes, cela laissera les chiffres et de la poussière.

JavaOCR veut voir des caractères noirs sur un fond blanc, donc une fois que vous avez fait ce qui précède, vous devrez également inverser l'image monochrome (blanc = noir et vice-versa). Ensuite, Lancez ça dans le JavaOCR. bibliothèque, en lui passant des échantillons de référence de tous les caractères que vous attendez qu'il reconnaisse, et votre problème devrait être (au moins la plupart du temps) résolu.

1
répondu Ron Cemer 2011-09-27 06:16:30

essayer Tesseract de Google, il sont a couple d'emballages JNI disponibles. Assurez-vous de lire la FAQ pour tirer seulement les chiffres.

0
répondu Steve-o 2010-12-23 05:32:36