- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在交付 SCADA 解决方案时,我们经常会收到结构化控制图(如下所示的 visio 流程图)中指定的最终用户规范,这些规范通常以 PDF 格式或图像形式提交。
为了在 C# 中访问这些,我希望使用 OpenCV 库之一。
我正在研究模板识别,但开始将数据输入机器学习算法以教它识别已知的框和箭头的特定形状似乎不合适。
我看过的库有一些多边形函数。然而,从下面的示例中可以看出,当元素之间没有间距时,系统会将整个事物视为一个大多边形是一种危险。
注释可以任意旋转 90 度,我想使用 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/
顺便说一句,使用 EmguCV 将代码移植到 C# 很简单,所以不用担心
箭头的标识,包括方向和端点标注。线型,如果可能的话。
有几种方法可以找到线段(例如霍夫变换),这部分的主要问题是其他组件,因为它们通常也被检测为线,所以如果我们先找到组件并将它们从文档中删除,检测线将变得容易得多,错误检测也少得多。
方法
1- 基于不同颜色的图层文档,并在每个所需图层上执行以下阶段。
2- 使用 OCR 检测和提取文本,然后删除文本区域并重新创建没有文本的文档。
3-检测组件,基于轮廓分析和收集的组件数据库,然后删除检测到的组件(已知和未知类型,因为未知形状会增加下一阶段的错误检测)并重新创建没有组件的文档,此时在如果检测良好,我们应该只有线条
4-检测线
5-此时您可以根据检测到的位置从提取的组件、线和标签创建逻辑图
希望对您有所帮助
关于c# - 识别图像中的 visio 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691358/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!