【问题标题】:Recognizing visio shapes in an image识别图像中的 visio 形状
【发布时间】:2014-10-30 17:32:14
【问题描述】:

在交付 SCADA 解决方案时,我们经常会在结构化控制图(如下所示的类似流程图)中指定最终用户规范,这些规范通常以 PDF 格式或图像形式提交。

为了在 C# 中访问这些,我希望使用其中一个 OpenCV 库。

我正在研究模板识别,但似乎不适合开始输入机器学习算法来教它识别预先知道的特定形状的框和箭头。

我看过的库有一些多边形函数。但是,从下面的示例中可以看出,当元素之间没有间距时,系统会将整个事物视为一个大多边形。

注释可以是任意 90 度旋转,我想使用 OCR 识别它们以及矩形的内容。

我在这方面没有任何经验,现在应该很明显了,所以我希望有人能指出我合适的兔子洞的方向。如果有多种方法,请选择数学量最小的方法。

更新: 这是我正在谈论的图像类型的一个示例。

要解决的问题是:

  • 识别带有单元格文本 (OCR) 的红色矩形。
  • 箭头的标识,包括方向和端点注释。线型(如果可能)。
  • 组件的模板匹配。
  • 如果模板匹配失败,回退到某个折线实体或其他东西。

【问题讨论】:

  • 好的,到目前为止,您尝试过什么? 除非您展示您所做的并描述您面临的问题,否则我们无法真正帮助您.问题是:这个问题与编程无关。真的不是。您需要咨询计算机视觉/图像处理专家。这不是一个小问题要解决,对不起。我可以想到一些解决方案,但我仍然不知道哪种方法最有效。这次我宁愿把它留给自己,但这只是去谷歌/必应的问题,对此做一些研究,你就会对如何解决它有一些想法。真的!
  • 现在也是 commit to Computer Vision 的好时机,这是一个新的 StackExchange 提案。这类问题在那里可能很好。
  • @karlphillip 计算机视觉领域很大(我致力于 SE 提案)。有许多子学科似乎是一种可能的方法,但在考虑样本绘图时,我认为这些直接的概念挑战是显而易见的。如果有一个计算机视觉论坛,我肯定会花时间在那里研究和询问。这个问题更多是关于找到正确的事情去做,而不是如何正确地做事情。你真的试过用谷歌搜索吗?你会惊讶地发现有这么少。

标签: c# opencv ocr opencvsharp opencvdotnet


【解决方案1】:

我相信你确实意识到这是一个活跃的研究领域,这篇文章中描述的算法和方法是基础的,也许有更好/更具体的解决方案,或者完全启发式或基于这些基础方法。

我将尝试描述一些我以前使用过的方法,并在类似情况下得到了很好的结果(我们使用简单的 CAD 绘图来查找电网的逻辑图),希望对您有所帮助。

识别带有单元格文本 (OCR) 的红色矩形。

这对于您的解决方案来说是微不足道的,因为您的文档质量很高,并且您可以轻松地根据您的目的调整任何当前免费的 OCR 引擎(例如 Tesseract),对于 90,180、...度数、引擎之类的引擎不会有任何问题Tesseract 会检测到它们(你应该配置引擎,在某些情况下你应该提取检测到的边界并将它们单独传递给 OCR 引擎),你可能只需要一些训练和微调来获得最大的准确性。

组件的模板匹配。

大多数模板匹配算法对比例敏感,而比例不变的算法非常复杂,因此如果您的文档在比例和大小上有所不同,我认为使用简单的模板匹配算法不会获得非常准确的结果。

并且您的形状特征非常相似且稀疏,以便从 SIFT 和 SURF 等算法中获得良好的结果和独特的特征。

我建议你使用轮廓,你的形状很简单,你的组件是由这些简单的形状组合而成的,通过使用轮廓你可以找到这些简单的形状(例如矩形和三角形),然后根据之前收集的轮廓检查轮廓在组件形状上,例如,您的组件之一是通过组合四个矩形创建的,因此您可以将其相对轮廓放在一起,并稍后在检测阶段对照您的文档进行检查

网上有很多关于轮廓分析的文章,我建议你看看这些,它们会给你一些关于如何使用轮廓来检测简单和复杂形状的线索:

http://www.emgu.com/wiki/index.php/Shape_%28Triangle,_Rectangle,_Circle,_Line%29_Detection_in_CSharp

http://www.codeproject.com/Articles/196168/Contour-Analysis-for-Image-Recognition-in-C

http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html

顺便说一句,使用 EmguCV 将代码移植到 c# 是微不足道的,所以不用担心

箭头的标识,包括方向和端点标注。线型,如果可能的话。

寻找线段有多种方法(例如霍夫变换),这部分的主要问题是其他组件,因为它们通常也被检测为线,所以如果我们先找到组件并将它们从文档中删除,检测线会更容易,错误检测更少。

接近

1- 基于不同颜色的图层文档,并在每个所需图层上执行以下阶段。

2- 使用 OCR 检测和提取文本,然后删除文本区域并重新创建没有文本的文档。

3-检测组件,基于轮廓分析和收集的组件数据库,然后删除检测到的组件(已知和未知类型,因为未知形状会增加您在下一阶段的错误检测)并重新创建没有组件的文档,此时在在良好检测的情况下,我们应该只有线条

4-检测线

5-此时您可以根据检测到的位置从提取的组件、线条和标签中创建逻辑图

希望对你有帮助

【讨论】:

  • 这很有帮助。谢谢。关于如何从图形中提取简单形状以进行轮廓识别的任何建议?该方法似乎很容易受到形状和箭头之间没有空间这一事实的影响,因此具有连接箭头的折线形状将有被算法假定为单个形状的危险。
  • 有不同类型的轮廓近似,我相信在这种情况下,通过使用简单近似(在 OpenCV CHAIN_APPROX_SIMPLE)将删除冗余点(例如直线上的点)并压缩你的轮廓(看看opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/… 的最后一个图),通过仅使用关键部分上的点,您可以将先前从所需组件中提取的点的相对位置与您从提供的文档中生成的轮廓区域进行比较。
  • 通过这样做,它唯一的问题是匹配轮廓区域中的所需点,这些点在碰撞或连接形状的情况下可能有更多的点,在这种情况下,我们通常会在轮廓区域中找到更多的组件。希望这会有所帮助
  • 谢谢。我将此标记为答案。我希望在不久的将来启动开发工作以实现这一点。我希望到那时有运行样本和问题分解。可能会成为外部承包商。
【解决方案2】:

我无法为您提供所有四个问题的解决方案,但第一个问题Identification of the red rectangles with texts in cells (OCR) 听起来并不难。这是我对这个问题的解决方案:

第一步:将彩色图像分成3层:红、蓝、绿,下面的操作只使用红色层。

第二步:红色层的二值化。

第三步:二值化结果的连通分量分析,并保持每个连通分量的静态(例如blob的宽度,blob的高度)

第 4 步:丢弃大块,只保留与文本对应的块。还可以使用布局信息来丢弃虚假的文本块(例如,文本总是在大块中,文本块具有水平书写风格等)。

第 5 步:对纹理组件执行 OCR。执行 OCR 时,每个 blob 都会给您一个置信度,这可用于验证它是否是文本组件。

【讨论】:

  • 哦,很抱歉造成混乱。我说“红色”是因为它们在嵌入图像中是红色的。在此软件要处理的图像中,它们可能不是红色的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多