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

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

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

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

我也读过这个页面,但是我不能很好地理解该怎么做。

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


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

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

你需要做的事情:

1) 图像隔离

您必须将图像从嘈杂的背景中分离出来:

除了车牌之外,车也是如此

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

  • 牌照是否总是出现在车上的同一个地方?
  • 拍摄图像时汽车是否总是处于相同的位置?
  • 您正在寻找的字始终位于车牌上的相同位置?
  • 这项任务的难度/实施在很大程度上取决于这三个问题的答案。

    2) 图像捕获/预处理

    这对于您的特定实施非常重要。 尽管可能,但您的图像看起来像这样的可能性很小:

    因为您的相机必须直接放在车牌前面。 更可能的是,你的图像可能看起来像这样:

    搞乱了盘子(规模不对)

    还坏板(尺寸)

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

    3) 图像优化

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

    4) 模式识别

    如果你只想搜索这个城市的名字(只有一个词),你很可能会想要实现一个矩阵匹配策略。 许多人也将矩阵匹配称为模式识别,因此您可能在此之前已经听说过它。 下面是一篇很好的论文,详细介绍一种算法实现,如果您选择使用矩阵匹配,该算法应该能够帮助您。 另一种可用的算法是特征提取,它试图根据字母内的模式(即循环,曲线,线条)来识别单词。 如果车牌字的字体风格发生变化,您可能会使用这种方式,但如果始终使用相同的字体,我认为矩阵匹配会得到最好的结果。

    5) 算法训练

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

    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)
    

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

  • 纯Java
  • OpenCV中的cvBlob(请查看本教程和此博客文章)
  • tesseract-ocr在C ++中
  • Matlab OCR
  • 祝你好运!


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

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

    在这里输入图像描述

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

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

    CvBlob为你做了很多工作。

    下一步使用技巧解释http://blog.damiles.com/2008/11/basic-ocr-in-opencv/匹配城市名称。 只要用不同城市名称的示例图像教算法,不久它就会告知99%刚刚开箱即用的算法。 我在不同的项目上使用过类似的方法,并确信它们的工作

    链接地址: http://www.djcxy.com/p/79569.html

    上一篇: Detecting an object (words) in an image

    下一篇: Detecting multiple images in a single image