从特定位置开始按时间间隔对图像进行分组

时间:2018-07-18 07:27:19

标签: python image time

我有一个脚本,可以从图像中获取exif数据,并将其放入列表中。然后,我对清单进行排序,这就是我所拥有的。这是一个二维数组,其中第一个元素是时间戳,第二个元素是图像路径: 我的img列表:

[[32372, 'F:\\rubish\\VOL1\\cam\\G0013025.JPG'], 
 [32373, 'F:\\rubish\\VOL1\\cam\\G0013026.JPG'], 
 [32373, 'F:\\rubish\\VOL1\\cam\\G0013027.JPG'],.... etc etc etc

以下脚本由@blhsing制作,并将我的图像分组。效果很好,但是我想将我的图像不是从第一张图像开始而是从任何给定位置开始分组。

这是@blhsing编写的脚本:

groups = []
for r in img:
    if groups and r[0] - groups[-1][-1][0] <= 5:
        groups[-1].append(r)
    else:
        groups.append([r])
for g in groups:
    print(g[0][1], g[0][0], g[-1][0], g[-1][1])

这是我到目前为止提出的。它不能很好地工作,它只能拍摄一张图像,而不能创建一个组。有人可以帮我解决这个问题吗?

groups = []
print(iii, "iii")
#print(min_list, " my min list ")
img.sort()
cnt = 0
mili = [32372, 34880]

for n in mili:
    #print(n, "mili")
    for i in img:
        #print(i[0])
        if n == i[0]:
            if groups and i[0] - groups[-1][-1][0] <= 5:
                groups[-1].append(i)
            else:
                groups.append([i])
    for ii in groups:
        print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])

我的iii是临时列表:

[32372, 32373, 32373, 32374, 32374, 32375, 32375, 34880, 34880, 34881, 34881, 34882, 34882, 34883, 34883, 36505, 36505...etc

在此示例中,我的min_list具有2个位置,这意味着我只想创建2个组并仅对从这2个位置开始的图像进行分类,间隔与之前相同,为5秒。

Ps。 谢谢@ pasch013它可以工作,但是请检查一下,为什么结果是这样,我从min_list得到mili:

min_list.sort()
print(min_list, " min list")
interval = 5
groups = []
#mili = [1, 99]
for start_time in min_list:
    i = 0

    while i < len(img) and img[i][0] < start_time:
        i += 1
    groups.append([])
    while i < len(img) and img[i][0] < start_time + interval:
        groups[-1].append(img[i])
        i += 1
    for ii in groups:
        print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])

那是我的结果:请检查一下:

32345 temps GOPR
F:\rubish\VOL1\cam\GOPR3001.JPG path + temps 32345
32357 min
35292 temps GOPR
F:\rubish\VOL1\cam1\GOPR5405.JPG path + temps 35292
35706 min
[32357, 35706]  min list
F:\rubish\VOL1\cam\G0013002.JPG 32357 32361 F:\rubish\VOL1\cam\G0013010.JPG
F:\rubish\VOL1\cam\G0013002.JPG 32357 32361 F:\rubish\VOL1\cam\G0013010.JPG
F:\rubish\VOL1\cam1\G0075992.JPG 35706 35708 F:\rubish\VOL1\cam1\G0075997.JPG

为什么我有3个小组而不是2个小组?

现在可以正确创建第一个组,但不想转到第二个,出现此错误

    Z:\GOPRO\2018-05-31\VOL0102\100GOPRO\G0013002.JPG 32357 32577 Z:\GOPRO\2018-05-31\VOL0102\100GOPRO\G0013442.JPG
  File "F:/piotrwork/detectione_voltigere/GOPR_test_zero.py", line 115, in <module>
    print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])
IndexError: list index out of range

我的min_list是

[32357, 35706]  min list

我的图片列表-img

[[32357, 'F:\\rubish\\VOL1\\cam\\G0013002.JPG'], [32357, 'F:\\rubish\\VOL1\\cam\\G0013003.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013004.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013005.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013006.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013007.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013008.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013009.JPG'], [32361, 'F:\\rubish\\VOL1\\cam\\G0013010.JPG'], [35706, 'F:\\rubish\\VOL1\\cam1\\G0075992.JPG'], [35706, 'F:\\rubish\\VOL1\\cam1\\G0075993.JPG'], [35707, 'F:\\rubish\\VOL1\\cam1\\G0075994.JPG'], [35707, 'F:\\rubish\\VOL1\\cam1\\G0075995.JPG'], [35708, 'F:\\rubish\\VOL1\\cam1\\G0075996.JPG'], [35708, 'F:\\rubish\\VOL1\\cam1\\G0075997.JPG'], [36687, 'F:\\rubish\\VOL1\\cam\\G0086476.JPG'],

最后一张照片

    32345 temps GOPR
F:\rubish\VOL1\cam\GOPR3001.JPG path + temps 32345
32357 min
Traceback (most recent call last):
  File "F:/piotrwork/detectione_voltigere/GOPRO_test_zero_one.py", line 121, in <module>
    print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])
IndexError: list index out of range
35292 temps GOPR
F:\rubish\VOL1\cam1\GOPR5405.JPG path + temps 35292
35706 min
[[32357, 'F:\\rubish\\VOL1\\cam\\G0013002.JPG'], [32357, 'F:\\rubish\\VOL1\\cam\\G0013003.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013004.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013005.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013006.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013007.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013008.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013009.JPG'], [32361, 'F:\\rubish\\VOL1\\cam\\G0013010.JPG'], [35706, 'F:\\rubish\\VOL1\\cam1\\G0075992.JPG'], [35706, 'F:\\rubish\\VOL1\\cam1\\G0075993.JPG'], [35707, 'F:\\rubish\\VOL1\\cam1\\G0075994.JPG'], [35707, 'F:\\rubish\\VOL1\\cam1\\G0075995.JPG'], [35708, 'F:\\rubish\\VOL1\\cam1\\G0075996.JPG'], [35708, 'F:\\rubish\\VOL1\\cam1\\G0075997.JPG'], [36687, 'F:\\rubish\\VOL1\\cam\\G0086476.JPG'], [36688, 'F:\\rubish\\VOL1\\cam\\G0086477.JPG'], [36688, 'F:\\rubish\\VOL1\\cam\\G0086478.JPG'], [36689, 'F:\\rubish\\VOL1\\cam\\G0086479.JPG'], [36689, 'F:\\rubish\\VOL1\\cam\\G0086480.JPG'], [36690, 'F:\\rubish\\VOL1\\cam1\\G0086481.JPG'], [36690, 'F:\\rubish\\VOL1\\cam1\\G0086482.JPG'], [36691, 'F:\\rubish\\VOL1\\cam1\\G0086483.JPG']]
[32357, 35706]  min list
32357
[[[32357, 'F:\\rubish\\VOL1\\cam\\G0013002.JPG'], [32357, 'F:\\rubish\\VOL1\\cam\\G0013003.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013004.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013005.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013006.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013007.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013008.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013009.JPG'], [32361, 'F:\\rubish\\VOL1\\cam\\G0013010.JPG']]] grrrr
35706
[[[32357, 'F:\\rubish\\VOL1\\cam\\G0013002.JPG'], [32357, 'F:\\rubish\\VOL1\\cam\\G0013003.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013004.JPG'], [32358, 'F:\\rubish\\VOL1\\cam\\G0013005.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013006.JPG'], [32359, 'F:\\rubish\\VOL1\\cam\\G0013007.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013008.JPG'], [32360, 'F:\\rubish\\VOL1\\cam\\G0013009.JPG'], [32361, 'F:\\rubish\\VOL1\\cam\\G0013010.JPG']], []] grrrr
F:\rubish\VOL1\cam\G0013002.JPG 32357 32361 F:\rubish\VOL1\cam\G0013010.JPG

以退出代码1完成的过程

1 个答案:

答案 0 :(得分:0)

尝试:

group_time = 5
groups = []
mili = [1, 99]
for start_time in mili:
    i = 0

    while i < len(img) and img[i][0] < start_time:
        i += 1
    groups.append([])
    while i < len(img) and img[i][0] < start_time + group_time:
        groups[-1].append(img[i])
        i += 1

print(groups)

mili是您的开始时间列表,而group_time是时间间隔的大小。

修改

关于您的修改:最后两行

for ii in groups:
    print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])

位于内部for循环中,而我认为您只想打印一次。只需取消缩进即可,它应该可以根据需要工作:

min_list.sort()
print(min_list, " min list")
interval = 5
groups = []
#mili = [1, 99]
for start_time in min_list:
    i = 0

    while i < len(img) and img[i][0] < start_time:
        i += 1
    groups.append([])
    while i < len(img) and img[i][0] < start_time + interval:
        groups[-1].append(img[i])
        i += 1
for ii in groups:
    print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])

编辑2

如果要进行分组,以使所有与最后一张图像相差不超过5秒的图像都属于同一组,则必须用上一张图像的时间替换start_time在第二个while循环中。就是这样:

min_list.sort()
print(min_list, " min list")
interval = 5
groups = []
#mili = [1, 99]
for start_time in min_list:
    i = 0

    while i < len(img) and img[i][0] < start_time:
        i += 1
    groups.append([])
    while i < len(img) and img[i][0] < img[i-1][0] + interval or img[i][0] < start_time + interval:
        groups[-1].append(img[i])
        i += 1
for ii in groups:
    print(ii[0][1], ii[0][0], ii[-1][0], ii[-1][1])