来源(侵剪)"""创建于2018年12月4日星期二16:48:57关键帧提取工具这个关键帧提取算法是基于帧间差异的。原理很简单首先,我们加载视频并计算每个帧之间的帧间差异然后,我们可以选择这三种方法中的一种来提取关键帧,它们都是基于差分法:1.使用差分顺序将平均帧间差分最大的前几帧认为是关键帧。2.使用差分阈值平均帧间差大于阈值的帧被认为是关键帧。3.使用局部最大值平均帧间差为局部最大值的帧被认为是关键帧。需要注意的是平滑平均差值在计算局部最大值之前可以有效去除噪声避免相似帧的重复提取场景。经过几次实验,第三种方法提取关键帧效果更好。原代码来自下面链接,我优化了代码,减少不必要的内存消耗。https://blog.csdn.net/qq_21997625/article/details/81285096@author:zyb_as"""importcv2importoperatorimportsubprocessimportnumpyasnp#importmatplotlib.pyplotaspltimportsys,osfromscipy.signalimportargrelextremafrommusecheckimportlogger_error,logger_infofrommusecheck.resource.confimportMUSECHECK_BASE_DIRtry:importmatplotlib.pyplotaspltexceptModuleNotFoundErrorase:logger_error(f'matplotlib,试执行pipinstallmatplotlib')matplotlib_path=os.path.join(MUSECHECK_BASE_DIR,'libs','matplotlib-3.3.2-cp37-cp37m-manylinux1_x86_64.whl')尝试:subprocess.Popen(f'pipinstallmatplotlib')logger_info(f'successpipinstallmatplotlib_path')exceptExceptionase:logger_error(f'安装依赖matplotlib_path出错,试pipins高{matplotlib_path},ErrorInfo:{e}')cycler_path=os.path.join(MUSECHECK_BASE_DIR,'libs','cycler-0.10.0-py2.py3-none-any.whl')certifi_path=os.path.加入(MUSECHECK_BASE_DIR,'libs','certifi-2020.6.20-py2.py3-none-any.whl')kiwisolver_path=os.path.join(MUSECHECK_BASE_DIR,'libs','kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl')Pillow_path=os.path.join(MUSECHECK_BASE_DIR,'libs','Pillow-8.0.1-cp37-cp37m-manylinux1_x86_64.whl')try:subprocess.Popen(f'pipinstall{cycler_path}')subprocess.Popen(f'pipinstall{certifi_path}')subprocess.Popen(f'pipinstall{kiwisolver_path}')subprocess.Popen(f'pipinstall{Pillow_path}')subprocess.Popen(f'pipinstall{matplotlib_path}')logger_info(f'successpipinstall{matplotlib_path}')exceptExceptionase:logger_error(f'安装依赖matplotlib出错,请联系【youngzhang】,ErrorInfo:{e}')defsmooth(x,window_len=13,window='hanning'):"""使用具有请求大小的窗口平滑数据。此方法基于缩放窗口与信号的卷积。通过引入反射来准备信号在两端复制信号(具有窗口大小),以便在输出信号的开始和结束部分最小化瞬态部分input:x:输入信号window_len:平滑窗口的维度window:类型'flat'、'hanning'、'hamming'、'bartlett'、'blackman'平面窗口的窗口将产生移动平均平滑。输出:平滑信号示例:importnumpyasnpt=np.linspace(-2,2,0.1)x=np.sin(t)+np.random.randn(len(t))*0.1y=smooth(x)另请参阅:numpy.hanning、numpy.hamming、numpy.bartlett、numpy.blackman,numpy.convolvescipy.signal.lfilterTODO:window参数可以是window本身如果是数组而不是字符串"""print(len(x),window_len)#ifx.ndim!=1:#raiseValueError,"smoothonlyaccepts1dimensionarrays."##ifx.size
