简化坐标列表

时间:2019-07-16 18:42:50

标签: python numpy opencv

我已经为函数cv.matchTemplate提供了模板图像和测试图像。

返回后,我过滤掉匹配度低于95%的所有内容。结果很好,我正在取得期望的结果。结果是一个元组列表,每个元组由(x,y)表示。问题是过滤后,我有太多结果。似乎每个潜在的匹配都会产生不止一个分数:

(150, 143)
(151, 143)
(152, 143)
(153, 143)
(154, 143)
(155, 143)
(149, 144)
(150, 144)
(151, 144)
(152, 144)
(153, 144)
(154, 144)
(155, 144)
(156, 144)

(694, 144)
(695, 144)
(696, 144)
(697, 144)
(698, 144)

(148, 145)
(149, 145)
(150, 145)
(151, 145)
(152, 145)
(153, 145)
(154, 145)
(155, 145)
(156, 145)
(157, 145)

(692, 145)
(693, 145)
(694, 145)
(695, 145)
(696, 145)
(697, 145)
(698, 145)
(699, 145)

(147, 146)
(148, 146)
(149, 146)
(150, 146)
(151, 146)
(152, 146)
(153, 146)
(154, 146)
(155, 146)
(156, 146)
(157, 146)

所有这些点都是tuples,它们位于一个单独的list中。您可以看到,这些点可以“逻辑地”分组在一起,并且其坐标相差不大。在上面的示例输出中,有5个可区分的“组”。这里的想法是减少每个一个点

从上面开始,这将被浓缩为以下列表:

(151,143)
(694, 144)
(148, 145)
(692, 145)
(147, 146)

有办法吗?

1 个答案:

答案 0 :(得分:1)

已修复此问题,原因是OP对列表中的所有元组进行了注释。 如果发现要改变点之间的差异的严格程度(例如,如果希望其在5像素以内,则可以做<= 5而不是== 1),这是第一个if条件,如果可以更改,则可以进行更改。

masterTest = [(1, 2), (1, 3), (2, 3), (4, 6), (4, 7), (4, 8)] #test array
arrayHolder = [] #buffer that holds the first mini list
compositeArray = [] #master list which holds a list of the tuples, grouped
lastTuple = masterTest[0] #dummy variable
arrayHolder.append(masterTest[0]) # add the first one so we have something to compare to
masterTest.pop(0) # it's already in our data, don't want a dup
for tuples in masterTest:
    if (((abs(tuples[0] - lastTuple[0]) == 1 and abs(tuples[1] - lastTuple[1]) == 0)) or
         (abs(tuples[1] - lastTuple[1]) == 1 and abs(tuples[0] - lastTuple[0]) == 0)):
        arrayHolder.append(tuples)
    else:
        compositeArray.append(arrayHolder.copy()) #add buffer to master list 
        arrayHolder = [] #clear out the buffer
        arrayHolder.append(tuples) #restart a new buffer
    lastTuple = tuples # update last coordinate checked


compositeArray.append(arrayHolder) #clears the buffer one last time

pointArray = []
for lists in compositeArray:
    count = 0
    xavg = sum([x[0] for x in lists])/len(lists)
    yavg = sum([x[1] for x in lists])/len(lists)
    pointArray.append(tuple((xavg, yavg)))

print (pointArray)

如果要执行此操作,可以使用pythons round()函数(该函数很简单,即numberToRound.round())。