Python调用百度AI实现人像分割详解
程序员文章站
2022-03-07 19:40:19
目录一、原始视频截图二、提取人像三、和背景图合并四、合成视频一、原始视频截图import cv2cap=cv2.videocapture(r"【小仙若】shake it !冬日也要活力满满! (p1....
一、原始视频截图
import cv2 cap=cv2.videocapture(r"【小仙若】shake it !冬日也要活力满满! (p1. shake it).mp4") ret,frame=cap.read() i =0 timef=3 j=0 num=0 while 1: i=i+1 if (i%timef==0): j=j+1 cv2.imwrite("./pictures/"+str(num)+".jpg",frame) num+=1 print("save image:",i) ret,frame=cap.read()
二、提取人像
# -*- coding:utf-8 -*- import cv2 import base64 import numpy as np import os from aip import aipbodyanalysis import time import random app_id = '25365416' api_key = 'ps5cvzzw2ibfly6mkrhue4cw' secret_key = '×××××××××××××××××××××××××' client = aipbodyanalysis(app_id, api_key, secret_key) # 保存图像分割后的路径 path = './mask_img/' # os.listdir 列出保存到图片名称 pics = os.listdir('./pictures') print(pics) for im in pics: # 按顺序构造出图片路径 img = os.path.join("./pictures",im) img1 = cv2.imread(img) height, width, _ = img1.shape # print(height, width) # 二进制方式读取图片 with open(img, 'rb') as fp: img_info = fp.read() # 设置只返回前景 也就是分割出来的人像 res = client.bodyseg(img_info) seg_res = client.bodyseg(img_info) labelmap = base64.b64decode(seg_res['foreground']) file = open('./he/'+im.split(".")[0]+'.png','wb') file.write(labelmap) file.close() print('======== 图像分割完成 ========')
三、和背景图合并
import cv2 import os from pil import image import numpy as np background='1.jpg' def blend_images(fore_image, base_image): """ 将抠出的人物图像换背景 fore_image: 前景图片,抠出的人物图片 base_image: 背景图片 """ # 读入图片 base_image = image.open(base_image).convert('rgb') fore_image = image.open(fore_image).resize(base_image.size) # 图片加权合成 scope_map = np.array(fore_image)[:,:,-1] / 255 scope_map = scope_map[:,:,np.newaxis] scope_map = np.repeat(scope_map, repeats=3, axis=2) res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image)) #保存图片 res_image = image.fromarray(np.uint8(res_image)) res_image.save(os.path.join('./he/',im)) #cv2.imwrite(os.path.join(path1,im), result) # os.listdir 列出保存到图片名称 pics = os.listdir('./he1/') print(pics) for im in pics: img='./he1/'+im blend_images(img, background)
四、合成视频
我的背景图尺寸是3840×2160
# 图片合成视频 import cv2 import os pics = os.listdir('./he/') fourcc = cv2.videowriter_fourcc('x','v','i','d') # 保存格式,参数分别为filename,编码器,帧率,尺寸 out=cv2.videowriter("2.avi",fourcc,10,(3840,2160)) print(pics) for im in pics: # 按顺序构造出图片路径 img = os.path.join("./he/",im) img1 = cv2.imread(img) # 指定编码器 print(img1) # 写入视频 out.write(img1) cv2.imshow("detections", img1) # 注意:尺寸一定要和图像保持一致,否则看不了视频 # 如果想改变保存视频尺寸,应该先把读入的图像的尺寸改变 out.release() cv2.destoryallwindows()
到此这篇关于python调用百度ai实现人像分割详解的文章就介绍到这了,更多相关python人像分割内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: XML轻松学习手册(1)XML快速入门
下一篇: 在Linux系统下进行大文件的切割和合并