所以我来了这个微小但棘手的问题。
我有一个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并使用单独的情况,但我发现它不是很有吸引力,并且想知道是否有一个内置功能或一个漂亮的“单线”;)
答案 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)