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

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

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

替代文字 http://i55.tinypic.com/2j5gca8.png

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

编辑:感谢unhillbilly的评论。 我查看了Ron Cemer OCR库,其性能远低于我们的要求。

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

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

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

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

更新更详细

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

我做了什么(没有一个我认为不存在的简单,非常快速实现,超精确的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将通过导入脚本预先填充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] | ------------------------------------------------------------------- 

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

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

如果你真的有“数百”的video,那么这样做的速度仍然比用OCR搞定更快。 如果OCR大部分工作,您很可能需要有人手动检查所有内容以查看结果是否正确。 这引出了一个问题,为什么要为OCR而烦恼?

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

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

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

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

试试谷歌的Tesseract ,有几个 JNI包装器可用。 确保阅读常见问题解答仅拉数字。