入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(下)

csdn推荐

效果如下:

2.框架思路

如上所示,我们可以把opencv这个极开源世界优秀视觉处理的知识库,从抽象的代码,变成一条条流程化的知识流,并且利用将超级参数的调整可视化,即视化实现对机器视觉处理模块或算法的快速直观理解,极端时间内建立对算法的“手感”。便于在实际问题中,快速思考获得解决方案。

视觉识别的过程就是一个图像信息的流处理过程:

基于以上思考,可以把我们的调试工具设计成一个类似流水线一样的解读执行过程,就是我们先根据场景特点确定上下游的处理模块,把它们做成一个草图,然后我们的主程序负责把它按流程图执行,并且可以随时打开流水线的某个处理盒子,对参数进行方便的调节。总得来说这个工具应该是这样的:

3.图像处理流程化的实现

上篇讲到,我们可以用JSON格式来把整个图像处理过程结构化,形成一个树状结构的,把父节点子节点进行上下游关联。然后通过一个对JSON结构解析的一个解析器进行解析,顺序调用相应的opencv图像处理模块,进行流程化处理,最终获得结果。

3.1如何解析图像流程数据结构

这里为了处理图像的流程结构,需要有一些技术手段。特别是涉及到不是单个流程的时候,图像流程数据结构为树状结构有分支,且有很多串联,像这样子:

如何去读取这种结构,把图像从节点1,进行按顺序处理,知道节点4。我们选择了一个比较强大的库networkx。

3.2 使用networkx网络图库

以下是大模型对networkx网络图库的解释:

NetworkX 是一个用 Python 编写的开源软件包,用于创建、操作和研究复杂网络的结构、动态和功能。它提供了丰富的数据结构和方法,使得处理网络数据变得简单和直观。以下是 NetworkX 的一些主要特点:多种网络类型:NetworkX 支持多种类型的网络,包括无向图、有向图、多图、加权图等。

丰富的算法:NetworkX 提供了大量用于分析网络的算法,如最短路径、连通性、聚类系数、中心性分析等。

图形绘制:NetworkX 可以与 Matplotlib 等图形库结合使用,方便地绘制网络图形,帮助用户直观地理解网络结构。

数据读取和写入:NetworkX 支持多种数据格式的读取和写入,包括边列表、邻接矩阵、Pickle 文件、GraphML、GML 等。

交互式工具:NetworkX 还提供了一些交互式工具,如网络分析工具箱(NetworkX Toolkit)和网络分析浏览器(NetworkX Explorer)。

扩展性:NetworkX 的设计允许用户根据自己的需求扩展新的功能。

社区支持:NetworkX 是一个活跃的开源项目,拥有一个庞大的用户和开发者社区,提供了大量的文档、教程和示例代码。

跨平台:NetworkX 可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。

NetworkX 广泛应用于社会学、生物学、计算机科学、物理学等领域,用于研究社交网络、生物网络、互联网结构等复杂网络系统。

3.3 python实现

我们利用networkx库的nx.DiGraph() ,有向图结构,把以上JSON格式内的图像从源到处理各分支转变为有向图,问题就解决了一大半。我们可以通过遍历父子节点关系,把流程图转化为图结构,并利用图结构的方法把一条条流程获取出来:

    def draw_module(module,layout):
        """
        解释并画出模型流程
        """
        dG= nx.DiGraph() #有向图
        edges=[]
        for key in module:            
            if key[:1]!='@':
                if len(module[key]['son']):
                    for son in module[key]['son']:
                        edges.append((key,son))
        dG.add_edges_from(edges)
        for key in module:            
            if key[:3]=='图像源':                
                endnodes=[]
                searchson(key,module,endnodes)
                if len(endnodes):
                    for b in endnodes:
                        link=nx.dijkstra_path(dG,key, b) 
                        layout.append([sg.Button(bu) for bu in link])

以上程序中找到一个有效的图像处理链路,是利用了在 NetworkX 库中,nx.dijkstra_path 函数,此函数是用于计算图中从一个源节点到其他所有节点的最短路径。

于是就可以生成了如下流程:

4.结论

通过图像处理流程的结构化(或者序列化)我们把图像处理流程的模型进行了持久化,把处理的流程顺序处理模块关系,以及调整的参数都可以进行保存,甚至可以持久保存到硬盘,这样就可以进行经验模型的复用了。还有就是,我们实现了把opencv等视觉处理模型的参数调整进行了可视化套壳,使得抽象的参数变得易于调试,直接看效果,快速掌握参数的作用。在一个是我们巧妙的利用了NetworkX 库,把复杂流程图进行了转化,转化成有向图,并利用最小路径查找,实现了流程的解析。利用这三个方法,我们就可以构建任意符合流程化图像处理的庞大的图像处理库,和图像处理知识模型和参数调试工具。可以助力踏入机器视觉领域的初学者快速积累经验。

5.python源码

文章来源:https://blog.csdn.net/kanbide/article/details/140040056



微信扫描下方的二维码阅读本文

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容