<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7644字,需瀏覽 16分鐘

           ·

          2022-01-03 03:44

          最近不少小伙伴在學(xué) Python,想找個好玩的練手項目。
          那今天分享一個,簡單,適合新手的 Python 小項目。
          以下是具體項目:

          本文將以嗶哩嗶哩–乘風(fēng)破浪視頻為例,you-get下載視頻。
          同時利用 python 爬取 B 站視頻彈幕,并利用 opencv 對視頻進(jìn)行分割,百度 AI 進(jìn)行人像分割,moviepy 生成詞云跳舞視頻,并添加音頻。

          導(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

          視頻處理

          下載視頻

          從B站視頻下載舞蹈視頻。
          可以使用 you-get,用它可以下載視頻,先安裝:
          pip?install?you-get
          找到想要下載視頻的連接,使用如下指令,就可以下載:
          you-get?-i?https://www.bilibili.com/video/BV11C4y1h7nX
          標(biāo)有 DEFAULT 為默認(rèn)畫質(zhì)。
          下載完的視頻。

          視頻分割

          使用opencv,將視頻的分隔為圖片,本文截取 800 張圖片來做詞云。
          opencv中通過VideoCaptrue類對視頻進(jìn)行讀取操作以及調(diào)用攝像頭

          代碼展示

          #?-*-?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)用

          利用百度AI,創(chuàng)建一個人像分割的應(yīng)用。

          Python SDK參考文檔

          利用參考文檔,來進(jìn)行人像分割。
          參考文檔:
          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é)果展示

          彈幕爬取

          由于技術(shù)原因,我們改為此視頻來獲取彈幕,哈哈哈哈哈。
          https://www.bilibili.com/video/BV1jZ4y1K78N

          網(wǎng)頁分析

          通過F12,找到pagelist,通過原始url,找到cid

          觀察歷史彈幕

          • 清楚元素,展開彈幕列表

          • 日期列表,只有2021年的,點擊其他日期,出來了history請求。

          爬取彈幕

          構(gòu)造時間序列

          該視頻發(fā)布于2020-08-09,本文爬取該視頻2020-08-08到2020-09-08日的歷史彈幕數(shù)據(jù),構(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ù)

          添加cookie,修改oid即可
          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ī)械壓縮去重

          對于一條評論來說,有些人可能手誤,或者湊字?jǐn)?shù),會出現(xiàn)將某個字或者詞語,重復(fù)說多次,因此在進(jìn)行分詞之前,需要做“機(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}張詞云圖生成?========')

          合成視頻

          如官方文檔所介紹的,moviepy是一個用于視頻編輯Python庫,可以切割、拼接、標(biāo)題插入,視頻合成(即非線性編輯),進(jìn)行視頻處理和自定義效果的設(shè)計。總的來說,可以很方便自由地處理視頻、圖片等文件。

          圖片合成

          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()???#?釋放資源
          結(jié)果展示:

          音頻添加

          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行代碼做了一個語音壁紙切換器天天看小姐姐!


          年度爆款文案


          點閱讀原文,看200個Python案例!

          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男女免费av | 黑人操欧美人 | 欧美淫秽视频免费看 | 国产三级无码视频 | 精品秘 无码一区二区三区老师 |