c# - 识别图像中的 visio 形状

标签 c# .net opencv ocr

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

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

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

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

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

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

更新: 这是我正在谈论的图像类型的示例。 SCD drawing example

要解决的问题是:

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

最佳答案

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

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

希望对您有所帮助

关于c# - 识别图像中的 visio 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691358/

相关文章:

.net - EndpointNotFoundException 'Could not connect' 因为 'the target machine actively refused it' 通过 Fiddler 连接

.net - 如何在 .NET 中操作 VB6 集合?

python - 即使保存为相同质量,图像也不同

programming-languages - 轨迹栏的含义

c# - Excel 获取范围

c# - xUnit和测试的多个数据记录

时间:2019-05-17 标签:c#winformscomboboxdisplaymember

c# - 具有 Silverlight 4 WCF RIA 域服务的复杂类型

c# - .NET 反射创建类属性

c++ - OpenCV calibrateCamera 断言失败(ni == ni1)