检测图像中的对象(单词)

时间:2014-04-12 08:24:50

标签: java c++ matlab opencv image-processing

我想在车牌(城市名称)中实现对象检测。我有一张图片:

我想检测图像是否包含单词“بابل”:

我尝试过使用OpenCV的模板匹配方法,也使用MATLAB,但在使用其他图像测试时结果很差。

我也读过this page,但我无法很好地理解该怎么做。

任何人都可以帮我或一步一步地解决这个问题吗? 我有一个识别车牌的项目,我们可以识别并检测数字,但我需要检测并识别单词(这是与更多车辆相同的单词)

2 个答案:

答案 0 :(得分:46)

您的问题非常广泛,但我会尽力在程序化背景下解释光学字符识别(OCR),并为您提供一般项目工作流程,然后是成功的OCR算法。

您面临的问题比大多数人更容易,因为您不必识别/区分不同的角色,而只需要识别单个图像(假设这是您唯一想要识别的城市)。但是,您受到任何图像识别算法(质量,光照,图像变化)的许多限制。

您需要做的事情:

1)图像隔离

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

car too in addition to plate

我认为最好的隔离技术是首先隔离牌照,然后隔离您正在寻找的特定字符。在此步骤中要记住的重要事项:

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

任务的难度/实施在很大程度上取决于这三个问题的答案。

2)图像捕获/预处理

这是您特定实施的一个非常重要的步骤。虽然可能,但您的图片看起来不太可能如下:

perfection

因为你的相机必须直接在车牌前面。更有可能的是,您的图片可能看起来像其中之一:

messed up plate (scale wrong)

also bad plate (dimensions)

取决于拍摄图像的视角。理想情况下,所有图像都将从相同的有利位置拍摄,您只需应用单个变换,使它们看起来相似(或根本不应用)。如果您从不同的有利位置拍摄照片,则需要来操作它们,否则您将比较两个不同的图像。此外,尤其是如果您只从一个有利位置拍摄图像并决定不进行变换,请确保您的算法所寻找的文本转换为来自相同的视点。如果不这样做,那么你将获得一个难以调试/计算出来的不太高的成功率。

3)图片优化

您可能希望(a)将图像转换为黑白图像,以及(b)降低图像的噪点。这两个过程分别称为二值化和去斑点。这些算法有许多实现可用于许多不同语言,大多数可通过Google搜索访问。如果需要,您可以使用任何语言/免费工具批量处理图像,或者找到适合您决定使用的任何语言的实现。

4)模式识别

如果您只想搜索这个城市的名称(只有一个词),您很可能希望实施矩阵匹配策略。许多人还将矩阵匹配称为模式识别,因此您可能在此之前已经听过它。这是一个excellent paper详细说明了一个算法实现,如果您选择使用矩阵匹配,它将极大地帮助您。可用的另一种算法是特征提取,其尝试基于字母内的模式(即循环,曲线,线)来识别单词。如果牌照上的单词的字体样式发生变化,你可以使用它,但是如果总是使用相同的字体,我认为矩阵匹配会得到最好的结果。

5)算法培训

根据您采用的方法(如果使用学习算法),您可能需要使用标记的数据训练算法。这意味着您有一系列图像,您已将其标识为True(包含城市名称)或False(不是)。这是一个如何工作的伪代码示例:

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

img_recognizer = algorithm(train)

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

test_untagged = [img5, img6, img7]

for image in test_untagged:
    img_recognizer(image)

您的训练集应远大于四个数据点;一般来说,越大越好。正如我之前所说,只要确保所有图像都是完全相同的转换。

这是一个非常非常高级的代码流,可能有助于实现您的算法:

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)

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

祝你好运!

答案 1 :(得分:13)

如果你问“我想检测图像是否包含单词”بابل“ - 这是使用http://code.opencv.org/projects/opencv/wiki/FaceDetection类似分类器解决的经典问题。

但我认为你还需要更多。多年前我试图解决simiar问题,并提供示例图像来显示它的好坏:

enter image description here

对于检测到的牌照,我使用了非常基本的矩形检测,它包含在每个OpenCV样本文件夹中。然后使用透视变换来修复布局和大小。重要的是要实施多项检查以确定矩形是否足以成为车牌。例如,如果矩形是500px高和2px宽,那么可能这不是我想要的并被拒绝。

使用https://code.google.com/p/cvblob/提取检测到的平板上的阿拉伯文字和其他成分。我昨天对其他项目也有类似的需求。我不得不从页面中提取日语汉字符号:

enter image description here

CvBlob为你做了很多工作。

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