摘要:將圖片的處理方法放到視頻中的每一幀,再加上彈幕飛過(guò)的效果,就完成了版的智能防擋彈幕。不知道站的實(shí)現(xiàn)方法是怎樣,是否有人工干預(yù),是否有預(yù)計(jì)算。
某天代碼寫(xiě)得老眼昏花,去B站上摸魚(yú),突然發(fā)現(xiàn)奇怪的現(xiàn)象:
喲呵,B站竟然做了 視頻前景提取 ,把彈幕藏到畫(huà)面人物的后面。識(shí)別效果還意外地不錯(cuò)呢。
然后又翻了下,發(fā)現(xiàn)這是個(gè)叫做“ 智能防擋彈幕 ”的功能,我只在部分舞蹈區(qū)的視頻里找到了開(kāi)關(guān)。
我不知道B站是怎么實(shí)現(xiàn)的,但我腦中閃過(guò)一個(gè)想法:能不能用 Python 實(shí)現(xiàn)?簡(jiǎn)單搜索了一下“ python 前景提取 ”,發(fā)現(xiàn) OpenCV 的 GrabCut 提供了這樣的功能。
那么剩下的就好辦了。
先放最終實(shí)現(xiàn)效果(完整代碼見(jiàn)文末):
之前我們的“ 每周一坑 ”里有講過(guò)怎么在圖片上加文字:【解答】用代碼給圖片配上文字。用這個(gè)方法,可以模擬彈幕的效果:
再用 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 是輸出圖像,是一個(gè)二值化的蒙版(mask),rect 是待檢測(cè)區(qū)域,后面的數(shù)字 5 是迭代次數(shù),其他的參數(shù)照搬例子即可。輸出結(jié)果:
有了蒙版之后,就可以對(duì)圖像進(jìn)行運(yùn)算。分別取出 帶彈幕圖像的背景部分 ,和 原圖像的前景部分 ,兩個(gè)加一起,就是我們最終需要的效果:
核心代碼:
img = img * (1-mask)[:,:,np.newaxis] + img * mask[:,:,np.newaxis]
基本功能這樣就完成了。將圖片的處理方法放到視頻中的每一幀,再加上彈幕飛過(guò)的效果,就完成了 Python 版的智能防擋彈幕。
更多的一些細(xì)節(jié):
1、前景提取的速度比較慢,為了能達(dá)到實(shí)時(shí)效果,我在 提取前景時(shí),將圖片縮小,獲取蒙版之后,再將其放大至原尺寸 。蒙版本身的分辨率幾乎不影響最終效果,但通過(guò)這個(gè)方法就可以做到實(shí)時(shí)。
2、每一幀的處理速度有快有慢,為了穩(wěn)定幀率,我加入了每幀時(shí)間的計(jì)算, 如果時(shí)間不足設(shè)定時(shí)長(zhǎng),就 sleep 剩下的時(shí)間 。
3、一些過(guò)渡幀的識(shí)別效果會(huì)比較差,導(dǎo)致中間少數(shù)蒙版出現(xiàn)類(lèi)似“跳幀”的效果。為了平滑這些幀,我在程序里記錄每一幀蒙版中前景像素的數(shù)量, 如果當(dāng)前幀與之前 20 幀的平均值差距超過(guò) 50%,那就認(rèn)為這一幀的前景提取不合格,直接使用之前的蒙版 。
4、為了模擬實(shí)際效果,我還去B站抓了下視頻相關(guān)的彈幕,它是在一個(gè) xml 文件中:
https:// api.bilibili.com/x/v1/dm/list.so?oid=9931722
因?yàn)橹挥幸粋€(gè)文件,我就直接通過(guò) SublimeText 的正則替換功能 對(duì)數(shù)據(jù)進(jìn)行了整理,沒(méi)額外再寫(xiě)爬蟲(chóng)和處理的代碼。這是個(gè)很實(shí)用的小技巧。
代碼中我只使用了 彈幕內(nèi)容 和 時(shí)間 兩個(gè)值。當(dāng)?shù)竭_(dá)某條彈幕時(shí)間,就把它放入激活列表, 添加到圖像右側(cè),隨機(jī)高度和顏色,然后每一幀將橫向位置向左移動(dòng) 。直到圖像左側(cè)外部后,從激活列表中移除。
最終效果演示視頻:
https://www.zhihu.com/video/1066336643396620288
作為一個(gè) demo,效果勉強(qiáng)可以接受吧。對(duì)這種沒(méi)有預(yù)設(shè)背景信息,完全靠圖像層面計(jì)算的話(huà),準(zhǔn)確率是不會(huì)太高的。所以只有這種背景單一、前景明顯的視頻效果還不錯(cuò)。而且很明顯,白色衣服的效果就不太行。不知道B站的實(shí)現(xiàn)方法是怎樣,是否有人工干預(yù),是否有預(yù)計(jì)算。我覺(jué)得有的可能性還是很大的,因?yàn)楫吘怪挥猩倭恳曨l開(kāi)啟了“智能防擋”。如果有了解情況的,歡迎留言。
*
PS:說(shuō)來(lái)我以前的論文,和這個(gè)也算是相關(guān)領(lǐng)域。
獲取“Python智能防擋彈幕”完整代碼,請(qǐng)?jiān)诠娞?hào)(Crossin的編程教室)里回復(fù)關(guān)鍵字 彈幕
════
其他文章及回答:
如何自學(xué)Python | 新手引導(dǎo) | 精選Python問(wèn)答 | Python單詞表 | 人工智能 | 爬蟲(chóng) | 我用Python | requests | 計(jì)算機(jī)視覺(jué) | 字符播放器 | 一圖學(xué)Python
歡迎搜索及關(guān)注公眾號(hào): Crossin的編程教室
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/45034.html
摘要:于是就有機(jī)智的程序員開(kāi)發(fā)出了親戚關(guān)系計(jì)算器,可以通過(guò)指定關(guān)系的疊加,計(jì)算出互相之間的關(guān)系稱(chēng)謂,有的還可以通過(guò)稱(chēng)呼來(lái)倒推關(guān)系。這個(gè)版本的算法是網(wǎng)上相對(duì)最完善的,并且被自帶親戚計(jì)算器功能所采用。 春節(jié)到了,免不了要去七大姑八大姨家拜年,順便接受長(zhǎng)輩們的關(guān)懷。有時(shí)偶然遇到許久沒(méi)見(jiàn)過(guò)的遠(yuǎn)房親戚,叫不出合適的稱(chēng)謂就尷尬了;或者即便被家人提示了叫法,但依然不知道和自己是什么關(guān)系。 于是就有機(jī)智的程...
摘要:某寶一年一度的集五福活動(dòng)更是成為每年的必備活動(dòng)。今年再來(lái)對(duì)福字做文章,演示下如何用的圖像處理功能,把一幅福字圖片轉(zhuǎn)出種不同的效果最圖像處理最常用的兩個(gè)模塊是和,這里我們選擇。輪廓福使用了自帶的圖像輪廓提取功能。 快過(guò)年了,各種互聯(lián)網(wǎng)產(chǎn)品都出來(lái)撒紅包。某寶一年一度的集五福(shua hou)活動(dòng)更是成為每年的必備活動(dòng)。雖然到最后每人大概也就分個(gè)兩塊錢(qián),但作為一個(gè)全民話(huà)題,大多數(shù)人還是愿意...
摘要:又到了一年一度的情人節(jié)大家都準(zhǔn)備送什么給自己心儀的對(duì)象呢鮮花巧克力都太俗套了,今天給大家?guī)?lái)一個(gè)抖音上看到的表白神器用寫(xiě)一個(gè)告白程序,讓她看到你滿(mǎn)滿(mǎn)的愛(ài)意。 又到了一年一度的情人節(jié)!大家都準(zhǔn)備送什么給自己心儀的對(duì)象呢? 鮮花、巧克力都太俗套了,今天給大家?guī)?lái)一個(gè)抖音上看到的表白神器 — 用Python寫(xiě)一個(gè)告白程序,讓她看到你滿(mǎn)滿(mǎn)的愛(ài)(tao)意(lu)。 先上效果: showImg(...
摘要:先來(lái)看下效果實(shí)際使用不需要打開(kāi)手機(jī),此處為演示需要實(shí)現(xiàn)代碼主要有兩個(gè)部分接收紅包消息直接從手機(jī)端微信獲取數(shù)據(jù)比較麻煩,主流的方法都是通過(guò)微信網(wǎng)頁(yè)版來(lái)獲取。這里我用的是,通過(guò)即可安裝,之前我也寫(xiě)過(guò)文章介紹微信機(jī)器人進(jìn)化指南。 又到了辭舊迎新的時(shí)候,群里的紅包也多起來(lái)了。然而大佬們總是喜歡趁我不在的時(shí)候發(fā)紅包,經(jīng)常打開(kāi)手機(jī),發(fā)現(xiàn)紅包已被搶完,感覺(jué)錯(cuò)過(guò)了一個(gè)億。 安卓上有不少紅包助手工具,但...
摘要:組件提供了一系列的操作接口以方便用戶(hù)對(duì)彈幕的相關(guān)特性進(jìn)行定制。對(duì)于這種類(lèi)型的圖像,我們可以使用色鍵的方式進(jìn)行摳圖生成蒙版。其中,用于更新蒙版的接口為。 導(dǎo)讀:本文內(nèi)容是筆者最近實(shí)現(xiàn)的 web 端彈幕組件—— Barrage UI 的一個(gè)延伸。在閱讀本文的實(shí)例和相關(guān)代碼之前,不妨先瀏覽項(xiàng)目文檔,對(duì)組件的使用方式和相關(guān)接口進(jìn)行了解。 各位童鞋如果經(jīng)常上 B 站(bilibili.com) ...
閱讀 2826·2023-04-25 14:21
閱讀 1252·2021-11-23 09:51
閱讀 4178·2021-09-22 15:43
閱讀 677·2019-08-30 15:55
閱讀 1645·2019-08-29 11:28
閱讀 2508·2019-08-26 11:44
閱讀 1745·2019-08-23 18:15
閱讀 2942·2019-08-23 16:42