识别图像中的 visio 形状

2024-02-09

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

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

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

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

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

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

Update: This is an example of the type of image I'm talking about. 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.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://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-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 http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html

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

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

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

Approach

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

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

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

4-检测线

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

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

识别图像中的 visio 形状 的相关文章

  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • Criteriabuilder之类的,如何长时间做到这一点?

    我尝试使用 Criteriabuilder 中的 like 方法来获取基于模式 10 的所有记录 我想要获取 ID 为 101 10002 1003 1000 等的记录 我用过这个代码 Predicate p cb like r
  • 求解受限于给出非负解的时滞微分方程 (DDE) 系统

    在 MATLAB 中 ode45 http www mathworks com help techdoc ref ode45 html有一个参数叫做NonNegative http www mathworks com help techdo
  • Grep 在日期范围内创建的所有文件中

    我使用的是 Ubuntu 操作系统 我想在 2012 年 5 月 28 日到 2012 年 5 月 30 日范围内创建的所有日志文件中 grep 一个单词 例如 XYZ 我怎么做 这与 Banthar 的解决方案略有不同 但它适用于find
  • 如何处理 Go 包中嵌套的“vendor”目录?

    我正在编写一个应用程序并导入一些包B 这个包有vendor目录 其中又包含包C 我也想用那个包C直接在我的应用程序中 所以我决定使用glide包管理器 它同时下载B and C into myapp vendor目录 但保留myapp ve
  • 更改 datetimeoffset 的时区

    我有一个DateTimeOffset值为 11 11 1989 的变量16 00 00 03 30 我可以打电话ToLocalTime 方法 它显示 11 11 198918 00 00 05 30 我在印度 p 我正在寻找这样的东西 va
  • 嵌套通用接口

    我有一个如下所示的接口架构 C NET4 interface A interface B List a a interface C List b b 我是这样实现的 public interface A public interface B
  • 从派生 * 到基 * 的转换存在,但无法访问

    尽管 c 是一个结构体并且默认具有公共继承 为什么下面的代码会产生此错误 struct c protected int i public c int ii 0 i ii virtual c fun c c fun cout lt lt in
  • 语法错误:意外的标记,应为“”

    添加这个问题是因为我在网上不容易找到答案 我正在尝试使用react testing library测试组件是否正确呈现 然而 我收到了许多错误 这些错误似乎没有多大帮助 这是我的测试文件 report test ts 以及代码中的组件 im
  • Android Phonegap 应用程序中未获取 cookie

    Android 4 4 2 Cordova 3 4 1 jQuery 2 1 0 jQuery Mobile 1 4 2 我需要将登录凭据发布到服务器 本例中为 IBM Domino 9 01 但它无关紧要 并且服务器会使用会话 cooki
  • 以编程方式禁用特定 PHP 函数进行测试

    我有一个使用 cURL 发出 HTTP 请求的函数 该请求返回到file get contents 如果 cURL 在系统上不可用 我想为此函数编写单元测试 利用 PHPUnit 其中 cURL 可用于某些测试 但不可用于其他测试 是否可以
  • 如何将客户端的 Python 套接字连接到 Node.js/socket.io?

    我想通过套接字将 Blender v2 55 连接到网页 对于 Web 部分 我可以使用 Node js 和 socket io 我已经使用了一点node js socket io 我认为这不是问题 现在 对于 Blender 它在 Pyt
  • 什么 JQuery 选择器排除父级与给定选择器匹配的项目?

    I have var set foo bar filter function return this parents baz length lt 1 作为选择其类的所有元素的一种方式foo or bar并且谁不是其类的元素的后代baz 是否
  • Hive gzip 文件解压

    我已经将一堆 gz 文件加载到 HDFS 中 当我在它们之上创建一个原始表时 我在计算行数时看到了奇怪的行为 比较 gz 表和未压缩表的 count 结果 结果有约 85 的差异 文件 gz 压缩后的表记录较少 有人见过这个吗 CREATE
  • 如何让 jquery.couch.app.js 与 IE8 一起使用

    我已经在 Windows XP SP3 的 IE7 和 IE8 所有兼容模式 和 Windows 7 Ultimate 的 IE8 所有兼容模式 上进行了测试 并且在两者上都以同样的方式失败 我正在运行最新的 HEADcouchapp ht
  • 使用 UIDynamicAnimator 水平动画 UIView

    我已经阅读了文档 但我很不好意思地说我很困惑 场景 我有一个UIView 就像一个容纳 3 的容器UIButtons 该容器最初是有界限的 0 0 35 35 里面的每个按钮都有相同的坐标 alpha0 在用户执行特定操作时 容器的边界更改
  • 使用 R 在矩阵中的特定位置插入行

    我正在尝试将行添加到矩阵的特定位置 其中位置包含在向量中 下面的架构显示了输入和预期结果 我尝试使用 for 循环但无法使其工作 任何建议都有帮助 源矩阵 6x3 1 1 2 3 2 4 5 6 3 7 8 9 4 6 9 2 5 3 6
  • eclipse (pom.xml) 中的 Maven 错误:无法传输 org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4

    我想使用 Maven 来创建 Web 项目来自动导入我需要的所有库 所以我选择 maven archetype webpp 之后我在 pom xml 文件上收到此错误 Description Resource Path Location T
  • 属性不可分配给接口中的字符串索引[重复]

    这个问题在这里已经有答案了 我有以下接口 export interface Meta counter number limit number offset number total number export interface Api
  • C# 中的 LFU 缓存?

    C 中是否有现成的 LFU 缓存 Java 有大量的 LFU 缓存实现 应该很容易移植到 C 例如 http faq javaranch com view CachingStrategies http faq javaranch com v
  • 识别图像中的 visio 形状

    在提供 SCADA 解决方案时 我们经常会获得结构化控制图 如下所示的 visio 类似流程图 中指定的最终用户规范 这些规范通常以 PDF 格式或图像形式提交 为了在 C 中访问这些 我希望使用 OpenCV 库之一 我正在研究模板识别