Python滚动截长图的简单算法实现,由视频读帧计算滚动距离并拼接长图。
支持反向滚动、水平滚动,支持预测和跳帧,核心代码 < 200行
# ffmpeg-python, numpy, pillow, click
pip install numpy pillow ffmpeg-python click
# ffmpeg (https://ffmpeg.org/)
apt install ffmpeg
./splicing --help
./splicing ../examples/a.mp4
算法的一些主要函数实现
列采样函数, 由一个图片矩阵中选取并处理几列的数据并返回。
img_array
: 灰度图片(矩阵)
cols_group
: 自定义采样策略, 例如:
- cols_group=[[1]] - 只取第1列
- cols_group=[[1,5],[6,9]] - 分别取第1,5列和第6,9列的平均值
根据预测值生成一个偏移值列表
max
: 最大的滚动距离绝对值
p
: 预测的滚动距离(offset)
例如滚动范围是(-100, 100)
(max=100
), 预测的滚动距离是50
(p=50
)。
则返回的列表是[50, 51, 49, 52, 48, ...]
也就是由预测值开始,向预测值左右依次比较
cols
, cols2
: 是由采样函数col_sampling
对图片采样结果
predict
: 预测的滚动距离
approx_diff
: 可以接受的差异值,比较差异时小于该值返回
min_overlap
: 可接受的最小重叠高度(px)
若平均差小于设定的 approx_diff
则准备跳出循环,跳出循环前,再比较最后10次(目的在与让拼接位置更准确一点)。
该函数实现了预测和丢帧的策略。 list 是一个之前几次计算结果的列表, 每次的计算结果由一个元组表示,例如(2, 30, 0.1111) 表示第2帧,滚动距离30px, 平均绝对差异值为0.1111。 idea_offset 表示期望的滚动距离,假设我期望的滚动距离是300px, 而根据之前的结果, 每帧滚动了90px, 那么可以计算到,距离达到期望的滚动距离还有3.3帧, 那就可以丢2帧,假设滚动是线性的(这几帧的滚动距离也是每帧90px), 那么预测的滚动距离就是270px。
调用core.py提供的关键函数,进行实际拼接。 可分为如下3部分:
- FFmpeg视频读帧
- 调用 core.py 计算重合位置
- 拼接长图