资讯专栏INFORMATION COLUMN

B站智能防挡弹幕的一种python实现

jzzlee / 1918人阅读

摘要:将图片的处理方法放到视频中的每一帧,再加上弹幕飞过的效果,就完成了版的智能防挡弹幕。不知道站的实现方法是怎样,是否有人工干预,是否有预计算。

某天代码写得老眼昏花,去B站上摸鱼,突然发现奇怪的现象:

哟呵,B站竟然做了 视频前景提取 ,把弹幕藏到画面人物的后面。识别效果还意外地不错呢。

然后又翻了下,发现这是个叫做“ 智能防挡弹幕 ”的功能,我只在部分舞蹈区的视频里找到了开关。

我不知道B站是怎么实现的,但我脑中闪过一个想法:能不能用 Python 实现?简单搜索了一下“ python 前景提取 ”,发现 OpenCVGrabCut 提供了这样的功能。

那么剩下的就好办了。

先放最终实现效果(完整代码见文末):

之前我们的“ 每周一坑 ”里有讲过怎么在图片上加文字:【解答】用代码给图片配上文字。用这个方法,可以模拟弹幕的效果:

再用 GrabCut,提取出图片上的前景部分。核心代码:


import numpy as npimport cv2

mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (10, 10, img.shape[1]-10, img.shape[0]-10)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

img 是输入图像,mask 是输出图像,是一个二值化的蒙版(mask),rect 是待检测区域,后面的数字 5 是迭代次数,其他的参数照搬例子即可。输出结果:

有了蒙版之后,就可以对图像进行运算。分别取出 带弹幕图像的背景部分 ,和 原图像的前景部分 ,两个加一起,就是我们最终需要的效果:

核心代码:


img = img * (1-mask)[:,:,np.newaxis] + img * mask[:,:,np.newaxis]

基本功能这样就完成了。将图片的处理方法放到视频中的每一帧,再加上弹幕飞过的效果,就完成了 Python 版的智能防挡弹幕。

更多的一些细节:

1、前景提取的速度比较慢,为了能达到实时效果,我在 提取前景时,将图片缩小,获取蒙版之后,再将其放大至原尺寸 。蒙版本身的分辨率几乎不影响最终效果,但通过这个方法就可以做到实时。

2、每一帧的处理速度有快有慢,为了稳定帧率,我加入了每帧时间的计算, 如果时间不足设定时长,就 sleep 剩下的时间

3、一些过渡帧的识别效果会比较差,导致中间少数蒙版出现类似“跳帧”的效果。为了平滑这些帧,我在程序里记录每一帧蒙版中前景像素的数量, 如果当前帧与之前 20 帧的平均值差距超过 50%,那就认为这一帧的前景提取不合格,直接使用之前的蒙版

4、为了模拟实际效果,我还去B站抓了下视频相关的弹幕,它是在一个 xml 文件中:

https:// api.bilibili.com/x/v1/dm/list.so?oid=9931722

因为只有一个文件,我就直接通过 SublimeText 的正则替换功能 对数据进行了整理,没额外再写爬虫和处理的代码。这是个很实用的小技巧。

代码中我只使用了 弹幕内容时间 两个值。当到达某条弹幕时间,就把它放入激活列表, 添加到图像右侧,随机高度和颜色,然后每一帧将横向位置向左移动 。直到图像左侧外部后,从激活列表中移除。

最终效果演示视频:

https://www.zhihu.com/video/1066336643396620288

作为一个 demo,效果勉强可以接受吧。对这种没有预设背景信息,完全靠图像层面计算的话,准确率是不会太高的。所以只有这种背景单一、前景明显的视频效果还不错。而且很明显,白色衣服的效果就不太行。不知道B站的实现方法是怎样,是否有人工干预,是否有预计算。我觉得有的可能性还是很大的,因为毕竟只有少量视频开启了“智能防挡”。如果有了解情况的,欢迎留言。

*

PS:说来我以前的论文,和这个也算是相关领域。

获取“Python智能防挡弹幕”完整代码,请在公众号(Crossin的编程教室)里回复关键字 弹幕

════

其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉 | 字符播放器 | 一图学Python

欢迎搜索及关注公众号: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45034.html

相关文章

  • python版亲戚关系计算器

    摘要:于是就有机智的程序员开发出了亲戚关系计算器,可以通过指定关系的叠加,计算出互相之间的关系称谓,有的还可以通过称呼来倒推关系。这个版本的算法是网上相对最完善的,并且被自带亲戚计算器功能所采用。 春节到了,免不了要去七大姑八大姨家拜年,顺便接受长辈们的关怀。有时偶然遇到许久没见过的远房亲戚,叫不出合适的称谓就尴尬了;或者即便被家人提示了叫法,但依然不知道和自己是什么关系。 于是就有机智的程...

    qujian 评论0 收藏0
  • python 图像处理:一福变五福

    摘要:某宝一年一度的集五福活动更是成为每年的必备活动。今年再来对福字做文章,演示下如何用的图像处理功能,把一幅福字图片转出种不同的效果最图像处理最常用的两个模块是和,这里我们选择。轮廓福使用了自带的图像轮廓提取功能。 快过年了,各种互联网产品都出来撒红包。某宝一年一度的集五福(shua hou)活动更是成为每年的必备活动。虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意...

    JinB 评论0 收藏0
  • 送你个情人节礼物:Python版抖音同款表白神器

    摘要:又到了一年一度的情人节大家都准备送什么给自己心仪的对象呢鲜花巧克力都太俗套了,今天给大家带来一个抖音上看到的表白神器用写一个告白程序,让她看到你满满的爱意。 又到了一年一度的情人节!大家都准备送什么给自己心仪的对象呢? 鲜花、巧克力都太俗套了,今天给大家带来一个抖音上看到的表白神器 — 用Python写一个告白程序,让她看到你满满的爱(tao)意(lu)。 先上效果: showImg(...

    shiweifu 评论0 收藏0
  • Python写个了红包提醒,再不怕错过一个亿了

    摘要:先来看下效果实际使用不需要打开手机,此处为演示需要实现代码主要有两个部分接收红包消息直接从手机端微信获取数据比较麻烦,主流的方法都是通过微信网页版来获取。这里我用的是,通过即可安装,之前我也写过文章介绍微信机器人进化指南。 又到了辞旧迎新的时候,群里的红包也多起来了。然而大佬们总是喜欢趁我不在的时候发红包,经常打开手机,发现红包已被抢完,感觉错过了一个亿。 安卓上有不少红包助手工具,但...

    caikeal 评论0 收藏0
  • 【小案例】基于色键技术的纯客户端实时蒙版弹幕

    摘要:组件提供了一系列的操作接口以方便用户对弹幕的相关特性进行定制。对于这种类型的图像,我们可以使用色键的方式进行抠图生成蒙版。其中,用于更新蒙版的接口为。 导读:本文内容是笔者最近实现的 web 端弹幕组件—— Barrage UI 的一个延伸。在阅读本文的实例和相关代码之前,不妨先浏览项目文档,对组件的使用方式和相关接口进行了解。 各位童鞋如果经常上 B 站(bilibili.com) ...

    muzhuyu 评论0 收藏0

发表评论

0条评论

jzzlee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<