def test_hook(): # init hook hook = ExampleHook() hook1 = ExampleHook(overwrite=True) hook2 = IgnoreHook(size=(0.5, 0.5), overwrite=True) frame_home = os.path.join(PROJECT_PATH, 'frame_save_dir') hook3 = FrameSaveHook(frame_home) hook4 = CropHook( size=(0.5, 0.5), offset=(0., 0.5), overwrite=True, ) hook5 = RefineHook() hook6 = InvalidFrameDetectHook() hook7 = TemplateCompareHook({ 'amazon': IMAGE_PATH, }) # --- cutter --- cutter = VideoCutter(compress_rate=0.8) # add hook cutter.add_hook(hook) cutter.add_hook(hook1) cutter.add_hook(hook2) cutter.add_hook(hook3) cutter.add_hook(hook4) cutter.add_hook(hook5) cutter.add_hook(hook6) cutter.add_hook(hook7) res = cutter.cut(VIDEO_PATH) stable, unstable = res.get_range() assert len(stable) == 2, 'count of stable range is not correct' data_home = res.pick_and_save( stable, 5, ) assert os.path.isdir(data_home), 'result dir not existed' # --- classify --- cl = SVMClassifier() cl.load(data_home) cl.train() classify_result = cl.classify(VIDEO_PATH, stable) # --- draw --- r = Reporter() report_path = os.path.join(data_home, 'report.html') r.draw( classify_result, report_path=report_path, cut_result=res, ) assert os.path.isfile(report_path) # hook check assert os.path.isdir(frame_home) assert hook6.result assert hook7.result
def test_hook(): # init hook hook = ExampleHook() hook1 = ExampleHook() hook2 = IgnoreHook(size=(0.5, 0.5)) frame_home = os.path.join(PROJECT_PATH, "frame_save_dir") hook3 = FrameSaveHook(frame_home) hook4 = CropHook(size=(0.5, 0.5), offset=(0.0, 0.5)) hook5 = RefineHook() hook6 = InterestPointHook() hook7 = TemplateCompareHook({"amazon": IMAGE_PATH}) # --- cutter --- cutter = VideoCutter(compress_rate=0.9) # add hook cutter.add_hook(hook) cutter.add_hook(hook1) cutter.add_hook(hook2) cutter.add_hook(hook3) cutter.add_hook(hook4) cutter.add_hook(hook5) cutter.add_hook(hook6) cutter.add_hook(hook7) res = cutter.cut(VIDEO_PATH) stable, unstable = res.get_range() assert len(stable) == 2, "count of stable range is not correct" data_home = res.pick_and_save(stable, 5) assert os.path.isdir(data_home), "result dir not existed" # --- classify --- cl = SVMClassifier() cl.load(data_home) cl.train() classify_result = cl.classify(VIDEO_PATH, stable) # --- draw --- r = Reporter() report_path = os.path.join(data_home, "report.html") r.draw(classify_result, report_path=report_path, cut_result=res) assert os.path.isfile(report_path) # hook check assert os.path.isdir(frame_home) assert hook6.result assert hook7.result
# 默认情况下,所有的坐标都是从左上角开始的 # 如果我们需要偏移到右下角,意味着我们需要向下偏移 0.5 * height,向右偏移 0.5 * width # offset=(0.5, 0.5), # 当然,这里也可以指定绝对长度,同size # offset=(100, 100), overwrite=True) # 在初始化完成后,你就可以将hook添加到 cutter 或 classifier 中了 # 在添加完成后,你可以发现,stagesepx 只会对你裁剪后的区域进行检测 cutter.add_hook(hook2) # 在 0.7.1 之后,针对 CropHook 的使用场景,IgnoreHook 被加入用于对其进行进一步补充 # 与 CropHook 相反,它被用于对帧的一部分进行屏蔽 # 详见 https://github.com/williamfzc/stagesepx/issues/56 hook3 = IgnoreHook( # 它的参数解析方式与 CropHook 是一致的,此处不赘述 # 与 CropHook 不同的是,此处指定的区域会被屏蔽掉 size=(0.5, 0.5), offset=(0.5, 0.5), overwrite=True) # 为了不影响结果,在例子中先注释掉了 # cutter.add_hook(hook3) # 开始切割 res = cutter.cut( video_path, # block 能够对每帧进行切割并分别进行比较,计算出更加敏感的ssim值 # 默认为2,即切为4宫格;若为4,即切为16宫格,以此类推;为1即不做切割,全图比较 # 值得注意,如果无法整除,block是会报错的 block=2, ) # 你可以将你的cutter结果保存起来,供其他时刻使用(>=0.4.4)
# 使用Keras方法进行预测 cl = KerasClassifier() cl.load_model('./model.h5') # 将视频切分成帧 file_name = './video_for_forecast.mp4' # 预加载,大幅度提升分析速度 video = VideoObject(file_name, pre_load=True) # 新建帧,计算视频总共有多少帧,每帧多少ms video.load_frames() # 压缩视频 cutter = VideoCutter() # 这个hook是干什么的,后续做解释 hook = IgnoreHook( size=(0.05, 1), overwrite=True, ) cutter.add_hook(hook) # 计算每一帧视频的每一个block的ssim和psnr。 res = cutter.cut(video, block=6) # 计算出哪些区间是稳定的,哪些是不稳定的。判断A帧到B帧之间是稳定还是不稳定 stable, unstable = res.get_range(threshold=0.97, offset=2) # 把分好类的稳定阶段的图片存本地 res.pick_and_save(stable, 30, to_dir='./picture/forecast_stable', meaningful_name=True) res.pick_and_save(unstable, 30, to_dir='./picture/forecast_unstable', meaningful_name=True)