提供SCADA解决方案,我们经常得到结构化控制图中指定的最终用户规范(如下所示的流程图),这些规范通常以PDF格式或图像提交。
为了在C#中访问这些,我希望使用其中一个OpenCV库。
我正在研究模板识别,但似乎不适合开始使用机器学习算法来教它识别预先知道的特定形状的盒子和箭头。
我看过的图书馆有一些多边形功能。但是,从下面的例子中可以看出,当元素之间没有间距时,系统会将整个事物视为一个大的多边形。
注释可以是任何90度旋转,我想使用OCR识别它们以及矩形的内容。
我对此没有任何经验,现在应该很明显,所以我希望有人可以指出我在适当的兔子洞的方向。如果有多种方法,那么选择最少的数学重量。
更新 这是我所谈论的图像类型的一个例子。
要解决的问题是:
答案 0 :(得分:3)
我确定您确实意识到这是一个活跃的研究领域,本文中描述的算法和方法是基础,也许有更好/更具体的解决方案,无论是完全启发式还是基于这些基础方法的
我将尝试描述一些我之前使用过的方法,并在类似的情况下得到了很好的结果(我们在简单的CAD工程图上找到了电网的逻辑图),我希望它有用。< / p>
用细胞中的文本(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/
顺便使用EmguCV将代码移植到c#是微不足道的,所以不要担心它
箭头的标识,包括方向和端点注释。线型,如果可能的话。
有几种方法可以找到线段(例如Hough变换),这部分的主要问题是其他组件,因为它们通常也被检测为线条,因此如果我们首先找到组件并从文档中删除它们,检测线条会更轻松,更少的错误检测。
<强>方法强>
1-基于不同颜色的图层文档,并在每个所需图层上执行以下阶段。
2-使用OCR检测并提取文本,然后删除文本区域并重新创建没有文本的文档。
3-Detect Components,基于轮廓分析和收集的组件数据库,然后删除检测到的组件(已知和未知类型,因为未知的形状会增加下一阶段的错误检测)并重新创建没有组件的文档,此时在如果检测得好,我们应该只有行
4-Detect lines
5 - 此时,您可以根据检测到的位置
从提取的组件,线和标签创建逻辑图希望这有助于
答案 1 :(得分:2)
我无法为您解决所有四个问题,但第一个问题Identification of the red rectangles with texts in cells (OCR)
听起来并不是很困难。以下是我对这个问题的解决方案:
步骤1:将彩色图像分为3层:红色,蓝色和绿色,仅使用红色层进行以下操作。
第2步:红色层的二值化。
步骤3:二值化结果的连通分量分析,并保持每个连通分量的静力学(例如斑点的宽度,斑点的高度)
步骤4:丢弃大blob,并且仅保留与文本对应的blob。还可以使用布局信息来丢弃虚假文本blob(例如,文本总是在大blob中,文本blob具有水平书写样式等等)。
步骤5:对纹理组件执行OCR。执行OCR时,每个blob都会给出一个置信度,这可以用于验证它是否是文本组件。