def __seek_calib_limit(self, video, frame_range, max_miss_count=3, verbose=True):
frame_range_signed_length = frame_range[1] - frame_range[0]
sample_interval_frames = frame_range_signed_length // 2
failed_attempts = 0
while sample_interval_frames != 0:
miss_count = 0
try:
if verbose:
if sample_interval_frames < 0:
print("\nSampling every {:d} frames within {:s}, backwards."
.format(-sample_interval_frames, str((frame_range[1], frame_range[0]))))
else:
print("\nSampling every {:d} frames within {:s}.".format(sample_interval_frames,
str(frame_range)))
for i_frame in range(frame_range[0], frame_range[1], sample_interval_frames):
video.read_at_pos(i_frame)
if verbose:
print('.', end="", flush=True)
if video.try_approximate_corners(self.board_dims):
frame_range[0] = i_frame
miss_count = 0
else:
miss_count += 1
if miss_count > max_miss_count:
# too many frames w/o calibration board, highly unlikely those are all bad frames,
# go to finer scan
frame_range[1] = i_frame
break
sample_interval_frames = round(sample_interval_frames / 2)
except cv2.error as e:
failed_attempts += 1
if failed_attempts > 2:
raise RuntimeError("Too many failed attempts. Frame index: " + str(i_frame))
print("FFmpeg hickup, attempting to reopen video.")
video.reopen() # workaround for ffmpeg AVC/H.264 bug
return frame_range[0]
评论列表
文章目录