3

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

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

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

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

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

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

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

要解决的问题是:

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

2 回答 2

3

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

我将尝试描述一些我以前使用过的方法,并在类似的情况下得到了很好的结果(我们在简单的 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-此时,您可以根据检测到的位置从提取的组件、线条和标签中创建逻辑图

希望这可以帮助

于 2014-09-21T06:52:49.667 回答
2

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

Step 1:将彩色图像分成3层:Red、Blue、Green,下面的操作只使用红色层。

步骤2:红色层的二值化。

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

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

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

于 2014-09-18T08:36:10.090 回答