如何从录制的监控摄像机视频中读取时间?

时间:2010-12-21 20:14:59

标签: java image-processing computer-vision ocr video-processing

我有一个问题,我必须从监控摄像机录制的视频中读取录制时间。

时间显示在视频的左上角区域。下面是显示时间区域的屏幕抓取链接。此外,数字颜色(白色/黑色)在视频持续时间内不断变化。

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

请指导我解决这个问题。我是一名Java程序员,所以更喜欢通过Java的方法。

修改 非常感谢unhillbilly的评论。我查看了Ron Cemer OCR库,其性能远低于我们的要求。

由于ocr性能低于预期,我计划使用屏幕抓取为所有数字构建字符集,并使用一些图像/像素比较库将帧时间与将显示的字符集进行比较比较后的概率结果。

所以我一直在寻找一个好的图像比较库(我可以使用非java库,我可以使用命令行运行)。对上述方法的任何建议都会非常有用。

4 个答案:

答案 0 :(得分:6)

这似乎不需要完整的OCR 我认为数字总是在图像中的相同位置。您只希望每个知道位置的数字0-9(黑色或白色) 一个简单的模板在每个位置与每个数字匹配(每种颜色的10个数字都有20个模板)非常快(实时),应该给你非常准确的结果。

答案 1 :(得分:1)

(vhs,dvd,stills)源代码是什么格式?时间戳可能在数据中编码。

更新详情

虽然我完全理解拥有自动化端到端流程的愿望(特别是如果您销售此应用而不是创建内部工具),那么让某人手动输入会更有效率每个视频的开始时间(即使有数百个)然后花费数周的编码让它自动生效。

我做了什么(没有一个我认为不存在的简单,非常快速实施,超精确的OCR解决方案):

创建几个数据库表,例如

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可能包含

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

video将通过导入脚本预先填充视频文件名。最初分配group_id 1(未分配)

的所有内容

创建一个简单的Winforms或WPF应用程序(请原谅我的ASCII艺术):

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

用户(任何人都可以这样做 - 秘书,看门人,甚至是最近的CS毕业生)。他们所要做的就是从预览框中读取时间,将其键入Start Time字段,然后单击“更新”或“下一步”以更新数据库并继续下一个数据库。除非用户更改,否则请将群组选择从一个视频保留到下一个视频。

假设用户需要30秒才能阅读,请输入并点击下一步,他们可以在一小时内完成100-150个视频(将其称为75以获得更真实的估算)。而且,实习生比开发者时间便宜很多。

如果你真的有“数百”的视频,那么这样做的速度仍然比用OCR搞定更快。如果OCR在大多数情况下起作用,您很可能需要让某人手动检查所有内容以查看结果是否正确。这引出了一个问题,为什么要为OCR烦恼呢?

答案 2 :(得分:1)

Java OCR将完美适合您的情况(Ron Cemer在这里)。您需要做的就是删除背景图像,或使其始终小于50%白色,这样当图像转换为单色时,白色字符将为白色,背景将为黑色。

在字体上训练JavaOCR,从图像中提取该矩形区域,删除背景,然后关闭并运行。

我建议使用一种算法来查看r,g,b并将所有内容设置为黑色,其中r,g,b不是完全相同的值。这将只留下完美的灰色阴影。由于图像是彩色的,而数字是单色的,因此会留下数字和灰尘。

JavaOCR希望在白色背景上看到黑色字符,所以一旦完成上述操作,您还需要反转单色图像(白色=黑色,反之亦然)。然后通过JavaOCR库运行它,向它传递你希望它识别的所有字符的引用样本,并且你的问题应该(至少大部分)解决。

答案 3 :(得分:0)

从Google尝试Tesseractarecouple个JNI包装器可用。请务必阅读常见问题解答以仅提取数字。