利用Python做一个漂亮女生词云跳舞视频「建议收藏」

利用Python做一个漂亮女生词云跳舞视频「建议收藏」利用Python做一个漂亮小姐姐词云跳舞视频。实现思路:1.下载视频2.获取弹幕内容3.从视频中提取图片4.利用百度AI进行人像分割5.小姐姐跳舞词云生成6.合成跳舞视频7.视频插入音频B站上的漂亮的小姐姐真的好多好多,利用you-get大法下载了一个B站上跳舞的小姐姐视频,利用视频中的弹幕来制作一个漂亮小姐姐词云跳舞视频,一起来看看吧。

大家好,又见面了,我是你们的朋友全栈君。

一、前言

""" @公众号 : AI庭云君 @Author : 叶庭云 @CSDN : https://yetingyun.blog.csdn.net/ """

利用Python做一个漂亮女生词云跳舞视频「建议收藏」

B站上的漂亮的小姐姐真的好多好多,利用 you-get 大法下载了一个 B 站上跳舞的小姐姐视频,利用视频中的弹幕来制作一个漂亮小姐姐词云跳舞视频,一起来看看吧。

二、实现思路

1. 下载视频

安装 you-get 库

pip install you-get -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

利用 you-get 下载 B 站视频到本地
视频链接:https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619

you-get -i https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619
you-get -o 本地保存路径 视频链接 

利用Python做一个漂亮女生词云跳舞视频「建议收藏」

利用Python做一个漂亮女生词云跳舞视频「建议收藏」

更多 you-get 大法的详细使用,可以参考官方文档:
https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E

利用Python做一个漂亮女生词云跳舞视频「建议收藏」
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

2. 获取弹幕内容

python 爬虫,解析网页、提取弹幕数据保存到txt,注意构造 URL 参数和伪装请求头。

导入需要的依赖库

import requests
import pandas as pd
import re
import time
import random
from concurrent.futures import ThreadPoolExecutor
import datetime
from fake_useragent import UserAgent

# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
start_time = datetime.datetime.now()

爬取弹幕数据

def  Grab_barrage(date):
    # 伪装请求头
    headers = { 
   
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-site",
        "accept-encoding": "gzip",
        "origin": "https://www.bilibili.com",
        "referer": "https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619",
        "user-agent": ua.random,
        "cookie": "chage to your cookies"
    }
    # 构造url访问 需要用到的参数 爬取指定日期的弹幕
    params = { 
   
        'type': 1,
        'oid': '206344228',
        'date': date
    }
    # 发送请求 获取响应
    response = requests.get(url, params=params, headers=headers)
    # print(response.encoding) 重新设置编码
    response.encoding = 'utf-8'
    # print(response.text)
    # 正则匹配提取数据 转成集合去除重复弹幕
    comment = set(re.findall('<d p=".*?">(.*?)</d>', response.text))
    # 将每条弹幕数据写入txt
    with open('bullet.txt', 'a+') as f:
        for con in comment:
            f.write(con + '\n')
            print(con)
    time.sleep(random.randint(1, 3))   # 休眠

主函数

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 -----------> 弹幕数据成功保存到本地txt')

主函数调用

if __name__ == '__main__':
    # 目标url
    url = "https://api.bilibili.com/x/v2/dm/history"
    start = '20201201'
    end = '20210128'
    # 生成时间序列
    date_list = [x for x in pd.date_range(start, end).strftime('%Y-%m-%d')]
    print(date_list)
    count = 0
    # 调用主函数
    main()

结果如下:

利用Python做一个漂亮女生词云跳舞视频「建议收藏」
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

3. 从视频中提取图片

经过实践发现,这个视频完整分离出图片来有 3347 张,本文截取 800 张图片来做词云。

import cv2

# ============================ 视频处理 分割成一帧帧图片 =======================================
cap = cv2.VideoCapture(r"beauty.flv")
num = 1
while True:
    # 逐帧读取视频 按顺序保存到本地文件夹
    ret, frame = cap.read()
    if ret:
        if 88 <= num < 888:
            cv2.imwrite(f"./pictures/img_{ 
     num}.jpg", frame)   # 保存一帧帧的图片
            print(f'========== 已成功保存第{ 
     num}张图片 ==========')
        num += 1
    else:
        break
cap.release()   # 释放资源

结果如下:
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

4. 利用百度AI进行人像分割

创建一个人像分割的应用,记住你的AppID、API Key、Secret Key,后面会用到。
利用Python做一个漂亮女生词云跳舞视频「建议收藏」
查看人像分割的 Python SDK 文档,熟悉它的基本使用。

利用Python做一个漂亮女生词云跳舞视频「建议收藏」

# -*- coding: UTF-8 -*-
""" @公众号 : AI庭云君 @Author : 叶庭云 @CSDN : https://yetingyun.blog.csdn.net/ @百度AI :https://ai.baidu.com/tech/body/seg """

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

# 利用百度AI的人像分割服务 转化为二值图 有小姐姐身影的蒙版
# 百度云中已创建应用的 APP_ID API_KEY SECRET_KEY
APP_ID = '23485847'
API_KEY = 'VwGY053Y1A8ow3CFBTFrK0Pm'
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(88, len(img_files) + 1):
    # 按顺序构造出图片路径
    img = f'./pictures/img_{ 
     num}.jpg'
    img1 = cv2.imread(img)
    height, width, _ = img1.shape
    # print(height, width)
    # 二进制方式读取图片
    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))

结果如下:
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

5. 小姐姐跳舞词云生成

# -*- coding: UTF-8 -*-
""" @公众号 : AI庭云君 @Author : 叶庭云 @CSDN : https://yetingyun.blog.csdn.net/ """
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('bullet.txt') 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('stop_words.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 = './wordcloud/'

for num in range(88, 888):
    img = f'./mask_img/mask_{ 
     num}'
    # 获取蒙版图片
    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}张词云图生成 ========')

结果如下:
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

6. 合成跳舞视频

# -*- coding: UTF-8 -*-
""" @公众号 : AI庭云君 @Author : 叶庭云 @CSDN : https://yetingyun.blog.csdn.net/ """
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)   # 生成视频 图片尺寸和设定尺寸相同
    videoWriter.write(frame)      # 写进视频里
    print(f'======== 按照视频顺序第{ 
     i}张图片合进视频 ========')

videoWriter.release()   # 释放资源

效果如下:
利用Python做一个漂亮女生词云跳舞视频「建议收藏」

7. 视频插入音频

漂亮小姐姐跳舞那么好看,再加上自己喜欢的背景音乐,岂不美哉。

# -*- coding: UTF-8 -*-
""" @公众号 : AI庭云君 @Author : 叶庭云 @CSDN : https://yetingyun.blog.csdn.net/ """
import moviepy.editor as mpy

# 读取词云视频
my_clip = mpy.VideoFileClip('result.mp4')
# 截取背景音乐
audio_background = mpy.AudioFileClip('song.mp4').subclip(17, 44)
audio_background.write_audiofile('vmt.mp3')
# 视频中插入音频
final_clip = my_clip.set_audio(audio_background)
# 保存为最终的视频 动听的音乐!漂亮小姐姐词云跳舞视频!
final_clip.write_videofile('final_video.mp4')

结果如下:

漂亮小姐姐词云跳舞

三、结语

最后安利一份 Python 全栈知识图谱:

  • 全栈知识:100+核心知识点
  • 系统化:六大模块,全链路梳理。
  • 专业化:8位专家耗时100天打造
  • 精选材质:250G铜版纸,双面哑模。
    利用Python做一个漂亮女生词云跳舞视频「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151324.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • zabbix监控网络设备

    zabbix监控网络设备终工作中遇到,办公网有防火墙和交换机,要监控一下他们的流量。可以通过zabbix来做。从整个操作过程来看,主要有两个难点。监控的原理是,zabbix模板里用自带的OID,去交换机上获得值,因此,我们要开启交换机上的snmp,另外要拿到相关监控项的OID值。再去zabbix上添加监控模板就可以了。开启交换机的snmp功能这里不做介绍,因为不是我开的,所以这部分以后补充。下面先介绍如何获得…

  • java 判断对象是否为空的工具类_如何判断java对象是否为空「建议收藏」

    java 判断对象是否为空的工具类_如何判断java对象是否为空「建议收藏」首先来看一下工具StringUtils的判断方法:一种是org.apache.commons.lang3包下的;另一种是org.springframework.util包下的。这两种StringUtils工具类判断对象是否为空是有差距的:StringUtils.isEmpty(CharSequencecs);//org.apache.commons.lang3包下的StringUtils类,判…

  • java中的getAttribute和getParameter

    java中的getAttribute和getParameterjava中的getAttribute和getParameter

  • vue(22)Vuex的安装与使用

    vue(22)Vuex的安装与使用前言每一个Vuex应用的核心就是store(仓库)。store基本上就是一个容器,它包含着你的应用中大部分的状态(state)。Vuex和单纯的全局对象有以下两点不同:Vuex的状态存

  • linux常用命令50个_docmd常用命令详解

    linux常用命令50个_docmd常用命令详解1. find基本语法参数如下:find[PATH][option][action]#与时间有关的参数:-mtimen:n为数字,意思为在n天之前的“一天内”被更改过的

  • wuauclt1.exe mshta.exe 病毒清理

    wuauclt1.exe mshta.exe 病毒清理现象:系统xp,开机1小时以后还不能打开应用,从“事件查看器”来看是困在wuauclt.exec:\windows\system32\wuauclt1.exe在删除后就又出现了使用360急救后,上述文件仍然删除后就又出现了下载 Tweaking.com-WindowsRepair1.7.5 Author:Tweaking.comDate:2012-06

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号