识别图像中的 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 形状 的相关文章

  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 是否返回 std::move (x)?

    Are std vector
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 来自资源中 ImageSource 的 System.Drawing.Image

    我的问题与这个非常相似 wpf图像资源以及运行时在wpf控件中更改图像 https stackoverflow com questions 940592 wpf image resources and changing image in w
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用

随机推荐

  • 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 库之一 我正在研究模板识别