我试图以特定方式比较两个文本文件。每个文件都包含数千行,如下所示:
(29, '2 [484, 41, 69, 72]')
其中29
是frame
,2
是ID
,[]
内的四个值是rect
值X,Y,W,H
。在这种情况下,X = 484, Y = 41, W = 69, H = 72
。
每个frame
都可以附加多个rects
。从1到20或有时甚至更多。
以下是我需要比较的两个文件的示例:
档案A:
档案B:
现在对于比较方法,我需要使用以下等式比较每个rects
上的所有frame
:
(overlap)/(two rects area - overlap) > Threshold
阈值手动定义为0.8左右。
在我确定其中frames
包含rects
的哪两个文件不同之后,我需要写入start frame
和{{1}的第3个文件每个ID(使用上面提到的等式)产生了显着的差异。
我试图逐行比较:
end frame
但这仅确定某条线是否有差异,并且不会比较每条 def _compare(self, data1, data2):
diff = []
for frame in data1.keys():
if frame in data2.keys():
data1.pop(frame)
data2.pop(frame)
return diff
with open(out_file, 'w') as f:
f.write('\n'.join(diff))
的实际值。
答案 0 :(得分:1)
我认为您应该从这些矩形创建一个类,因此您可以将(x,y)值存储为offset,将(w,h)存储为size。然后你应该为这些类添加函数,例如:toplef,topright,bottomlef,bottomright,它们会计算你需要的值。
例如:
class rectangle:
def __init__(self,pos,size):
self.pos=pos
self.size=size
def topLeft(self):
return self.pos
def topRight(self):
return (self.pos[0]+self.size[0],self.pos[1])
def bottomLeft(self):
return (self.pos[0],self.pos[1]+self.size[1])
def bottomRight(self):
return (self.pos[0]+self.size[0],self.pos[1]+self.size[1])
def ares(self):
return self.size[0]*self.size[1]
计算重叠区域比我第一次尝试更棘手,但我找到了一个解决方案,可以相对容易地实现(但现在我没有时间实现它)。主要的想法是,你确定了第三个矩形,它包含两个矩形(很容易,你只需要找到最小的左上角和最大的右下角坐标)。然后你必须计算剩下的矩形的ara。然后添加四个剩余矩形的区域,两个初始矩形,如果您减去大矩形的区域,您将得到重叠区域。我知道这听起来很复杂,但这是一个普遍的解决方案。