用Python表演馬老師的閃電五連鞭!

2020-12-08 小老鼠Python

11月份的頭條,是屬於馬保國的。

一位69歲的老同志,慘遭年輕人偷襲,不講武德。

看看把老同志欺負的...

要不是馬老師講仁義講道德,甩手就是一個五連鞭。

哈哈哈,所以本期我們就用Python給馬保國老師做一個閃電五連鞭動態詞雲圖

詞雲數據來自B站,使用stylecloud詞雲庫繪製。

主要參考百度AI Studio上的一個開源項目,使用PaddleSeg對人像進行分割。

年輕小F不講武德這樣好嗎耗子尾汁

/ 01 / 彈幕數據獲取

沒從B站上直接爬取,使用第三方庫bilibili_api

這是一個用Python寫的調用Bilibili各種API的庫,範圍涵蓋視頻、音頻、直播、動態、專欄、用戶、番劇等。

地址:https://passkou.com/bilibili_api/docs/

使用video模塊下面的兩個方法,可以獲取11月每天的視頻彈幕。

首先需要獲取SESSDATACSRF(bili_jct)的值。

谷歌瀏覽器可以通過下圖查看,域名選擇bilibili.com。

以點擊量為排序,選取排行第一的視頻獲取彈幕。沒想到馬老師老早就火了,耗子尾汁。

點擊排名第一的視頻,然後在瀏覽器的訪問欄獲取BV號,BV1HJ411L7DP。

獲取彈幕代碼如下。

from bilibili_api import video, Verifyimport datetime# 參數verify = Verify("你的SESSDATA值", "你的bili_jct值")# 獲取存在歷史彈幕的日期列表days = video.get_history_danmaku_index(bvid="BV1HJ411L7DP", verify=verify)print(days)# 獲取彈幕信息,並保存for day in days:danmus = video.get_danmaku(bvid="BV1HJ411L7DP", verify=verify, date=datetime.date(*map(int, day.split('-')))) print(danmus) f = open(r'danmu.txt', 'a') for danmu in danmus: print(danmu) f.write(danmu.text + '\n') f.close()

得到結果。

我大E了啊,沒有閃。

使用jieba對彈幕數據進行分詞處理

import jiebadef get_text_content(text_file_path):''' 獲取填充文本內容 ''' text_content = '' with open(text_file_path, encoding='utf-8') as file: text_content = file.read() # 數據清洗,只保存字符串中的中文,字母,數字 text_content_find = re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', text_content, re.S) text_content = ' '.join(jieba.cut(str(text_content_find).replace(" ", ""), cut_all=False)) print(text_content) return text_contenttext_content = get_text_content('danmu.txt')

選取馬保國原版素材視頻,B站上有高清的。

地址:https://www.bilibili.com/video/BV1JV41117hq

參考網上的資料,運行如下代碼即可下載B站視頻

from bilibili_api import video, Verifyimport requestsimport urllib3# 參數verify = Verify("你的SESSDATA值", "你的bili_jct值")# 獲取下載地址download_url = video.get_download_url(bvid="BV1JV41117hq", verify=verify)print(download_url["dash"]["video"][0]['baseUrl'])baseurl = 'https://www.bilibili.com/video/BV1JV41117hq'title = '馬保國'def get_video():urllib3.disable_warnings() headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8' } headers.update({'Referer': baseurl}) res = requests.Session() begin = 0 end = 1024 * 1024 - 1 flag = 0 temp = download_url filename = "./" + title + ".flv" url = temp["dash"]["video"][0]['baseUrl'] while True: headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)}) res = requests.get(url=url, headers=headers, verify=False) if res.status_code != 416: begin = end + 1 end = end + 1024 * 1024 else: headers.update({'Range': str(end + 1) + '-'}) res = requests.get(url=url, headers=headers, verify=False) flag = 1 with open(filename, 'ab') as fp: fp.write(res.content) fp.flush() if flag == 1: fp.close() break print('--------------------------------------------') print('視頻下載完成') filename = "./" + title + ".mp3" url = temp["dash"]["audio"][0]['baseUrl'] while True: headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)}) res = requests.get(url=url, headers=headers, verify=False) if res.status_code != 416: begin = end + 1 end = end + 1024 * 1024 else: headers.update({'Range': str(end + 1) + '-'}) res = requests.get(url=url, headers=headers, verify=False) flag = 1 with open(filename, 'ab') as fp: fp.write(res.content) fp.flush() if flag == 1: fp.close() break print('音頻下載完成')

記得添加SESSDATA和CSRF(bili_jct)的值

/ 02 / PaddleSeg人像分割

基於百度AI Studio的項目,項目地址:

https://aistudio.baidu.com/aistudio/projectdetail/1176398

首先下載解壓安裝PaddleSeg相關依賴包。

# 下載PaddleSeggit clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.gitcd PaddleSeg/# 安裝所需依賴項pip install -r requirements.txt

通常去「GitHub」上下載東西,速度都比較慢,可以使用加速連結。

這裡的fastgit.org一加,下載速度就能從幾十K飆升到幾兆每秒。

# 新建文件夾mkdir work/videosmkdir work/textsmkdir work/mp4_imgmkdir work/mp4_img_maskmkdir work/mp4_img_analysis

新建一些文件夾,主要用來存放相關文件的。

這裡可以將之前爬取到的視頻和音頻放置在videos中。

先對素材視頻進行抽幀,就是獲取視頻每幀的圖片。

def transform_video_to_image(video_file_path, img_path):''' 將視頻中每一幀保存成圖片 ''' video_capture = cv2.VideoCapture(video_file_path) fps = video_capture.get(cv2.CAP_PROP_FPS) count = 0 while (True): ret, frame = video_capture.read() if ret: cv2.imwrite(img_path + '%d.jpg' % count, frame) count += 1 else: break video_capture.release() filename_list = os.listdir(img_path) with open(os.path.join(img_path, 'img_list.txt'), 'w', encoding='utf-8') as file: file.writelines('\n'.join(filename_list)) print('視頻圖片保存成功, 共有 %d 張' % count) return fpsinput_video = 'work/videos/Master_Ma.mp4'fps = transform_video_to_image(input_video, 'work/mp4_img/')

一共是獲取到了564張圖片。

然後使用PaddleSeg將所有的視頻圖片,進行人像分割,生成mask圖片。

# 生成mask結果圖片python 你的路徑/PaddleSeg/pdseg/vis.py \--cfg 你的路徑/work/humanseg.yaml \ --vis_dir 你的路徑/work/mp4_img_mask

使用模型進行預測,其中humanseg.yaml文件是作者提供的,可以進行圖像分割。

預訓練模型deeplabv3p_xception65_humanseg,需下載解壓安裝放在PaddleSeg/pretrained_model下。

由於預訓練模型較大,就不放網盤上了,直接訪問下面這個連結即可下載。

# 下載預訓練模型deeplabv3p_xception65_humanseghttps://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz

記得需要將humanseg.yaml文件中的路徑信息,修改成你自己的路徑。

運行上面那三行命令,最後就會生成564張mask文件。

/ 03 / 詞雲生成

使用stylecloud詞雲庫生成詞雲,使用字體方正蘭亭刊黑。

def create_wordcloud():for i in range(564): file_name = os.path.join("mp4_img_mask/", str(i) + '.png') # print(file_name) result = os.path.join("work/mp4_img_analysis/", 'result' + str(i) + '.png') # print(result) stylecloud.gen_stylecloud(text=text_content, font_path='方正蘭亭刊黑.TTF', output_name=result, background_color="black", mask_img=file_name)

因為stylecloud庫無法自定義詞雲圖片,所以小F修改了它的代碼。

給gen_stylecloud添加了mask_img這個參數,最終作用在gen_mask_array這個函數上。

如此就能將mask圖片轉化成詞雲圖!

將這些詞雲圖片合併成視頻。

def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):''' 合併圖像到視頻 ''' fourcc = cv2.VideoWriter_fourcc(*'mp4v') file_items = [item for item in os.listdir(comb_path) if item.endswith('.png')] file_len = len(file_items) # print(comb_path, file_items) if file_len > 0: print(file_len) temp_img = cv2.imread(os.path.join(comb_path, file_items[0])) img_height, img_width, _ = temp_img.shape out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height)) for i in range(file_len): pic_name = os.path.join(comb_path, 'result' + str(i) + ".png") print(pic_name) if is_print: print(i + 1, '/', file_len, ' ', pic_name) img = cv2.imread(pic_name) out.write(img) out.release()combine_image_to_video('work/mp4_img_analysis/', 'work/mp4_analysis.mp4', 30)

使用ffmpeg對視頻進一步的處理,裁剪+重疊。

# 視頻裁剪ffmpeg -i mp4_analysis_result.mp4 -vf crop=iw:ih/2:0:ih/5 output.mp4# 視頻重疊ffmpeg -i output.mp4 -i viedeos/Master_Ma.mp4 -filter_complex "[1:v]scale=500:270[v1];[0:v][v1]overlay=1490:10" -s 1920x1080 -c:v libx264 merge.mp4# 添加音頻ffmpeg -i merge.mp4 -i videos/Master_Ma.mp4 -c:v copy -c:a copy work/mp4_analysis_result2.mp4 -y# 生成gif圖ffmpeg -ss 00:00:22 -t 3 -i merge.mp4 -r 15 a.gif

ffmpeg的安裝及使用就得靠大夥自己百度啦~

視頻結果如下。

到這裡了,不給小F來個贊嗎,來,炫,來偷吸,我這...

/ 04 / 總結

好了,到此本期的實踐就結束了。

相關代碼及文件已上傳,公眾號回復「馬老師」即可獲取。

感興趣的小夥伴也可以動手試一試。

這裡需要注意,在使用PaddleSeg進行人像分割和生成詞雲圖,這期間耗費的時間比較多,慢慢等就好了。

還有就是可以自己修改一下stylecloud庫的代碼,自定義一下mask_img圖片的大小以及顏色

這兩項小F是沒有修改的,所以生成的圖片是512×512尺寸,導致最後視頻需要裁剪。

顏色主要是將mask圖片變成白底的圖片,小F這裡是黑底的。

可以通過圖片灰度二值化的方法。

import cv2# 灰度圖img = cv2.imread('work/mp4_img_mask/240.png', 0)# 二值化ret, thresh = cv2.threshold(img, 30, 255, cv2.THRESH_BINARY_INV)# 顯示cv2.imshow("img", thresh)# 保存圖片cv2.imwrite('0.png', thresh)cv2.waitKey(0)cv2.destroyAllWindows()

就能得到白底的png圖,符合stylecloud詞雲圖的要求

如此便可以繪製出白底彩色文字的詞雲圖。

相關焦點

  • 「閃電五連鞭」和「耗子尾汁」是什麼?
    作為混元形意太極的掌門人,馬保國和他的「閃電五連鞭」成了近一個月來最熱門的網絡梗之一。何謂「閃電五連鞭」?按照馬老師本人的說法,這是混元形意太極的高階招術之一,全名為「松果彈抖閃電鞭」,施術者要從丹田發力,同時輔以「三維立體混元勁兒」(另一種還沒出教學的高階功法)方才能打出絞勁兒,打出閃電鞭。
  • 年輕人不講武德,竟用Python讓馬老師表演閃電五連鞭!
    看看把老同志欺負的...要不是馬老師講仁義講道德,甩手就是一個五連鞭。哈哈哈,所以本期我們就用Python給馬保國老師做一個閃電五連鞭動態詞雲圖。詞雲數據來自B站,使用stylecloud詞雲庫繪製。這是一個用Python寫的調用Bilibili各種API的庫,範圍涵蓋視頻、音頻、直播、動態、專欄、用戶、番劇等。地址:https://passkou.com/bilibili_api/docs/使用video模塊下面的兩個方法,可以獲取11月每天的視頻彈幕。
  • 王者榮耀:瀾-閃電五連鞭,不是,這真沒有偷學我「馬老師」
    王者榮耀:瀾-閃電五連鞭,不是,這真沒有偷學我「馬老師」
  • 還表演了閃電五連鞭
    還表演了閃電五連鞭世界之大,錢能推磨!近日,馬保國這個名字讓一部分人有了一點印象,馬保國對外自稱是「渾元形意太極門掌門人」,2020年5月17日,馬保國和王慶民在切磋的過程中被三次擊倒,最後被KO,2020年11月15日,馬保國發文回應其視頻被惡搞剪輯一事:望大家明辨是非,馬老已回歸平靜生活,遠離武林是非圈子!
  • 邏輯推理題:究竟誰才是會使「閃電五連鞭」的兇手呢?
    今天小磊就和大家分享1道關於案件的邏輯推理題,各位不妨來試一試,看看你能不能在最短的時間內,推理出究竟誰才是會使「閃電五連鞭」的兇手。並且從現場勘察的結果來看,兇手肯定是一位會使「閃電五連鞭」的高手。經過警方們的排查,甲、乙、丙三人有很大的作案嫌疑。
  • 王者榮耀:有無敵,有位移,還會閃電五連鞭,這個新英雄絕對要買
    文/靜海君 前段時間馬老師的閃電五連鞭火爆全網絡,熱度極高,我真沒想到在王者榮耀裡竟然也有機會能夠打出閃電五連鞭。 司空震的閃電五連鞭 最後我們來重點介紹一下司空震的大招,看看屬於他的閃電五連鞭是什麼樣的。 大招的詳細解讀
  • 馬大師的連五鞭速度太快了,網友:不怕甩飛了?
    朋友們,看動圖吧,今天我們主要說馬保國大師的閃電連五鞭(又稱五連鞭)。看過動圖之後朋友們有什麼感想?是不是覺得馬大師的五連鞭速度太快了,快到手都跟不上他的節奏了?而有網友就調侃:就不怕把手臂甩飛了嗎?說實話,手臂肯定是甩不飛,但是我還真怕大師甩到抽筋。
  • 怎麼科學解讀閃電鞭?年輕人我勸你耗子尾汁,好好反思
    剛才有個師兄問我,kk發生腎麼事了,我一看,噢,原來是佐田,有兩個物理所小編,看了B站鬼畜區馬老師的視頻,塔悶說,kk你能不能教教我怎麼學習馬老師的絕活兒——五連鞭,我說你們光學這個沒用,他們說有用。然後,他們「啪」的一聲就站起來了,很快啊!一個半蹲,另一個開始甩手。
  • 馬保國復出拍電影,隱退一天後宣布拍電影,現場展示閃電五連鞭
    最近網上出來很多關於馬老的各類剪輯視頻,網絡信息很亂,大家要能清晰明辨。這裡是我們對外唯一的窗口平臺,一切信息以此發布為準,謝謝大家。馬老已回歸平靜生活,遠離武林是非圈子,望大家能了解為盼[作揖]!但現在馬保國再次出現,他在一個視頻中宣布自己要參加《少年功夫王》的拍攝,馬保國說:「很多電影公司要求我拍電影也不要去,但是鄭陽導演委託我拍攝。
  • 王者榮耀新英雄:馬老師技能搶先看!
    朋友們好,我是子攸,剛才有個朋友問我馬老師是甚麼技能。那麼今天,子攸就來帶大家看看新英雄馬老師的技能吧。馬老師一共擁有四個技能,馬老師的被動叫做:松果糖豆勁兒。松果糖豆勁兒馬老師天生擁有松果糖豆勁兒,當其打出五鞭時便可激發出松果糖豆勁兒,將技能「五連鞭」強化為「松果糖豆閃電鞭」,同時召喚出夥伴婷婷加入戰鬥,婷婷繼承馬老師所有屬性和裝備效果,持續10秒。
  • 興奮展示升級版「閃電30連鞭」
    甚至有迪廳還以馬保國經典的三鞭、接化發為背景配以勁歌,想像一下你與馬大師一起857還真是毫無違和感,簡直嗨到爆炸。坐擁大量流量的馬保國自然也不會被精明的商人們錯過,在近期馬保國發布的一條視頻中,馬大師就提到:「好多電影公司找我拍電影,但我都沒有去。」
  • 又回來了,馬保國宣布轉行,現場更是大秀閃電五邊鞭
    馬保國又回來了,在宣布退出武林,回歸平靜生活後,僅僅兩三天時間,他便高調宣布進軍娛樂圈,並且在公開場合再次秀起了他的閃電五連鞭,其動作如何,大家可以仔細研究下文章裡面的動態圖。提起馬保國,國人在此之前對這個名字應該說是比較陌生的。
  • 閃電五連鞭什麼梗什麼意思?馬保國閃電五連鞭表情包
    閃電五連鞭什麼梗?閃電五連鞭是近期在各大平臺都非常熱的人物馬保國的自創技法,因為其動作鬼畜而常見於各大視頻素材。那麼閃電五連鞭到底是什麼梗呢?接下來就讓我們一起了解一下吧。馬保國閃電五連鞭什麼梗 一、閃電五連鞭 馬保國在向大家演示了自創的「閃電五連鞭」在展示之前,他先是向大家介紹了「閃電五連鞭」的理論知識,後來就直接上手展示,雖說是展示閃電五連鞭,但大家卻連鞭子都沒有看到,只是他打出來的5個動作。這一番隨意地展示,自然也是遭到了網友們的嘲弄,速度快到連鏡頭都顯得很鬼畜,確實配得上「閃電五連鞭」的稱號。
  • 馬保國為什麼能主宰B站鬼畜區,就憑「接化發」「閃電三鞭」嗎?
    要說現在最洗腦的梗無非就是「接化發」、「年輕人不講武德」、「松果痰抖閃電鞭」等等,這些都和一個叫馬保國的人有關。他在五月份就被人打了,為何現在他還能主宰B站鬼畜區,成為鬼畜全明星?馬保國第一招絕技名為接化發,用他自己的話來解釋就是接勁、化勁、發勁,通俗點講就是先接住對手的進攻,再化解進攻,最後發動進攻,這套武術理念感覺完全就是在說廢話。第二招絕技叫閃電三鞭,看武術名字就知道,講究一個快字。
  • 司空震自帶「閃電五連鞭」,大招變身雙形態,雷電特效堪比白虎志
    變身需要1.5秒,過程無法選中,增加移速,無視地形,變身持續10秒,在這10秒內,司空震各方面都獲得了加強,普攻獲得的能量翻倍,遠程普攻可以觸發連鎖閃電,也是大家所說的自帶「閃電五連鞭」,強化普攻攻擊距離增加,這樣把大招看成一個強化技能,這10秒是司空震最強的時刻。
  • 王者榮耀新英雄司空震曝光,可以操控雷電,大招是閃電五連鞭
    玩法的設計思路是這樣的,司空震可以操控雷電,武器就是五雷震鼓鑲嵌在盔甲上,輸出雷霆之力,將雷電吸入體內,爆發雷霆之力,有非強的AOE能力,從照片裡面也可以看出來,他可以變身,估計是開大招之後會變成另一種形態,好像發狂了一樣。
  • 閃電五連鞭什麼梗?馬保國的自創技法了解一下
    那麼閃電五連鞭到底是什麼梗呢?接下來就讓我們一起了解一下吧。 馬保國閃電五連鞭什麼梗 一   原標題:閃電五連鞭什麼梗?馬保國的自創技法了解一下   閃電五連鞭什麼梗?閃電五連鞭是近期在各大平臺都非常熱的人物馬保國的自創技法,因為其動作鬼畜而常見於各大視頻素材。那麼閃電五連鞭到底是什麼梗呢?接下來就讓我們一起了解一下吧。
  • 馬保國告訴你啥叫功夫,五連鞭送你上天
    是的,馬老師的主要目的是想做桃李滿天下的大師,發展他自創的渾元形意太極門掌門人,使他的武學技藝讓千萬人受益,想來這樣馬老師也能有更多收益。而真正讓馬保國自己風靡天下的舉動則發生前幾個月的一場比賽中,雖然馬老師當時一上場就被搏擊愛好者(不是專業選手喲)ko,但馬老師沒有放棄,屢敗屢戰,成功創下「30秒內連續被擊倒3次」的世界紀錄。如此充滿戲劇張力的比賽,在網絡上很快便引發了大範圍群嘲。
  • 「瀾」還沒坐穩,又一位新英雄要來了,會爆衣,會閃電五連鞭
    根據官方的介紹,這位英雄會爆衣,是一位擁有雙形態的英雄,其技能以閃電為主體,擁有遠近攻擊模式,是一位高頻攻擊英雄,擁有弱控制和較大的AOE範圍。我們可以稱其為「雷電法王」司空震,他擁有較強硬的身板,釋放技能會有護盾,殺手鐧為「閃電五連鞭」。
  • 「一代宗師」馬保國的三大絕技:接化發、三鞭,以及太極總開關
    1、基本功:接化發所謂接化發,用馬保國的話來說就是接勁、化勁、發勁,簡單概括就是先接住對手的進攻,然後化解進攻,最後發力進攻對方。其實在傳統太極拳裡早就有「接化打」的概念,但馬保國把它改良成為了「接化發」,別看只是一字之差,那也是十分巨大的進步!