<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做一個(gè)漂亮小姐姐詞云跳舞視頻

          共 7026字,需瀏覽 15分鐘

           ·

          2021-12-10 11:32

          大家好,我是 Jack。

          最近不少小伙伴在學(xué) Python,想找個(gè)好玩的練手項(xiàng)目。

          那今天分享一個(gè),簡(jiǎn)單,適合新手的 Python 小項(xiàng)目。

          作者:北山啦

          blog.csdn.net/qq_45176548

          以下是原文:


          本文將以嗶哩嗶哩–乘風(fēng)破浪視頻為例,you-get下載視頻。

          同時(shí)利用 python 爬取 B 站視頻彈幕,并利用 opencv 對(duì)視頻進(jìn)行分割,百度 AI 進(jìn)行人像分割,moviepy 生成詞云跳舞視頻,并添加音頻。

          導(dǎo)入模塊

          下載所需模塊

          我們需要下載很多的模塊,所以我們可以使用os.system()方法來(lái)自動(dòng)安裝所需模塊,當(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 張圖片來(lái)做詞云。

          opencv中通過(guò)VideoCaptrue類對(duì)視頻進(jìn)行讀取操作以及調(diào)用攝像頭

          代碼展示

          #?-*-?coding:utf-8?-*-
          import?cv2
          cap?=?cv2.VideoCapture(r"無(wú)價(jià)之姐~讓我乘風(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)建一個(gè)人像分割的應(yīng)用。

          Python SDK參考文檔

          利用參考文檔,來(lái)進(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è)置只返回前景???也就是分割出來(lái)的人像
          ????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)
          ????#?保存分割出來(lái)的人像
          ????cv2.imwrite(mask_name,?new_img)
          ????print(f'========?第{num}張圖像分割完成?========')

          結(jié)果展示

          彈幕爬取

          由于技術(shù)原因,我們改為此視頻來(lái)獲取彈幕,哈哈哈哈哈。

          https://www.bilibili.com/video/BV1jZ4y1K78N

          網(wǎng)頁(yè)分析

          通過(guò)F12,找到pagelist,通過(guò)原始url,找到cid

          觀察歷史彈幕

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

          • 日期列表,只有2021年的,點(diǎn)擊其他日期,出來(lái)了history請(qǐng)求。

          爬取彈幕

          構(gòu)造時(shí)間序列

          該視頻發(fā)布于2020-08-09,本文爬取該視頻2020-08-08到2020-09-08日的歷史彈幕數(shù)據(jù),構(gòu)造出時(shí)間序列:

          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)
          ????"""計(jì)算所需時(shí)間"""
          ????delta?=?(datetime.datetime.now()?-?start_time).total_seconds()
          ????print(f'用時(shí):{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é)果展示

          生成詞云圖

          評(píng)論內(nèi)容機(jī)械壓縮去重

          對(duì)于一條評(píng)論來(lái)說(shuō),有些人可能手誤,或者湊字?jǐn)?shù),會(huì)出現(xiàn)將某個(gè)字或者詞語(yǔ),重復(fù)說(shuō)多次,因此在進(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["短評(píng)"]?=?data["短評(píng)"].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ù)處理??去除一些無(wú)用的字符???只提取出中文出來(lái)
          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è)置停用詞并去除單個(gè)詞
          ????if?word?not?in?stop_words?and?len(word)?>?1:
          ????????result_list.append(word)

          #?篩選后統(tǒng)計(jì)詞頻
          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è)置詞云圖中無(wú)坐標(biāo)軸
          ????plt.axis('off')
          ????word_cloud_name?=?path?+?'wordcloud_{}.png'.format(num)
          ????my_cloud.to_file(word_cloud_name)????#?保存詞云圖片
          ????print(f'========?第{num}張?jiān)~云圖生成?========')

          合成視頻

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

          圖片合成

          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會(huì)有警告但可以播放
          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)
          #?保存為最終的視頻???動(dòng)聽的音樂!漂亮小姐姐詞云跳舞視頻!
          final_clip.write_videofile('final_video.mp4')

          結(jié)果展示


          ·················END·················

          推薦閱讀

          ?? ?這臉啊,我算是玩明白了?? ?我的第一個(gè),一百萬(wàn)????AI殺瘋了

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  www.性欧美 | 自慰影院| 国产精品青青草原 | 婷婷综合龙物精品国产 | 豆花av免费观看 访问页面亚洲日韩 |