利用Python做一個漂亮小姐姐詞云跳舞視頻

導(dǎo)入模塊
下載所需模塊
我們需要下載很多的模塊,所以我們可以使用os.system()方法來自動安裝所需模塊,當(dāng)然也有可能下載失敗,特別是opencv-python,多安裝幾次就好啦.
import?os
import?time
libs?=?{"lxml","requests","pandas","numpy","you-get","opencv-python","pandas","fake_useragent","matplotlib","moviepy"}
try:
????for?lib?in?libs:
????????os.system(f"pip3?install?-i?https://pypi.doubanio.com/simple/?{lib}")
????????print(lib+"下載成功")
except:
????print("下載失敗")
導(dǎo)入模塊
在這里統(tǒng)一先導(dǎo)入所需的模塊
import?os
import?re
import?cv2
import?jieba
import?requests
import?moviepy
import?pandas?as?pd
import?numpy?as?np
from?PIL?import?Image
from?lxml?import?etree
from?wordcloud?import?WordCloud
import?matplotlib.pyplot?as?plt
from?fake_useragent?import?UserAgent
視頻處理
下載視頻
pip?install?you-get
you-get?-i?https://www.bilibili.com/video/BV11C4y1h7nX


視頻分割
代碼展示
#?-*-?coding:utf-8?-*-
import?cv2
cap?=?cv2.VideoCapture(r"無價之姐~讓我乘風(fēng)破浪~~~.flv")
num?=?1
while?1:
????#?逐幀讀取視頻??按順序保存到本地文件夾
????ret,frame?=?cap.read()
????if?ret:
????????cv2.imwrite(f".\pictures\img_{num}.jpg",frame)???
????else:
????????break
cap.release()???#?釋放資源
結(jié)果展示

人像分割
創(chuàng)建應(yīng)用

Python SDK參考文檔
https://cloud.baidu.com/doc/BODY/s/Rk3cpyo93?_=5011917520845

代碼展示
#?-*-?coding:utf-8?-*-
import?cv2
import?base64
import?numpy?as?np
import?os
from?aip?import?AipBodyAnalysis
import?time
import?random
APP_ID?=?'******'
API_KEY?=?'*******************'
SECRET_KEY?=?'********************'
client?=?AipBodyAnalysis(APP_ID,?API_KEY,?SECRET_KEY)
#?保存圖像分割后的路徑
path?=?'./mask_img/'
#?os.listdir??列出保存到圖片名稱
img_files?=?os.listdir('./pictures')
print(img_files)
for?num?in?range(1,?len(img_files)?+?1):
????#?按順序構(gòu)造出圖片路徑
????img?=?f'./pictures/img_{num}.jpg'
????img1?=?cv2.imread(img)
????height,?width,?_?=?img1.shape
????#?print(height,?width)
????#?二進(jìn)制方式讀取圖片
????with?open(img,?'rb')?as?fp:
????????img_info?=?fp.read()
????#?設(shè)置只返回前景???也就是分割出來的人像
????seg_res?=?client.bodySeg(img_info)
????labelmap?=?base64.b64decode(seg_res['labelmap'])
????nparr?=?np.frombuffer(labelmap,?np.uint8)
????labelimg?=?cv2.imdecode(nparr,?1)
????labelimg?=?cv2.resize(labelimg,?(width,?height),?interpolation=cv2.INTER_NEAREST)
????new_img?=?np.where(labelimg?==?1,?255,?labelimg)
????mask_name?=?path?+?'mask_{}.png'.format(num)
????#?保存分割出來的人像
????cv2.imwrite(mask_name,?new_img)
????print(f'========?第{num}張圖像分割完成?========')
結(jié)果展示

彈幕爬取
https://www.bilibili.com/video/BV1jZ4y1K78N
網(wǎng)頁分析

觀察歷史彈幕
清楚元素,展開彈幕列表
日期列表,只有2021年的,點擊其他日期,出來了history請求。

爬取彈幕
構(gòu)造時間序列
import?pandas?as?pd
a?=?pd.date_range("2020-08-08","2020-09-08")
print(a)?
DatetimeIndex(['2020-08-08',?'2020-08-09',?'2020-08-10',?'2020-08-11',
???????????????'2020-08-12',?'2020-08-13',?'2020-08-14',?'2020-08-15',
???????????????'2020-08-50',?'2020-08-17',?'2020-08-18',?'2020-08-19',
???????????????'2020-08-20',?'2020-08-21',?'2020-08-22',?'2020-08-23',
???????????????'2020-08-24',?'2020-08-25',?'2020-08-26',?'2020-08-27',
???????????????'2020-08-28',?'2020-08-29',?'2020-08-30',?'2020-08-31',
???????????????'2020-09-01',?'2020-09-02',?'2020-09-03',?'2020-09-04',
???????????????'2020-09-05',?'2020-09-06',?'2020-09-07',?'2020-09-08'],
??????????????dtype='datetime64[ns]',?freq='D')
爬取數(shù)據(jù)
import?requests
import?pandas?as?pd
import?re
import?csv
from?fake_useragent?import?UserAgent
from?concurrent.futures?import?ThreadPoolExecutor
import?datetime
ua?=?UserAgent()
start_time?=?datetime.datetime.now()
def??Grab_barrage(date):
????headers?=?{
????????"origin":?"https://www.bilibili.com",
????????"referer":?"https://www.bilibili.com/video/BV1jZ4y1K78N?from=search&seid=1084505810439035065",
????????"cookie":?"",
????????"user-agent":?ua.random(),
????}
????params?=?{
????????'type':?1,
????????'oid'?:?"222413092",
????????'date':?date
????}
????r=?requests.get(url,?params=params,?headers=headers)
????r.encoding?=?'utf-8'
????comment?=?re.findall('(.*?) ',?r.text)
????for?i?in?comments:
?????df.append(i)
????a?=?pd.DataFrame(df)
????a.to_excel("danmu.xlsx")
def?main():
????with?ThreadPoolExecutor(max_workers=4)?as?executor:
????????executor.map(Grab_barrage,?date_list)
????"""計算所需時間"""
????delta?=?(datetime.datetime.now()?-?start_time).total_seconds()
????print(f'用時:{delta}s')
if?__name__?==?'__main__':
????#?目標(biāo)url
????url?=?"https://api.bilibili.com/x/v2/dm/history"
????start,end?=?'20200808','20200908'
????date_list?=?[x?for?x?in?pd.date_range(start,?end).strftime('%Y-%m-%d')]
????count?=?0
????main()
結(jié)果展示

生成詞云圖
評論內(nèi)容機(jī)械壓縮去重
def?func(s):
????for?i?in?range(1,int(len(s)/2)+1):
????????for?j?in?range(len(s)):
????????????if?s[j:j+i]?==?s[j+i:j+2*i]:
????????????????k?=?j?+?i
????????????????while?s[k:k+i]?==?s[k+i:k+2*i]?and?k????????????????????k?=?k?+?i
????????????????s?=?s[:j]?+?s[k:]????
????return?s
data["短評"]?=?data["短評"].apply(func)
添加停用詞和自定義詞組
import?pandas?as?pd
from?wordcloud?import?WordCloud
import?jieba
from?tkinter?import?_flatten
import?matplotlib.pyplot?as?plt
jieba.load_userdict("./詞云圖//add.txt")
with?open('./詞云圖//stoplist.txt',?'r',?encoding='utf-8')?as?f:
????stopWords?=?f.read()
生成詞云圖
from?wordcloud?import?WordCloud
import?collections
import?jieba
import?re
from?PIL?import?Image
import?matplotlib.pyplot?as?plt
import?numpy?as?np
with?open('barrages.txt')?as?f:
????data?=?f.read()
jieba.load_userdict("./詞云圖//add.txt")
#?讀取數(shù)據(jù)
with?open('barrages.txt')?as?f:
????data?=?f.read()
jieba.load_userdict("./詞云圖//add.txt")
#?文本預(yù)處理??去除一些無用的字符???只提取出中文出來
new_data?=?re.findall('[\u4e00-\u9fa5]+',?data,?re.S)
new_data?=?"/".join(new_data)
#?文本分詞
seg_list_exact?=?jieba.cut(new_data,?cut_all=True)
result_list?=?[]
with?open('./詞云圖/stoplist.txt',?encoding='utf-8')?as?f:
????con?=?f.read().split('\n')
????stop_words?=?set()
????for?i?in?con:
????????stop_words.add(i)
for?word?in?seg_list_exact:
????#?設(shè)置停用詞并去除單個詞
????if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
#?篩選后統(tǒng)計詞頻
word_counts?=?collections.Counter(result_list)
path?=?'./wordcloud/'
img_files?=?os.listdir('./mask_img')
print(img_files)
for?num?in?range(1,?len(img_files)?+?1):
????img?=?fr'.\mask_img\mask_{num}.png'
????#?獲取蒙版圖片
????mask_?=?255?-?np.array(Image.open(img))
????#?繪制詞云
????plt.figure(figsize=(8,?5),?dpi=200)
????my_cloud?=?WordCloud(
????????background_color='black',??#?設(shè)置背景顏色??默認(rèn)是black
????????mask=mask_,??????#?自定義蒙版
????????mode='RGBA',
????????max_words=500,
????????font_path='simhei.ttf',???#?設(shè)置字體??顯示中文
????).generate_from_frequencies(word_counts)
????#?顯示生成的詞云圖片
????plt.imshow(my_cloud)
????#?顯示設(shè)置詞云圖中無坐標(biāo)軸
????plt.axis('off')
????word_cloud_name?=?path?+?'wordcloud_{}.png'.format(num)
????my_cloud.to_file(word_cloud_name)????#?保存詞云圖片
????print(f'========?第{num}張詞云圖生成?========')
合成視頻
圖片合成
import?cv2
import?os
#?輸出視頻的保存路徑
video_dir?=?'result.mp4'
#?幀率
fps?=?30
#?圖片尺寸
img_size?=?(1920,?1080)
fourcc?=?cv2.VideoWriter_fourcc('M',?'P',?'4',?'V')??#?opencv3.0?mp4會有警告但可以播放
videoWriter?=?cv2.VideoWriter(video_dir,?fourcc,?fps,?img_size)
img_files?=?os.listdir('.//wordcloud')
for?i?in?range(88,?888):
????img_path?=?'.//wordcloud//wordcloud_{}.png'.format(i)
????frame?=?cv2.imread(img_path)
????frame?=?cv2.resize(frame,?img_size)???#?生成視頻???圖片尺寸和設(shè)定尺寸相同
????videoWriter.write(frame)??????#?寫進(jìn)視頻里
????print(f'========?按照視頻順序第{i}張圖片合進(jìn)視頻?========')
videoWriter.release()???#?釋放資源

音頻添加
import?moviepy.editor?as?mpy
#?讀取詞云視頻
my_clip?=?mpy.VideoFileClip('result.mp4')
#?截取背景音樂
audio_background?=?mpy.AudioFileClip('song.mp3').subclip(0,25)
audio_background.write_audiofile('song1.mp3')
#?視頻中插入音頻
final_clip?=?my_clip.set_audio(audio_background)
#?保存為最終的視頻???動聽的音樂!漂亮小姐姐詞云跳舞視頻!
final_clip.write_videofile('final_video.mp4')

結(jié)果展示
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實戰(zhàn)項目?|學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機(jī)器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機(jī)票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!|
年度爆款文案
6).30個Python奇淫技巧集?
點閱讀原文,看200個Python案例!
評論
圖片
表情

