视频处理系列︱利用达摩院ModelScope进行视频人物分割+背景切换(一)
创始人
2024-05-04 13:51:10
0

做了一个简单的实验,利用modelscope的人像抠图模型对视频流进行抠像并更换背景。


文章目录

  • 1 视频人像抠图(Video human matting)
  • 2 更换背景


1 视频人像抠图(Video human matting)

地址链接:视频人像抠图模型-通用领域
该款模型是window下少数可以使用的,就自己试着玩一下。
视频人像抠图(Video human matting)是计算机视觉的经典任务,输入一个视频(图像序列),得到对应视频中人像的alpha图,其中alpha与分割mask不同,mask将视频分为前景与背景,取值只有0和1,而alpha的取值范围是0到1之间,返回数值代表透明度。VHM模型处理1080P视频每帧计算量为10.6G,参数量只有6.3M。
在这里插入图片描述

在这里插入图片描述

核心代码:

from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasksvideo_matting = pipeline(Tasks.video_human_matting, model='damo/cv_effnetv2_video-human-matting')
result_status = video_matting({'video_input_path':'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/video_matting_test.mp4','output_path':'matting_out.mp4'})
result = result_status[OutputKeys.MASKS]
  • video_input_path 为输入视频的路径,示例代码为线上视频路径,可更改为本地视频路径
  • output_path 为输出视频的本地路径

正常情况下,输出路径会返回人像抠图的mask视频结果,算法result返回的是包含每帧narray格式结果的列表,同时打印字符串'matting process done'

所以这里result输出的都是半成品,如果需要背景更换就需要自己再编辑一下

2 更换背景

笔者自己改编成以下:


import cv2 
#from PIL import Image
#from matplotlib import pyplot as plt
#base_image = Image.open('mask_backaround.jpg')#.convert('RGB')
#base_image.sizedef video_human_segmentation(video_path,out_path,result_msk,\back_pic = "mask_backaround.jpg"):'''video_path:视频链接URLout_path:导出之后的视频链接result_msk:图像mask 序列'''video_input = cv2.VideoCapture(video_path)fps = video_input.get(cv2.CAP_PROP_FPS)fourcc = cv2.VideoWriter_fourcc(*'mp4v')success, frame = video_input.read()h, w = frame.shape[:2]scale = 512 / max(h, w)video_save = cv2.VideoWriter(out_path, fourcc, fps, (w, h))# 背景图back_ori = cv2.imread(back_pic)n = 0while True:if frame is None:breakmask = result_msk[n]n += 1#print(n)# 人像从原图抠出来#mask = mask / 255.0frame[:,:,0] = frame[:,:,0] * mask[:,:,0]  # 有人像的地方有值frame[:,:,1] = frame[:,:,1] * mask[:,:,0]frame[:,:,2] = frame[:,:,2] * mask[:,:,0]# 背景图,把人像部分扣出去back = cv2.resize(back_ori,(w,h))back[:,:,0] = back[:,:,0] * (1 - mask[:,:,0])   # 有人像的地方 = 0back[:,:,1] = back[:,:,1] * (1 - mask[:,:,0])back[:,:,2] = back[:,:,2] * (1 - mask[:,:,0])# 图片加权合成com = cv2.add(back,frame)video_save.write(com)success, frame = video_input.read()video_input.release()video_save.release()return passvideo_path = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/video_matting_test.mp4'
out_path = 'test_3.mp4'video_human_segmentation(video_path,out_path,result_msk,back_pic = "mask_backaround.jpg")

video_human_segmentation做了几件事情,cv2.VideoCapture读取视频流;读入背景图(固定的),在背景图中将人物位置抠出来;在原图把人物抠出来;然后背景图+原图抠图进行合成,最后写出到视频中。
大致效果:
原图:
在这里插入图片描述

背景图:
在这里插入图片描述

合成图:
在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...