Pythonを使用して、踊る若い女性のワードクラウドビデオを作成します

実装プロセス

1.ビデオを選択してダウンロードします

あなたはあなたを使うことができます-Bilibiliのビデオをローカルエリアにダウンロードするために入手して
ください。詳細については、前の記事を参照してください:ポータル

2.ビデオの弾幕コンテンツを取得します

弾幕のコンテンツをクロールするには、非常に使いやすいサードパーティライブラリであるbilibili_apiをお勧めします。詳細については、公式ドキュメントを参照してください。ポータル
コードは次のとおりです。

from bilibili_api import Verify, video

verify = Verify(sessdata="你的sessdata值的内容", csrf="你的csrf值的内容")
# 参数
BVID = "这里填爬取视频弹幕的BV号"
# 获取视频信息
info = video.get_video_info(bvid=BVID, verify=verify)

# # 假设这里获取 p1 的最新弹幕信息,需要取出 page_id,即每 p 都有自己的编号
page_id = info["pages"][0]["cid"]

# 然后开始获取弹幕
danmakus = video.get_danmaku(bvid=BVID, page_id=page_id)

# 保存弹幕内容
list_all = list()
filename = 'D:/danmu.txt'  # 这里是保存的地址
for dm in danmakus:
    dm = dm.text
    list_all.append(dm)
    # print(list_all)
file = open(filename, 'w', encoding='utf-8')
for i in range(len(list_all)):
    s = str(list_all[i]).replace('[', '').replace(']', '')  # 去除[]
    s = s.replace("'", '').replace(',', '') + '\n'  # 去除单引号,逗号,每行末尾追加换行符
    file.write(s)  # 将列表中数据依次写入文件中
print('弹幕获取完毕!!!')
file.close()

Q:sessdataとcsrfの値を見つける方法は?

A:ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

その中のsessdatabili_jctの内容を見つけます(公式文書には、bili_jctの値はcsrfの値であると記載されています)

注:これらの2つの値はハッキングされる可能性があるため、他の人に公開しないでください(公式文書からのヒント)

結果は次のとおりです。
ここに画像の説明を挿入します

3、ビデオから写真を抽出します

(フレームごとに抽出すると、まだかなりの作業量に
なりますまず、次のコードを使用して、合計で何枚のシートを分割できるかを確認できます。

import cv2
# 查看总共有多少张图片
cap = cv2.VideoCapture(r"这里是下载的视频所在的路径")
num = 1
while True:
    ret, frame = cap.read()
    if ret:
        num += 1
    else:
        break
    print(num)
cap.release()   # 释放资源

えーと、1分以上クロールした動画は2000本以上あります。521番から1314番までの範囲を選択できます。

import cv2
cap = cv2.VideoCapture(r"这里是下载的视频所在的路径")
num = 1
while True:
    # 逐帧读取视频  按顺序保存到本地文件夹
    ret, frame = cap.read()
    if ret:
        if 521 <= num < 1314:
            cv2.imwrite(f"这里填预保存图片文件夹的路径/img_{num}.jpg", frame)   # 保存一帧帧的图片
            print(f'========== 已成功保存第{num}张图片 ==========')
        num += 1
    else:
        break
cap.release()   # 释放资源

結果は次のとおりです。
ここに画像の説明を挿入します

4.ポートレートセグメンテーション(無料のBaidu AIを使用)

まず、ポータルであるBaidu AIを開き、右上隅にあるコンソールをクリックし、携帯電話を使用してコードをスキャンしてログインします。ログインに成功したら左側の列の顔分析をクリックしてアプリケーションを作成します。作成が成功すると、アプリケーションに
ここに画像の説明を挿入します
3つの値が表示されます。これらの3つの値はすぐに使用されます。
次に、Python SDKファイルで顔の分析を確認すると、ファイルリンクポータルは
基本的にそのアプリケーションに精通しています。

最後に、コード上で直接:

from aip import AipBodyAnalysis
import os
import cv2
import base64
import numpy as np
import time
import random

# 百度云中已创建应用的  APP_ID API_KEY SECRET_KEY
APP_ID = '你的APP_ID的值'
API_KEY = '你的API_KEY的值'
SECRET_KEY = '你的SECRET_KEY的值'

client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
# 保存图像分割后的路径
path = '分割后的图像,想要保存的文件夹的路径'
# os.listdir  列出保存到图片名称
img_files = os.listdir('上一步中,保存提取出来的图片的文件夹路径')
# print(img_files)
for num in range(521, 1314):  # 图片范围
    # 按顺序构造出图片路径
    img = f'上一步中,保存提取出来的图片的文件夹路径/img_{num}.jpg'
    img1 = cv2.imread(img)  # imread读取图片
    height, width, _ = img1.shape
    # 二进制方式读取图片
    with open(img, 'rb') as fp:
        img_info = fp.read()
        # 设置只返回前景   也就是分割出来的人像
    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}张图像分割完成 ========')
    time.sleep(random.randint(1, 2))

結果は次のとおりです。
ここに画像の説明を挿入します

5、ワードクラウドの生成

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('存放弹幕内容的文件路径', "rt", encoding="utf-8") as f:
    data = f.read()
# 文本预处理  去除一些无用的字符   只提取出中文出来
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('stopwords.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:
    # 设置停用词并去除单个词
    if word not in stop_words and len(word) > 1:
        result_list.append(word)
# 筛选后统计词频
word_counts = collections.Counter(result_list)
path = '保存词云图片的文件夹路径'

for num in range(521, ):
    img = f'保存分割后的图像的文件夹的路径/mask_{num}.png'
    # 获取蒙版图片
    mask_ = 255 - np.array(Image.open(img))
    # 绘制词云
    plt.figure(figsize=(8, 5), dpi=200)
    my_cloud = WordCloud(
        background_color='black',  # 设置背景颜色  默认是black
        mask=mask_,      # 自定义蒙版
        mode='RGBA',
        max_words=500,
        font_path='simhei.ttf',   # 设置字体  显示中文
    ).generate_from_frequencies(word_counts)

    # 显示生成的词云图片
    plt.imshow(my_cloud)
    # 显示设置词云图中无坐标轴
    plt.axis('off')
    word_cloud_name = path + 'wordcloud_{}.png'.format(num)
    my_cloud.to_file(word_cloud_name)    # 保存词云图片
    print(f'======== 第{num}张词云图生成 ========')

Q:stopwords.txtファイルとは何ですか?

A:固定ファイルですので、ダウンロードしてください。Baidu Netdiskポータル
抽出コード:iits

操作の結果は次のとおりです。
ここに画像の説明を挿入します

ここに画像の説明を挿入します

6、元のビデオのフレームレートと画像サイズを確認します

import cv2
mp4 = cv2.VideoCapture(r"这里是下载的视频所在的路径")  # 读取视频
is_opened = mp4.isOpened()  # 判断是否打开
print(is_opened)
fps = mp4.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
print(fps)
width = mp4.get(cv2.CAP_PROP_FRAME_WIDTH)  # 获取视频的宽度
height = mp4.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 获取视频的高度
print(str(width) + "x" + str(height))
i = 1
time_f = int(fps)

操作の結果は次のとおりです。
ここに画像の説明を挿入します

セブン、コンポジットダンスビデオ

import cv2
import os

# 输出视频的保存路径
video_dir = '保存视频的文件路径'
# 帧率(最好填上一步得到的帧率)
fps = 25
# 图片尺寸(最好填上一步得到的尺寸)
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('词云图片所在的文件路径')

for i in range(521, 1314):
    img_path = '词云图片所在的文件路径/' + 'wordcloud_{}.png'.format(i)
    frame = cv2.imread(img_path)
    frame = cv2.resize(frame, img_size)   # 生成视频   图片尺寸和设定尺寸相同
    videoWriter.write(frame)      # 写进视频里
    print(f'======== 按照视频顺序第{i}张图片合进视频 ========')

videoWriter.release()   # 释放资源

操作の結果は次のとおりです。
ここに画像の説明を挿入します

8.レンダリングするオリジナルのビデオとオーディオを追加します

えーと、数週間前に編集ソフト「ダヴィンチ」を削除したので、Bilibili Cloudクリップを使ってアップロードしました。見たい人は誰でもチェックできます。

ビデオポータル

たぶん、この記事を読んでここを見る人だけがこのビデオを見るでしょう。

9、参照ブログ投稿

参照ブログ投稿:ポータル

おすすめ

転載: blog.csdn.net/qq_44921056/article/details/113922289