我有一个问题,我必须从监控摄像机录制的视频中读取录制时间。
时间显示在视频的左上角区域。下面是显示时间区域的屏幕抓取链接。此外,数字颜色(白色/黑色)在视频持续时间内不断变化。
http://i55.tinypic.com/2j5gca8.png
请指导我解决这个问题。我是一名Java程序员,所以更喜欢通过Java的方法。
修改 非常感谢unhillbilly的评论。我查看了Ron Cemer OCR库,其性能远低于我们的要求。
由于ocr性能低于预期,我计划使用屏幕抓取为所有数字构建字符集,并使用一些图像/像素比较库将帧时间与将显示的字符集进行比较比较后的概率结果。
所以我一直在寻找一个好的图像比较库(我可以使用非java库,我可以使用命令行运行)。对上述方法的任何建议都会非常有用。
答案 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)