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

2022-09-02 11:20:42

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

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

我尝试过使用OpenCV和MATLAB的模板匹配方法,但是当与其他图像一起测试时,结果很差。

我也读过这个页面,但我无法很好地理解从中该怎么做。

任何人都可以帮助我或给我一个逐步解决问题的方法吗?我有一个项目来识别车牌,我们可以识别和检测数字,但我需要检测和识别单词(与更多汽车相同的单词)


答案 1

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

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

您需要做的事情:

1) 镜像隔离

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

car too in addition to plate

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

  • 车牌是否总是出现在车上的同一位置?
  • 拍摄图像时,汽车是否始终处于相同的位置?
  • 您正在寻找的单词是否始终位于车牌上的同一位置?

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

2) 图像捕获/预处理

对于您的特定实现,这是一个非常重要的步骤。尽管可能,但您的图像不太可能看起来像这样:

perfection

因为您的相机必须直接位于车牌前方。更有可能的是,您的图片可能看起来像以下图片之一:

messed up plate (scale wrong)

also bad plate (dimensions)

取决于从中获取图像的透视。理想情况下,您的所有图像都将从同一有利位置拍摄,您只需应用一次变换,使它们看起来都相似(或者根本不应用一个)。如果您有从不同有利位置拍摄的照片,则需要对其进行操作,否则您将比较两个不同的图像。此外,特别是如果您仅从一个有利位置拍摄图像并决定不进行转换,请确保您的算法正在寻找的文本已转换为来自同一角度。如果你不这样做,你的成功率就不是那么高,很难调试/弄清楚。

3) 图像优化

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

4) 模式识别

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

5) 算法训练

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

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)

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

祝你好运!


答案 2

如果你问“我想检测图像是否包含单词”بابل“ - 这是经典的问题,可以使用分类器等 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%的城市名称开箱即用。我在不同的项目中使用了类似的方法,并且非常确定它们有效


推荐