【问题标题】:read numbers and letters from an image using openCV使用openCV从图像中读取数字和字母
【发布时间】:2011-06-10 00:26:50
【问题描述】:

我正在开发一个应用程序,以使用 c++ 中的 opencv 从图像中读取字母和数字。我首先将给定的彩色图像和颜色模板更改为二值图像,然后调用方法 cvMatchTemplate()。这种方法只是突出了模板匹配的区域..但不清楚..我只是不想看到该区域..我需要解析图像中的字符(字母和数字)。我是openCV的新手。有没有人知道其他方法可以得到结果??

图像是从相机拍摄的。示例图像如上所示。我需要从 LED 显示屏(130 和 Delft Tanthaf)获取所有文本。

朋友们,我尝试了人脸检测的示例应用程序,它检测到了人脸。 HaarCascade 文件随 openCV 一起提供。我刚刚加载了该文件并调用了方法 cvHaarDetectObjects();为了检测字母,我使用 openCV 提供的应用程序 letter_recog.cpp 创建了 xml 文件。但是当我加载这个文件时,它显示了一些错误(OpenCV 错误:UnSpecified error > in unknown function, file ........\ocv\opencv\src\cxcore\cxpersistence.cpp,第 4720 行)。我在网上搜索了这个错误并获得了有关使用的 lib 文件的信息。我这样做了,但错误仍然存​​在。是我的xml文件出错还是调用加载这个xml文件的方法((CvHaarClassifierCascade*)cvLoad("builded xml file name",0,0,0);)??请帮忙...

提前致谢

【问题讨论】:

    标签: opencv


    【解决方案1】:

    从 OpenCV 3.0 开始(在活动开发中),您可以使用内置的“场景文本”对象检测模块~

    文本检测是建立在这两篇论文之上的:

    找到场景中文本的位置后,您可以针对这些切片运行任何类型的标准 OCR(Tesseract OCR 很常见)。现在在 opencv 中有一个使用 OpenCV 的 Tesseract 新接口的端到端示例:

    【讨论】:

    • 既没有参考也没有例子
    • 嗯。奇怪的是他们都搬走了。 :/ 尽我所能更新。
    【解决方案2】:

    由于光照不一致、方向变化、比例变化等原因,模板匹配对于此类应用程序往往不可靠。解决此问题的典型方法是引入机器学习。通过训练自己的增强分类器来尝试做的是一种可能的方法。但是,我认为您没有正确地进行培训。你提到你给了它 1 个标志作为正面训练图像和 5 个其他不包含标志的图像作为负面例子?通常,您需要训练样本数量为数百或数千或更多。您不可能使用 6 个训练样本进行训练并期望它能够工作。

    如果您不熟悉机器学习,大致应该这样做:

    1) 您需要收集您要检测的对象的 许多 个正训练样本(从数百个开始,但通常越多越好)。如果您尝试检测图像中的单个字符,则获取单个字符的裁剪图像。为此,您可以从 MNIST 数据库开始。更好的是,为了针对您的特定问题训练分类器,从照片中获取许多公共汽车上人物的裁剪图像。如果您尝试检测整个矩形 LED 板面板,则使用它们的图像作为您的正训练样本。

    2) 您将需要收集 许多 个负训练样本。它们的数量应该与您拥有的正训练样本的数量相同。这些可能是您将运行检测器的图像中出现的其他对象的图像。例如,您可以裁剪公共汽车前部、路面、沿路树木等的图像,并将它们用作反面示例。这是为了帮助分类器在您运行检测器的图像中排除这些对象。因此,负面示例不仅仅是包含您不想检测的对象的任何图像。它们应该是可能被误认为是您在运行检测器的图像中尝试检测的对象的对象(至少对于您的情况而言)。

    关于如何训练级联分类器并生成 XML 模型文件,请参见以下链接:http://note.sonots.com/SciSoftware/haartraining.html

    尽管您提到您只想检测单个字符而不是总线上的整个 LED 面板,但我还是建议您首先检测 LED 面板,以便定位包含感兴趣字符的区域。之后,要么在这个较小的区域内执行模板匹配,要么运行一个经过训练的分类器,以识别该区域中使用滑动窗口方法获得的像素块上的单个字符,并且可能在多个尺度上。 (注意:您上面提到的 haarcascade 增强分类器将检测字符,但它不会告诉您它检测到的字符,除非您只训练它来检测该特定字符......)以滑动窗口方式检测该区域中的字符将给出您可以按照字符出现的顺序将它们串成单词等。

    希望这会有所帮助。

    编辑:

    我在单独发现@KaolinFire 提到的OpenCV 3 中的场景文本模块后偶然发现了我的这篇旧帖子。

    对于那些好奇的人,这是在 OP 提供的示例图像上运行该检测器的结果。请注意,检测器能够定位文本区域,即使它返回多个边界框。

    请注意,此方法并非万无一失(至少在 OpenCV 中此实现具有默认参数)。它往往会产生误报,尤其是当输入图像包含许多“干扰因素”时。 以下是在 Google Street View 数据集上使用此 OpenCV 3 文本检测器获得的更多示例:

    请注意,它倾向于在平行线(例如窗户、墙壁等)之间找到“文本”。由于 OP 的输入图像可能包含户外场景,这将是一个问题,尤其是如果他/她不将感兴趣的区域限制在 LED 标志周围的较小区域。

    看来,如果您能够定位一个仅包含文本的“粗糙”区域(例如,仅 OP 示例图像中的 LED 标志),那么运行此算法可以帮助您获得更紧密的边界框。但是您将不得不处理误报(可能丢弃小区域或使用基于 LED 标志上字母显示方式的启发式算法在重叠的边界框中进行挑选)。

    这里有更多关于文本检测的资源(讨论 + 代码 + 数据集)。

    代码

    数据集

    您将在此处找到 google streetview 和 MSRA 数据集。尽管这些数据集中的图像与公交车上 LED 标志的图像并不完全相同,但它们可能有助于从几个竞争算法中挑选“最佳”性能的算法,或者从头开始训练机器学习算法。

    http://www.iapr-tc11.org/mediawiki/index.php/Datasets_List

    【讨论】:

      【解决方案3】:

      查看我对How to read time from recorded surveillance camera video? 的回答,您可以/应该使用cvMatchTemplate() 来做到这一点。

      【讨论】:

      • 但图像中数字的位置可能会有所不同,因此无法比较图像的特定位置。比对的图像不清楚,那我怎么从图像中得到特定的数字???
      • @asifkt,然后请编辑您的问题以提供有关您的应用程序的更多详细信息。您对图像源(视频、扫描仪等)的字母(字体、大小、透视)了解更多。这将有助于专注于可能的解决方案。
      • 我开发了人脸检测应用。实际上,级联文件 haarcascade_frontalface_alt.xml 是随 opencv 提供的。对于字母识别,我需要创建一个 xml 文件。所以我使用 opencv_createsamples.exe、opencv_haartraining.exe 文件来创建这个文件。我给了一个标志作为正面图像,另外 5 张不包含标志的图像作为负面图像。我没有通过训练得到任何 xml 文件。听说训练至少需要3天。是真的吗??为了获得中间 xml,我需要使用 convert_cascade.exe 文件。如果我使用它,我会得到更好的结果吗???
      【解决方案4】:

      如果您正在使用一组固定的巴士目的地,则可以使用模板匹配。

      但是,如果您希望系统更加灵活,我想您需要对每个单独的字母进行某种形式的轮廓/形状分析。

      【讨论】:

        【解决方案5】:

        您还可以查看 EAST:高效场景文本检测器 - https://www.learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/ 在此链接下,您有 C++ 和 Python 的示例。我使用这段代码来检测公共汽车的数量(在检测到给定的对象是公共汽车之后)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 1970-01-01
          • 2020-03-23
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 2017-07-19
          相关资源
          最近更新 更多