C# 识别图像中的visio形状

C# 识别图像中的visio形状,c#,opencv,ocr,opencvsharp,opencvdotnet,C#,Opencv,Ocr,Opencvsharp,Opencvdotnet,在交付SCADA解决方案时,我们通常会获得结构化控制图(见下文类似visio的流程图)中指定的最终用户规范,这些规范通常以PDF格式或图像形式提交 为了在C#中访问这些,我希望使用一个OpenCV库 我在看模板识别,但似乎不适合开始输入机器学习算法来教它识别预先已知的特定形状的盒子和箭头 我看过的库有一些多边形函数。但是,从下面的示例可以看出,当元素之间没有间距时,系统会将整个对象视为一个大多边形 注释可以是任何90度旋转,我想使用OCR识别它们以及矩形的内容 我在这方面没有任何经验,这一点现在

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

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

我在看模板识别,但似乎不适合开始输入机器学习算法来教它识别预先已知的特定形状的盒子和箭头

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

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

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

更新: 这是我所说的图像类型的一个例子。

要解决的问题是:

  • 用单元格文本识别红色矩形(OCR)
  • 箭头的标识,包括方向和端点标注。如果可能,请选择线型
  • 组件的模板匹配
  • 如果模板匹配失败,则返回到某个多段线图元或其他对象

我无法为您提供所有四个问题的答案,但第一个问题
识别带有单元格文本的红色矩形(OCR)
听起来并不难。以下是我对这个问题的解决方案:

步骤1:将彩色图像分为3层:红色、蓝色和绿色,并且仅将红色层用于以下操作

步骤2:红色层的二值化

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

步骤4:丢弃大的blob,只保留与文本对应的blob。还可以使用布局信息来丢弃错误的文本块(例如,文本始终位于大文本块中,文本块具有水平书写样式等等)

步骤5:对纹理组件执行OCR。在执行OCR时,每个blob将为您提供一个置信水平,这可用于验证它是否为文本组件

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

我将试着描述一些我以前使用过的方法,这些方法在类似的情况下得到了很好的结果(我们在简单的CAD图纸上工作,以找到电网的逻辑图),我希望它会有用

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

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

组件的模板匹配。

大多数模板匹配算法对尺度敏感,而尺度不变的算法非常复杂,因此,如果文档的尺度和大小不同,我认为使用简单的模板匹配算法不会得到非常准确的结果

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

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

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

顺便说一句,使用EmguCV将代码移植到c#很简单,所以不用担心

箭头的标识,包括方向和端点注释。线路类型,如有可能。

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

方法

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

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

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

4-检测线

5-此时,您可以从提取的组件创建逻辑图