def analyze(path, height=96, min_n_frames=25, max_n_frames=3000): analysis = Analysis() nframes = 0 cur_is_hard = True prevframe = None prevprevframe = None for frame in numm.video_frames(path, height=height, fps=25): if nframes > min_n_frames and discontinuity( prevframe, frame) and discontinuity(prevprevframe, frame): # HARD CUT yield (analysis.pop(), cur_is_hard) nframes = 0 cur_is_hard = True elif nframes >= max_n_frames: # SOFT CUT (max_n_frames) # XXX: bring back metric to segment on slow changes yield (analysis.pop(), cur_is_hard) cur_is_hard = False nframes = 0 analysis.process(frame) nframes += 1 prevprevframe = prevframe prevframe = frame yield (analysis.pop(), cur_is_hard)
def analyze(path, width=120, height=96, min_n_frames=25, max_n_frames=3000): analysis = Analysis() nframes = 0 cur_is_hard = True prevframe = None prevprevframe = None for frame in numm.video_frames(path, height=height, fps=25): if nframes>min_n_frames and discontinuity(prevframe, frame) and discontinuity(prevprevframe, frame): # HARD CUT yield (analysis.pop(), cur_is_hard) nframes = 0 cur_is_hard = True elif nframes >= max_n_frames: # SOFT CUT (max_n_frames) # XXX: bring back metric to segment on slow changes yield (analysis.pop(), cur_is_hard) cur_is_hard = False nframes = 0 analysis.process(frame) nframes += 1 prevprevframe = prevframe prevframe = frame yield (analysis.pop(), cur_is_hard)
def serialize(videopath, directory=None, min_n_frames=25, max_n_frames=3000): import json, time t0 = time.time() if directory is None: directory = videopath + '.analysis' absdir = os.path.join(directory, 'abs') if not os.path.isdir(directory): os.makedirs(directory) if not os.path.isdir(absdir): os.makedirs(absdir) doc = [] def cut_doc(ishard, start, duration): return {'start': start, 'duration': duration, 'hard': ishard} everyframe = EveryNSecs(outpattern=os.path.join(absdir, "mod_%d.png"), nsecs=5) # FIXME: repeated code (so as to serialize & post-process ...) analysis = Analysis(everyframe=everyframe) nframes = 0 ncuts = 0 cur_is_hard = True prevframe = None firstframe = None count = 0 for f_idx, frame in enumerate( numm.video_frames(videopath, height=96, fps=25)): if firstframe is None: firstframe = frame if nframes > min_n_frames and discontinuity(prevframe, frame): # HARD CUT doc.append( cut_doc(cur_is_hard, (f_idx - nframes) / 25.0, nframes / 25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() firstframe = frame nframes = 0 ncuts += 1 cur_is_hard = True elif nframes >= max_n_frames: # SOFT CUT (max_n_frames) # XXX: bring back metric to segment on slow changes doc.append( cut_doc(cur_is_hard, (f_idx - nframes) / 25.0, nframes / 25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() firstframe = frame cur_is_hard = False nframes = 0 ncuts += 1 analysis.process(frame) nframes += 1 prevframe = frame count += 1 doc.append(cut_doc(cur_is_hard, (count - nframes) / 25.0, nframes / 25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() json.dump(doc, open(os.path.join(directory, 'video.json'), 'w')) dur = doc[-1]['start'] + doc[-1]['duration'] dt = time.time() - t0 ratio = dur / dt print 'analyzed a %ds video in %ds (%.2fx)' % (dur, dt, ratio)
def serialize(videopath, directory=None, min_n_frames=25, max_n_frames=3000): import json, time t0 = time.time() if directory is None: directory = videopath + '.analysis' absdir = os.path.join(directory, 'abs') if not os.path.isdir(directory): os.makedirs(directory) if not os.path.isdir(absdir): os.makedirs(absdir) doc = [] def cut_doc(ishard, start, duration): return {'start': start, 'duration': duration, 'hard': ishard } everyframe= EveryNSecs(outpattern=os.path.join(absdir, "mod_%d.png"), nsecs=5) # FIXME: repeated code (so as to serialize & post-process ...) analysis = Analysis(everyframe=everyframe) nframes = 0 ncuts = 0 cur_is_hard = True prevframe = None firstframe = None count = 0 for f_idx, frame in enumerate(numm.video_frames(videopath, height=96, fps=25)): if firstframe is None: firstframe = frame if nframes>min_n_frames and discontinuity(prevframe, frame): # HARD CUT doc.append(cut_doc(cur_is_hard, (f_idx-nframes)/25.0, nframes/25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() firstframe = frame nframes = 0 ncuts += 1 cur_is_hard = True elif nframes >= max_n_frames: # SOFT CUT (max_n_frames) # XXX: bring back metric to segment on slow changes doc.append(cut_doc(cur_is_hard, (f_idx-nframes)/25.0, nframes/25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() firstframe = frame cur_is_hard = False nframes = 0 ncuts += 1 analysis.process(frame) nframes += 1 prevframe = frame count += 1 doc.append(cut_doc(cur_is_hard, (count-nframes)/25.0, nframes/25.0)) analysis.serialize(os.path.join(directory, str(ncuts))) analysis.reset() json.dump(doc, open(os.path.join(directory, 'video.json'), 'w')) dur = doc[-1]['start'] + doc[-1]['duration'] dt = time.time() - t0 ratio = dur / dt print 'analyzed a %ds video in %ds (%.2fx)' % (dur, dt, ratio)