記事のディレクトリ
実装プロセス
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:
その中のsessdataとbili_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、参照ブログ投稿
参照ブログ投稿:ポータル