用opencvpython从手绘逻辑门图生成布尔表达式

2024-10-01 13:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

输入手绘逻辑门图 enter image description here

我用YOLO训练和识别7个不同的逻辑门和标签(字母)。 检测输入图像中的逻辑门和标签。 enter image description here

这里我得到了一个数组列表(框),其中包括每个矩形。每个列表包含以下每个列表的详细信息 按顺序排列的矩形, •矩形标签 •矩形左上角的x、y坐标 •矩形右下角的x、y坐标

矩形框数组。在

方框=[['和',(614,98),(1146,429)],['不',(525,1765),(1007,1983)],['和',(762,1188),(1209, 1528)],['诺尔',(1323,272),(1884,682)],['或',(575,599),(1225,985)],['异或',(1393,1368),(2177, 1842年),['XNOR',(2136859),(27621231)],['A',(34,50),(321,224)],['B',(12,305),(344,487)],['C',(3, 581),(391,779)],['D',(0,828),(400,1060)],['E',(0,1143),(354,1351)],['F',(0,1418),(313,1615)],['G', (0,1753),(301,1985)],[“输出”,(2810,940),(3069,1184)]]

之后,我使用概率Hough线变换来检测标签和逻辑门之间的线。 为此,我引用了这个链接[How to merge lines after HoughLinesP?。通过使用这个链接,我将行数减到最少,最后只得到35行。 检测35条绿色线条

enter image description here

然后我对这35条线进行了分类,并对彼此靠近的线进行了分组。最后,我得到了14条线。 最后14行图像。在

enter image description here

14行数组。在

最后一条线点=[[(871864),(6251869)],[[(6231815),(13541855)],[(13431660),(1770,1655)], [(13481656),(13481869)],[(102971),(5311945)],[(518835),(892825)],[(521830),(526949)], [[(105,1260),(494,1254)],[(487,1351),(891,1340)],[(489,1252),(491,1356)],[(1071533),(526, 1510年],[(516,1432),(892,1410)],[(521,1433),(520,1514)],[(111,432),(519,396)],[(499,313),(820, 299)],[(503,310),(506,402)],[(123,157),(496,150)],[(493,144),(498,247)],[(495,242),(815,234)], [[(170,692),(509,687)],[(504,771),(888,764)],[(505,685),(508,775)],[(936,264),(1229,261)],[(1227, 257),(1240,485)],[(1234,481),(1535,458)],[(9851361),(1343,1347)],[(1341,1344),(1348,1578)], [(1345,1575),(1773,1571)],[(991,796),(1264,778)],[(1240,535),(1544,520)],[(1247,532)], (1254783)],[(1546,582),(2156,489)],[(2154,488),(2148,1021)],[(2153,1087),(2164,1581)]], [[(24441139),(30171055)]]

那么,如何通过使用以上2个数组(框、最后的“线”点)得到以下输出呢?在

enter image description here


Tags: 图像列表链接字母yolo详细信息标签数组
2条回答

你的项目看起来很酷,所以我花了一些时间寻找解决方案。我想到了下面的代码。代码的结果是:

OUTPUT[XNOR[NOR[AND[B, A], OR[D, C]], XOR[NOT[G], NAND[E, F]]]]

我假设如果一个元素比另一个元素最左边,那么它就是前一个块。我还假设在你的一组行中,第一行是正确的。。。这样我就可以把你的14条线简化为14条线。在

^{pr2}$

如果需要的话,我可以改天再解释,或者你可以从这里开始。不管怎样,祝你的项目愉快。在

编辑:

我的目标是建立一个图,其中节点是框,边是线。问题是这些行只被定义为一组封闭的行。他们也很混乱,但是第一次。所以第一步是把每一组直线变成一条直线。这就是我所说的sorted_lines。在

为了构建这个列表,我使用了以下逻辑:

  1. 对于每一组线,将其分为连接部分和非连接部分
  2. 连接部分的初始化是集合的第一行。正如我所说,这里我假设第一行是正确的。尝试改进这一点,因为这种假设在其他情况下可能是错误的。在
  3. 当有未连接的线路时,请执行以下操作:

    • 找到最接近连接零件末端的线段
    • 将其从非连接部件上拆下
    • 检查线束段的哪一端距离连接部件最近
    • 如果是线段的第一个点,则连接零件的最后一个点将成为线段的第二个点,否则第一个点将成为最后一个点。在

在检查中,未处理的情况是,要连接的管段靠近连接部件的第一个点而不是最后一个点。因为我假设第一行是正确的,所以没有处理这个问题。再一次,这是可以改进的。在

现在已经对行进行了排序,对于每一行,找到包含每个端点的节点。选择lestost作为源门,选择最右边的作为目的门。因为边不是定向的,所以我不得不假设一个方向。更新目标门的输入和源门的输出。在

最后打印图形的最后一个门。在

首先,您应该定义如何绘制/输出每个门,作为一个公式。例如,XNOR是一行和它下面的文本一样长的行,中间有x参数和一个环绕的+号。在

现在可以反向执行模式。从最右边的框开始,这是您的输出Q。在输出中查找结束的行(=行的最右点/元组的最高x),然后选择该行开始的框。那是XNOR。如上所述,XNOR被定义为具有参数/输入。因此,在XNOR框中查找最右点的线。接下来选择这些行开始的框。首先是一个NOR,然后是一个XOR。重复这个循环,NOR的参数是and,gate和OR gate。再说一遍,AND门的参数是输入A和B。它们没有输入/没有以它们结尾的行,因此这些是要打印的实际值。在

可视化:
(这是不是代码,但我不能以其他方式提交答案)

Q = XNOR(A,B)  
A = NOR(C,D)  
So, Q = XNOR(NOR(C,D),B)  
C = AND(E,F)  
So Q = XNOR(NOR(AND(E,F),D),B)  
E = input A  
F = input B  
So Q = XNOR(NOR(AND("A","B"),D),B)  
D = OR(G,H)  
So Q = XNOR(NOR(AND("A","B"),OR(G,H)),B)  
ect.

要计算公式的大小,可以使大小依赖于 “层”-编号。为不同类型的门创建类将使整个过程更加容易。在

此伪代码显示了上述概念:

^{pr2}$

相关问题 更多 >