目录

  • 一、需求背景
  • 二、录屏视频
  • 三、设计思路
    • 3.4 计算重合度
    • 3.3 计算偏移量
    • 3.5 模板匹配
    • 3.1 读取图像
    • 3.2 计算不变区域
    • 3.6 图像拼接
      • 3.6.1 底部拼接
      • 3.6.2 平均拼接
  • 四、实现代码
  • 五、最终结果

一、需求背景

如果你有一台苹果手机,想要截取超过一个屏幕高度的长截图,需要多次截屏之后,再使用另外一个APP,才能将多张图像拼接成一整张长截图

「Picsew」长截屏软件:1

如果你用的是安卓手机,可以使用系统自带的长截图功能。

但是有的APP不支持长截屏怎么办?有的画面比长截图能截取的范围还要长怎么办?长截图滚动的速度太慢了,还有更快的办法吗?

我就遇到了这样的场景,我希望获取微信步数排行榜单里的数据,但是没有找到抓包的接口,所以只能先截屏、然后再做图像识别

但是微信步数排行的榜单实在太长了,截取完成一次要截好几屏,并且长截屏的速度真的太慢了。

于是我想到一个方法,先录制屏幕滚动的视频,然后再拼图长截屏,会不会更快一点呢?

二、录屏视频

需要注意以最高的画质和帧率屏幕录像,录屏画质越高,之后拼图的画质自然就越高。

并且录屏滚动的速度可以慢一点,避免两帧之间的画面移动的距离太远,为后面的拼图带来困难。

三、设计思路

计算每两帧图像之间的偏移量,是能够合成长截图的基础。而能够找到两张图像的偏移量,首先要找到一种方法评估两张图像的重合度

所以3.4节虽然是程序运行的第4个步骤,但却我首先尝试解决的问题,我首先介绍这个环节:

3.4 计算重合度

将视频中的每一帧图像读取为矩阵,将两帧图像的矩阵偏移后相减,如果得到的值全部为,那么这个偏移量就是这两帧图像偏移的距离

但是事与愿违,视频中的画质是有损失的。图像重叠区域的像素并不精确相等,只是近似一致。所以需要找到一种评估两个区域像素相似程度的指标。

将重叠区域的像素数值相减,然后再取绝对值的平均值,作为评估相似程度的依据,数值越小则说明相似程度越高

def overlay(d1, d2, d):'''计算重叠部分差异绝对值的平均值'''L1 = d1.shape[0]L2 = d2.shape[0]dd1 = d1[max(0,  d):min(L1, L2+d)]dd2 = d2[max(-d, 0):min(L1-d, L2)]return np.abs(- 1 * dd2 + dd1).mean() # safe plus

3.3 计算偏移量

将两张图像从上到下滑动匹配一遍,找到重合度最高、也就是差值绝对值的平均值最小的那一次,认为是两帧图像的相对偏移量:

def offset(img1, img2):'''计算两张图片的平移偏移量'''height = img1.shape[0]avg = np.inffor h in range(- 100, height // 2): # 搜寻范围avg1 = overlay(img1, img2, h)if avg > avg1:avg = avg1dh = hreturn dh, avg

这个方法得到了不错的运行结果,但是我很快就发现了问题——运行效率太低

计算两帧图像的数据需要好几秒钟,视频一秒就可以有60帧,十几秒就可能有上千帧。总时间太长了,还有别的更好的办法吗?

3.5 模板匹配

最近在学习图像识别算法,了解到有一个叫做模板匹配的算法2。Python的图形处理cv2库内建这种算法,参数method有3种可选的匹配模式,本例中设置为了cv2.TM_SQDIFF_NORMED,其他模式经测试运行速度和效果也基本一致。

计算运行720×1306分辨率的图像,速度大约可以达到每秒计算15帧

def match(image, templ, method):'''模板匹配图像位置'''th, tw = templ.shape[:2]result = cv2.matchTemplate(image, templ, method)result2 = (result - result.min()) / (result.max() - result.min())min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)return min_loc if method == cv2.TM_SQDIFF_NORMED else max_loc

3.1 读取图像

使用迭代器逐帧读取视频中的图像数据:

def imiter(file, st=None, ed=None):'''封装的视频读取迭代器'''cap = cv2.VideoCapture(file)while cap.isOpened():ret, img = cap.read()if not ret:cap.release()returnyield img[st:ed]

3.2 计算不变区域

屏幕录像中,顶部状态栏和底部导航栏有时会占用一部分高度,但这不是我们需要拼接的内容。我在函数中设置了sted参数,可以手动设定需要裁切的高度

也可以自动测量,逐一读取每行的像素数据,计算每行的方差,找到数值突变的那个部分,就是需要裁切的起始结束位置。

def repeat(file):'''计算视频中存在变化的区域起止范围'''data = []for img in imiter(file):h, w, n = img.shapedata.append(img.reshape((h, -1)).mean(1))data = np.array(data)var = data.var(0)where = np.where(var > var.mean())[0]return where.min(), where.max() + 1

3.6 图像拼接

综合前面的方法,就可以计算出录屏视频中各帧图像的偏移数值序列,将图像拼接成完整的长截图。

图像拼接有两种策略:

3.6.1 底部拼接

第一种方法,将新一帧的追加内容直接拼接在图像的底部

def join_bottom(file, gaps, st=None, ed=None):'''滚动拼接到图片底部'''imgs = imiter(file, st, ed)data = next(imgs)for n, (img, gap) in enumerate(zip(imgs, gaps)):data = np.concatenate([data, img[img.shape[0] - gap:]])return data

3.6.2 平均拼接

第二种方法,将重叠区域的图像平均后再保存。对于屏幕录屏来说,每一帧的画质是有损失的,进行平均处理后,画质会有明显的提升:

def join_avg(file, gaps, st=None, ed=None):'''加权拼贴图像'''imgs = imiter(file, st, ed)data = next(imgs).astype(np.int16)data = np.concatenate([data, np.zeros((sum(gaps), *data.shape[1:]), np.int16)]) # 扩展填0weight = np.zeros_like(data)height = data.shape[0]st = 0for n, (img, gap) in enumerate(zip(imgs, gaps)):st += gaped = min(height, st + img.shape[0])data  [st:ed] += img[:ed-st]weight[st:ed] += np.ones_like(img[:ed-st])return data // weight

不过这种方法,一旦某两帧的偏移值计算出现错误,拼接就会错位,导致保存图像出现重影,并且不容易被看出来。

四、实现代码

把之前的内容串起来,就能得到录屏视频生成长截图的程序,可以留给读者作为课后练习。

我也把完整的程序、和测试用例上传到了网盘,有需要的同学可以自行下载运行:

https://download.csdn.net/download/weixin_39804265/84993982

五、最终结果

测试了一段12秒的录屏视频,总共908帧,合成了720×50557分辨率的长截图,相当于39个屏幕高度,总共用时62.98秒,平均每秒处理14.4帧图像

而之前用的滑动对齐法,同样的908帧的视频,总共用时,呃。。7853秒,也就是2小时11分钟。。耗时为模板匹配方法的124.7倍,平均每帧用时8.66秒

使用手机录制示例:

程序拼接效果示例:


  1. Picsew——iPhone上的截图工具: https://baijiahao.baidu.com/s?id=1660058225659119872 ↩︎

  2. python实现模板匹配: https://www.cnblogs.com/april0315/p/13741888.html ↩︎

用Python实现将滑动屏幕保存的录屏视频自动拼接为长截图相关推荐

  1. 010将屏幕录像机的录屏输出为Xvid格式的AVI文件

    010将屏幕录像机的录屏输出为Xvid格式的AVI文件 我使用的是屏幕录像专家 V2014版本. LXE格式输出为AVI格式的时候,你只能找到一些默认的格式: 01LXE转AVI你所能选择的格式.pn ...

  2. android 8华为屏幕录制,数码知识:华为nova8pro如何屏幕录制怎么录屏

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道华为nova8pro如何屏幕录制怎么录 ...

  3. windows录屏_电脑如何录制屏幕?windows录屏软件哪个好?

    电脑如何录制屏幕?windows录屏软件哪个好? 电脑是学习和生活中必备的工具之一,不管是普通的使用者,还是资深的游戏玩家,都会有录制屏幕的需求. 虽然电脑都有自带的录屏工具,但是满足不了部分对录制屏 ...

  4. 电脑如何录制屏幕?windows录屏软件哪个好?

    电脑是学习和生活中必备的工具之一,不管是普通的使用者,还是资深的游戏玩家,都会有录制屏幕的需求. 虽然电脑都有自带的录屏工具,但是满足不了部分对录制屏幕有专业要求的人们.相信很少人会去用.因为系统自带 ...

  5. python录制视频和声音_使用python编写一个录制屏幕及右下角录视频的工具

    1.首先需要的python模块有:pyaudio.openCV.moviepy.pillow.wave主要第三方库. pyaudio录制音频 openCV录制屏幕及对个人录像 moviepy对录制的音 ...

  6. 如何在 Mac 上录制屏幕?mac录屏教程分享

    您可以为整个屏幕或屏幕上的选定部分录制视频. 1.使用"截屏"工具栏 要查看"截屏"工具栏,请同时按下以下三个按键:Shift.Command 和 5.您将看到 ...

  7. b站如何进行屏幕录制?录屏最值得尝试的几款软件

    b站如何进行屏幕录制?随着我们的娱乐生活越来越丰富,我们越来越多的追求视频享受,但是,b站的视频不能下载,所以,我们想要制作自己的视频的时候,就需要进行录制,那么怎么进行视频录制呢?这里就要用到录屏工 ...

  8. 安卓10自带录屏_谷歌终于在Android 11版里原生支持屏幕录像功能(即录屏)和长截图功能...

    在谷歌面向开发者们推出 Android 11 开发者预览版后,关于新版本的越来越多的新增功能正在被逐渐发掘出来. 例如最新被发掘出来的新功能是谷歌终于添加所有用户期待已久的屏幕录像功能,同时还支持进行 ...

  9. 用Python编写录屏程序将播放的视频用截屏方法转换为多帧图像编辑后保存为GIF格式动图文件

    有时编写游戏后发博文,为使读者有一个直观的游戏效果,会把游戏运行动画转换GIF格式动图发到博文中.本文介绍如何用python PIL库ImageGrab.grab()函数截屏,编写录屏程序,将视频转换 ...

  10. 计算机快捷键屏幕录制,屏幕录制软件哪个好用?设置电脑录屏快捷键

    屏幕录制软件哪个好用?设置电脑录屏快捷键 2020年05月19日 14:40作者:黄页编辑:黄页 分享 屏幕录制软件哪个好用?不管是在生活还是在工作中,电脑录屏的需求都是有的.那在线录制电脑视频的好用 ...

最新文章

  1. 【图灵奖大佬】Yoshua Bengio最新《深度学习》教程
  2. 解决安装mysql的”A Windows service with the name MySQL already exists.“问题
  3. 【AR】开始使用Vuforia开发iOS(2)
  4. 即构推出小程序连麦直播方案,与iOSAndroid APP互通连麦!
  5. try-catch-finally 与返回值的修改
  6. 交换机三种端口模式Access、Hybrid和Trunk的理解
  7. php基础遍历,php 数据遍历
  8. 飞秋的模拟实现代码,很好很山寨!
  9. tomcat路径配置详解
  10. android 服务端 servlet webservice,Tomcat 上如何部署Servlet及Android中如何与服务器通信(12页)-原创力文档...
  11. 2020级C语言大作业 - 小球进框
  12. 饿了么是视障者非常喜欢的APP,你们要加油哦!
  13. npm i 报错 'match' of undefined 错误以及删除node_modules失败
  14. Unity3D 内存释放 垃圾回收
  15. 机器学习——k近邻算法
  16. 自定义view绘制太极图案
  17. MySQL数据库与JDBC编程
  18. excel窗体最大化最小化_最小化Excel 2007功能区
  19. windows查看密码工具
  20. 1节课学会PS ,Adobe PhotoshopCS6超速入门

热门文章

  1. HTML 小型进销库存界面模板
  2. MMD中的VMD文件格式详解
  3. Win10(winser2019)关闭驱动数字签名方法
  4. oracle锁表查询及释放进程
  5. 百度音乐助手 下载高品质音乐
  6. spark大数据技术与应用 实训
  7. html 媒体查询改变字体,CSS----媒体查询设置根节点字体大小
  8. 小米air2se耳机只有一边有声音怎么办_小米真无线蓝牙耳机Air2 SE评测:仅需169元,享受随心畅听体验...
  9. ToLua(LuaFramework) -ToLua框架使用指南
  10. 广东百望税控盘初始化设置