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

Maa*_*adh 15 c++ java matlab opencv image-processing

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

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

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

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

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

Lui*_*igi 46

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

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

你需要做的事情:

1)图像隔离

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

车也除了板

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

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

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

2)图像捕获/预处理

这是您特定实施的一个非常重要的步骤.尽管可能,但您的图片看起来不太可能如下所示:

完美

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

搞砸板(规模错误)

坏板(尺寸)

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

3)图像优化

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

4)模式识别

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

5) 算法训练

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

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

img_recognizer = algorithm(train)
Run Code Online (Sandbox Code Playgroud)

然后,您应用训练有素的算法来识别未标记的图像.

test_untagged = [img5, img6, img7]

for image in test_untagged:
    img_recognizer(image)
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

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

祝好运!


Tõn*_*uel 13

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

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

在此输入图像描述

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

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

在此输入图像描述

CvBlob为你做了很多工作.

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