关于java:检测图像中的对象(单词)

Detecting an object (words) in an image

我想在车牌(城市名称)中实现目标检测。我有一个图像:

></P><P>我想检测图像中是否有这个词????

></P><P>我尝试过使用OpenCV和Matlab的模板匹配方法,但是用其他图像进行测试时,结果很差。</P><P>我也读过这一页,但我不能很好地理解从中应该做什么。</P><P>有人能帮助我吗,或者给我一个循序渐进的方法来解决这个问题?我有一个识别车牌的项目,我们可以识别和检测车牌号,但我需要检测和识别这些词(更多的车是相同的词)</P></p>
<div class=


您的问题非常广泛,但我将尽我所能在编程环境中解释光学字符识别(OCR),并为您提供一个通用的项目工作流程,随后是成功的OCR算法。好的。

你面临的问题比大多数人都容易,因为你不需要识别/区分不同的字符,你只需要识别一个图像(假设这是你唯一想要识别的城市)。但是,您会受到任何图像识别算法(质量、照明、图像变化)的许多限制。好的。

你需要做的事情:好的。

1)图像隔离好的。

您必须将图像与嘈杂的背景隔离开来:好的。

car too in addition to plate好的。

我认为最好的隔离技术是首先隔离车牌,然后隔离您要查找的特定字符。在这一步中要记住的重要事项:好的。

  • 车牌总是出现在车上的同一个地方吗?
  • 拍摄图像时,车辆是否始终处于同一位置?
  • 你要找的词总是在车牌上的同一个地方吗?

任务的困难/执行很大程度上取决于这三个问题的答案。好的。

2)图像采集/预处理好的。

这对于您的特定实现是非常重要的一步。虽然可能,但您的图像不太可能像这样:好的。

perfection好的。

因为你的相机必须直接在车牌前面。更可能的是,您的图像可能如下所示:好的。

messed up plate (scale wrong)好的。

also bad plate (dimensions)好的。

取决于拍摄图像的角度。理想情况下,所有图像都将从同一个有利位置拍摄,您只需应用一个变换,使它们看起来都相似(或根本不应用一个)。如果你有从不同的有利位置拍摄的照片,你需要操纵它们,否则你将比较两个不同的图像。此外,特别是如果您只从一个有利的角度拍摄图像,并决定不进行转换,请确保您的算法要查找的文本从相同的角度进行转换。如果您不这样做,您的成功率就不会太高,很难调试/计算出来。好的。

3)图像优化好的。

您可能需要(a)将图像转换为黑白图像,(b)降低图像的噪声。这两个过程分别称为二值化和去校验。这些算法有许多不同语言的实现,最容易通过谷歌搜索获得。如果需要,您可以使用任何语言/自由工具批量处理图像,或者找到一个与您决定使用的任何语言一起工作的实现。好的。

4)模式识别好的。

如果您只想搜索这一个城市的名称(只有一个单词),那么您很可能希望实现矩阵匹配策略。许多人还将矩阵匹配称为模式识别,因此您以前可能听过这种情况。这是一篇优秀的论文,详细介绍了一种算法实现,如果您选择使用矩阵匹配,它将极大地帮助您。另一种可用的算法是特征提取,它试图根据字母中的模式(即循环、曲线、直线)来识别单词。如果牌照上的单词的字体样式发生变化,您可能会使用该字体,但如果始终使用相同的字体,我认为矩阵匹配将获得最佳结果。好的。

5)算法培训好的。

根据所采用的方法(如果使用学习算法),可能需要使用标记的数据训练算法。这意味着你有一系列的图片,你已经确定为EDOCX1(包含城市名称)或EDOCX1(不包含城市名称)。下面是一个psuedocode示例,说明了这是如何工作的:好的。

1
2
3
train = [(img1, True), (img2, True), (img3, False), (img4, False)]

img_recognizer = algorithm(train)

然后,应用训练过的算法来识别未标记的图像。好的。

1
2
3
4
test_untagged = [img5, img6, img7]

for image in test_untagged:
    img_recognizer(image)

你的训练集应该比四个数据点大得多;一般来说,越大越好。正如我之前所说,只要确保所有图像都具有相同的转换。好的。

下面是一个非常高级的代码流,它可能有助于实现您的算法:好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
img_in = capture_image()

cropped_img = isolate(img_in)

scaled_img = normalize_scale(cropped_img)

img_desp = despeckle(scaled_img)

img_final = binarize(img_desp)

#train
match() = train_match(training_set)

boolCity = match(img_final)

上述过程已经实施了很多次,并以多种语言进行了详细记录。以下是您问题中标记语言的一些实现。好的。

  • 纯爪哇
  • opencv中的cvblob(也可以查看本教程和本博客文章)
  • C++中的TestSerACT OCR
  • MATLAB OCR

祝你好运!好的。好啊。


如果你问"我想检测图像中是否包含这个词"?你说什么??"-这是一个经典问题,可以使用类似分类器的http://code.opencv.org/projects/opencv/wiki/facedetection解决。

但我想你还是想要更多。几年前,我试图解决类似的问题,我提供了一个示例图像来展示它有多好/有多坏:

enter image description here

为了检测车牌,我使用了非常基本的矩形检测,包括在每个OpenCV样本文件夹中。然后使用透视转换来固定布局和大小。重要的是要实施多次检查,看看矩形是否看起来足够好,可以作为牌照。例如,如果矩形高500px,宽2px,那么这可能不是我想要的,并且被拒绝了。

使用https://code.google.com/p/cvblob/提取检测板上的阿拉伯语文本和其他组件。昨天我在其他项目上也有类似的需求。我必须从以下页面中提取日文汉字符号:

氧化镁

cvblob为您做了很多工作。

下一步使用技术解释http://blog.damiles.com/2008/11/basic-ocr-in-opencv/匹配城市名称。只要用不同城市名称的示例图像教算法,很快它就会告诉99%的城市名称只是开箱即用。我在不同的项目中使用了类似的方法,并且非常确定它们是有效的。