01下载视频
首先我们要先准备一个热舞视频,从哪里下载的都可以,我是用You-Get从B站上下载的,命令如下:
you-get url
you-get是第三方库,需要读者用pip进行手动安装,它的更多用法可以看看这篇文章下载全网音视频资源的神器—You-get。
02分割视频
下载好视频后,我们要对其进行分割处理,将其变成一张一张的图片,代码如下:
import cv2 vc = cv2.VideoCapture(r'美女跳舞视频.flv') # 读取视频文件 n = 1# 计数 a, b = vc.read() timeF = 10# 视频帧计数间隔频率 num = 0 while a: # 循环读取视频帧 a, b = vc.read() if (n % timeF == 0): # 每隔timeF帧进行存储操作 num += 1 cv2.imwrite(f'{num}.jpg',b) # 存储为图像 n += 1 cv2.waitKey(1) vc.release()
让我们来看看效果:
03人物抠像
视频现在已经分割成一张一张的图片了,我们要把人物给抠出来,这样方便我们进行词云图绘制。
这里我是借用的百度API进行人物抠像,下面我们来看一下如何使用百度API。
首先,我们先打开百度AI界面,然后点击控制台。
跳转到登陆界面后,输入账号密码后,跳转到管理界面,此时我们点击人体分析。进入到人体分析应用界面。
然后创建一个应用(如已创建好,就点击管理应用)。
创建好后,进入到应用列表中,记下来‘AppID’、‘API Key’、‘Secret Key’这三个参数的值。在后面对API进行调用的时候需要用到这三个参数。
接下来,我们就可以开始调用API了,代码如下:
""" 读取图片 """ def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()image = get_file_content('example.jpg') """ 调用人像分割 """ client.bodySeg(image); """ 如果有可选参数 """ options = {} options["type"] = "labelmap" """ 带参数调用人像分割 """ client.bodySeg(image, options)
我们来看一下效果:
我们使用的代码如下:
APP_ID = '你的APP_ID' API_KEY = '你的API_KEY' SECRET_KEY = '你的SECRET_KEY' client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY) path = r'美女跳舞视频' img_files = os.listdir(r'img') print(img_files) for num in range(2, len(img_files) + 1): img = f'img_{num}.jpg' img_1 = cv2.imread(img) height, width = img_1.shape[:2] 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)
让我们来看看效果,感觉还不错:
04词云绘制
现在人物也出来了,我们可以开始进行词云的绘制了,这里我们使用的是上次从抖音视频上爬取下来的评论,读者也可以替换成自己的评论,代码如下:
for num in range(1,23): with open("comment.txt", 'r') as f: job_title_1 = f.read() contents_cut_job_title = jieba.cut(job_title_1) contents_list_job_title = " ".join(contents_cut_job_title) img = f'mask_{num}.png' mask = 255 - np.array(Image.open(img)) # 相互转化 wc = WordCloud(stopwords=STOPWORDS.add("一个"), collocations=False, background_color="white", font_path=r"K:\msyh.ttc", width=400, height=300, random_state=42, mask=mask ) wc.generate(contents_list_job_title) wc.to_file(f"ciyun_{num}.png")
让我们来看看效果:
05合成视频
词云图做好了,我们现在要将他们合成一个视频,这样就可以实现其跳舞的特效啦,代码如下:
import cv2 video_address = 'tiaowu.mp4'# 输出视频的保存路径 fps = 20# 帧率,可以调整 img_size = (1080, 1920) # 图片的大小 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') videoWriter = cv2.VideoWriter(video_address , fourcc, fps, img_size) for num in range(1,23): img_path = f'ciyun_{num}.png' frame = cv2.resize(cv2.imread(img_path), img_size) videoWriter.write(frame) # 合成视频 videoWriter.release()
06小结
1. 本文详细介绍了如何制作一款跳舞的词云图,有兴趣的读者可以尝试自己动手实验一下。
2. 本文绘制词云图的操作是最基本的,其实还可以更优,有兴趣的读者可以看看这篇文章基于微博评论的文本情感分析与关键词提取的实战案例~。
3. 让词云图绘制在人像中,要让PIL.Image与numpy.array之间进行相互转换。
4. 本文仅供学习参考,不做它用。