如何获取数组中某些值的索引

时间:2016-06-03 08:47:42

标签: python arrays for-loop

所以我来了这个微小但棘手的问题。

我有一个error_images索引数组,如下所示:

error_frames = [15,27,34,204,205]

现在我使用for循环迭代这些帧并在错误帧之前和之后添加10帧以获得序列,以便最后,阵列更加填充。我还删除了重复项(借口MATLAB写作):

error_sequence = [5:44,194:215]

现在棘手的部分: 为了显示序列,我加载每个图像并使用OpenCV cv2.imshow显示一段时间。当实际遇到错误时,我想增加显示图像之间的暂停('慢动作')并有一个特殊的叠加。这看起来像这样,其中frames是我场景图片的集合:

for x in error_sequence:
    if x in error_frames:
        cv2.imshow('Sequence', frames[x])
        cv2.putText(frames[x], "Error!", (50, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
        cv2.waitKey(100)
    else:
        cv2.imshow('Sequence', frames[x])
        cv2.waitKey(50)

问题是,这个“一帧”覆盖太快了,我想减慢更多的帧,让我们说3遇到错误之前和之后。

是否有某种功能,让我这样做?类似的东西:

if x+-3 in error_frames:
    ...

感谢您的帮助和抱歉,如果这是一个简单的问题,我不知道如何描述它。是的,我可以想出一个额外的数组,我设置为0,如果它远离错误帧而不是3并使用单独的情况,但我发现它不是很有吸引力,并且想知道是否有一个内置功能或一个漂亮的“单线”;)

2 个答案:

答案 0 :(得分:1)

也许这样:

if any(y in error_frames for y in xrange(x-3, x+4)):
    ...

您可以考虑从set中创建error_frames,以提高包含检查的时间复杂度:

error_frame_set = set(error_frames)

然后在所有检查中使用此set

答案 1 :(得分:1)

也许是这样的:

error_frames_set = set(error_frames)
delta = 3

for x in error_sequence:
    slow_frames = set(x + offset for offset in range(-delta, delta+1))
    if slow_frames.intersection(error_frames_set):
        cv2.imshow('Sequence', frames[x])
        cv2.putText(frames[x], "Error!", (50, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
        cv2.waitKey(100)
    else:
        cv2.imshow('Sequence', frames[x])
        cv2.waitKey(50)