python视频处理代码_Python装逼指南——五行代码实现批量抠图,附视频抠图
你是否曾經(jīng)想將某張照片中的人物摳出來(lái),然后拼接到其他圖片上去,從而可以即使你在天涯海角,我也可以到此一游?
專(zhuān)業(yè)點(diǎn)的人使用 PhotoShop 的“魔棒”工具可以摳圖,非專(zhuān)業(yè)人士可以使用各種美圖 APP 來(lái)實(shí)現(xiàn),但是他們畢竟處理能力有限,一次只能處理一張圖片,而且比較復(fù)雜的圖像可能耗時(shí)較久。
今天我來(lái)向大家展示第三種途徑——用 Python 一鍵批量摳圖。
準(zhǔn)備工作
既然要裝逼,準(zhǔn)備工作是少不了的。所謂“站在巨人的肩膀上,做事事半功倍”,我們這里的“巨人”就是 paddlepaddle 了,中文名稱(chēng)叫“飛槳”,那么這個(gè) paddlepaddle 是什么呢?
它是“源于產(chǎn)業(yè)實(shí)踐的開(kāi)源深度學(xué)習(xí)平臺(tái),致力于讓深度學(xué)習(xí)技術(shù)的創(chuàng)新與應(yīng)用更簡(jiǎn)單”,直白點(diǎn)就是我?guī)湍銓?shí)現(xiàn)了深度學(xué)習(xí)底層框架,你只要有創(chuàng)意就可以在我平臺(tái)上運(yùn)用少量簡(jiǎn)單代碼輕松實(shí)現(xiàn)。
它的官網(wǎng)是 https://www.paddlepaddle.org.cn/ 。
它的安裝也比較簡(jiǎn)單,官網(wǎng)首頁(yè)就有安裝指引,我們這里根據(jù)官網(wǎng)的安裝指引,使用 pip 方式來(lái)安裝 CPU 版本。
我們首先執(zhí)行語(yǔ)句:
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安裝成功后,我們?cè)?python 環(huán)境中測(cè)試一下是否安裝成功(這個(gè)也是按照官網(wǎng)指引來(lái)做),我們切換到 python 環(huán)境,運(yùn)行如下代碼:
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) [Clang 6.0 (clang-600.0.57)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import paddle.fluid>>> paddle.fluid.install_check.run_check()Running Verify Paddle Program ... Your Paddle works well on SINGLE GPU or CPU.I0506 21:47:48.657404 2923565952 parallel_executor.cc:440] The Program will be executed on CPU using ParallelExecutor, 2 cards are used, so 2 programs are executed in parallel.W0506 21:47:48.658407 2923565952 fuse_all_reduce_op_pass.cc:74] Find all_reduce operators: 2. To make the speed faster, some all_reduce ops are fused during training, after fusion, the number of all_reduce ops is 1.I0506 21:47:48.658516 2923565952 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1I0506 21:47:48.659137 2923565952 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = TrueI0506 21:47:48.659595 2923565952 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0Your Paddle works well on MUTIPLE GPU or CPU.Your Paddle is installed successfully! Let's start deep Learning with Paddle now>>>
看到 Your Paddle is installed successfully 就表示安裝成功了。
我們接下來(lái)需要使用的是這個(gè)平臺(tái)的 paddlehub 工具,所以我們還需要安裝 paddlehub :
pip install -i https://mirror.baidu.com/pypi/simple paddlehub
安裝完成后,我們就可以開(kāi)始運(yùn)用了。
代碼實(shí)現(xiàn)
我們的實(shí)現(xiàn)步驟很簡(jiǎn)單:導(dǎo)入模塊 -> 加載模型 -> 獲取圖片文件 -> 調(diào)用模塊摳圖。
下面我們看代碼實(shí)現(xiàn):
import os, paddlehub as hubhuseg = hub.Module(name='deeplabv3p_xception65_humanseg') # 加載模型path = './imgs/' # 文件目錄files = [path + i for i in os.listdir(path)] # 獲取文件列表results = huseg.segmentation(data={'image': files}) # 摳圖
我將圖片放在代碼文件夾的同級(jí)目錄 imgs 文件夾下,運(yùn)行代碼后,輸出的摳圖圖片會(huì)自動(dòng)放在代碼同級(jí)目錄的 humanseg_output 目錄下,文件名稱(chēng)跟原圖片的名稱(chēng)相同,但是文件格式是 png 。
我在 imgs 目錄下放了5張圖片,為了便于展示,我將他們放在一起截圖:
運(yùn)行程序后,在 humanseg_output 目錄下生成了5張圖片,同樣的,我將他們放在一起截圖:
我們可以看到程序?qū)⒚繌垐D片中的人物(可以是一個(gè),也可以是多個(gè))識(shí)別出來(lái),并且摳出來(lái)成圖,背景是白色。雖然有些細(xì)節(jié)處還有些許瑕疵,但是看起來(lái)還算不錯(cuò)。
總結(jié):
本文基于 paddlepaddle 平臺(tái),使用簡(jiǎn)單的五行代碼實(shí)現(xiàn)了批量摳圖,不僅解放了好多人的雙手和雙眼,而且為某些程序猿/程序媛的裝逼工具箱提供了一件寶器。下次如果碰到某個(gè)女生或者閨蜜在為摳圖發(fā)愁,別忘了掏出神器,贏得芳心哦!
在視頻創(chuàng)作過(guò)程中,有時(shí)也會(huì)遇到人像摳圖的需求,最一般的做法是使用PR、AE等工具將視頻中的每一幀圖像手動(dòng)摳圖。這么繁瑣的步驟在理工男面前簡(jiǎn)直是不可存在的,那么有什么簡(jiǎn)單的方法能快速摳圖嗎?
當(dāng)然有啦,接下來(lái)給大家介紹如何使用PaddleHub一鍵視頻人像摳圖。
效果展示
首先展示一些摳圖完畢的小片段,上一秒我還在家里的小房間,下一秒我就出現(xiàn)在了土耳其。
那順便去看看埃菲爾鐵塔唄。
到洛杉磯的海邊散散步。
到上海歡樂(lè)谷鍛煉鍛煉身體。
最后到東京的觀景臺(tái)上看個(gè)日落
視頻效果是不是很逼真呢,一天環(huán)游世界不是夢(mèng)哈哈哈……
其實(shí)這些人像素材都是在房間里拍攝,然后使用PaddleHub工具庫(kù)一鍵摳圖,最后使用PR進(jìn)行后期創(chuàng)作的,接下來(lái)介紹下如何操作吧。
這是如何實(shí)現(xiàn)的?
視頻人像摳圖跟上面是類(lèi)似的,只要把視頻的每一幀圖像所含有的人像提取出來(lái),然后加上背景重新合成視頻就可以啦。大體的步驟知道了,那接下來(lái)開(kāi)始實(shí)踐吧。
哦對(duì)了,還得有一段含有人像的素材,小伙伴們可以自己拍攝或者從網(wǎng)絡(luò)搜集。
01
安裝必要組建
需要安裝的是飛槳框架和PaddleHub工具庫(kù),安裝步驟可以參考別再用PS了,我用5行Python代碼就實(shí)現(xiàn)了批量摳圖。或者直接閱讀原文進(jìn)入飛槳官網(wǎng)查看安裝步驟。
02
人像摳圖制作素材
由于目前PaddleHub人像摳圖模型API的輸入是單張圖像的路徑,故需要先將視頻的每一幀圖像分離存儲(chǔ)后才能進(jìn)行摳圖。
當(dāng)然也可以通過(guò)修改模型的源碼,將API的輸入修改成圖像輸入,這樣就省去了視頻分離存儲(chǔ)的步驟,具體的源碼可以參考:
https://aistudio.baidu.com/aistudio/projectdetail/370260,
這里主要介紹前一種方法。
2.1 導(dǎo)入所有相關(guān)模塊
import cv2import osimport numpy as npfrom PIL import Imageimport paddlehub as hub
2.2 將視頻內(nèi)圖像分離存儲(chǔ)
def CutVideo2Image(video_path, img_path):cap = cv2.VideoCapture(video_path) index = 0 while(True): ret,frame = cap.read() if ret: cv2.imwrite(img_path + '%d.jpg' % index, frame) index += 1 else: break cap.release() print('Video cut finish, all %d frame' % index)
該步驟將會(huì)把每一幀圖像保存到本地目錄。
2.3 導(dǎo)入模型進(jìn)行人像摳圖
def GetHumanSeg(frame_path, out_path):# 加載模型 module = hub.Module(name="deeplabv3p_xception65_humanseg") # 配置 test_img_path = [os.path.join(frame_path, fname) for fname in os.listdir(in_path)] input_dict = {"image": test_img_path} results = module.segmentation(data=input_dict, output_dir=out_path) # Tips:使用GPU加速需安裝paddlepaddle-gpu # results = module.segmentation(data=input_dict, use_gpu = gpu, batch_size = 10,output_dir=out_path)
該步驟將會(huì)把人像提取并保存為png至本地
2.4 生成綠幕并與人像合成
為什么要使用綠幕呢,主要是為了后續(xù)在視頻后期軟件里方便使用素材。當(dāng)然熟悉Python的同學(xué)也可以直接使用一些Python模塊進(jìn)行視頻后期。但是在這里還是推薦使用PR、AE這類(lèi)專(zhuān)業(yè)軟件,可以方便地對(duì)素材進(jìn)行縮放、變速、位置處理、以及添加特效等操作。更重要的是,可以對(duì)素材進(jìn)行調(diào)色,與新的背景更好地融合。
def init_canvas(width, height, color=(255, 255, 255)):canvas = np.ones((height, width, 3), dtype="uint8") canvas[:] = color return canvas# 生成綠幕def GetGreenScreen(size, out_path): canvas = init_canvas(size[0], size[1], color=(0, 255, 0)) cv2.imwrite(out_path, canvas)def BlendImg(fore_image, base_image, output_path): """ 將摳出的人物圖像換背景 fore_image: 前景圖片,摳出的人物圖片 base_image: 背景圖片 """ # 讀入圖片 base_image = Image.open(base_image).convert('RGB') fore_image = Image.open(fore_image).resize(base_image.size) # 圖片加權(quán)合成 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(output_path)def BlendHumanImg(in_path, screen_path, out_path): humanseg_png = [filename for filename in os.listdir(in_path)] for i, img in enumerate(humanseg_png): img_path = os.path.join(in_path + '%d.png' % (i)) output_path_img = out_path + '%d.png' % i BlendImg(img_path, screen_path, output_path_img)
該步驟完成后將會(huì)得到類(lèi)似這樣的綠幕圖片:
2.5 視頻合成
def CompVideo(in_path, out_path, size):fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(out_path,fourcc, 30.0, size) files = os.listdir(in_path) for i in range(len(files)): img = cv2.imread(in_path + '%d.png' % i) out.write(img) # 保存幀 out.release()
該步驟完成后即可得到類(lèi)似下圖的人體綠幕素材
2.6 主程序
# ConfigVideo_Path = 'video/0.mp4'Video_Size = (1920, 1080)FrameCut_Path = 'video/frame/'FrameSeg_Path = 'video/frame_seg/'FrameCom_Path = 'video/frame_com/'GreenScreen_Path = 'video/green.jpg'ComOut_Path = 'output.mp4'if __name__ == "__main__":# 第一步:視頻->圖像 if not os.path.exists(FrameCut_Path): os.mkdir(FrameCut_Path) CutVideo2Image(Video_Path, FrameCut_Path) # 第二步:摳圖 if not os.path.exists(FrameSeg_Path): os.mkdir(FrameSeg_Path) GetHumanSeg(FrameCut_Path, FrameSeg_Path) # 第三步:生成綠幕并合成 if not os.path.exists(GreenScreen_Path): GetGreenScreen(Video_Size, GreenScreen_Path) if not os.path.exists(FrameCom_Path): os.mkdir(FrameCom_Path) BlendHumanImg(FrameSeg_Path, GreenScreen_Path, FrameCom_Path) # 第四步:合成視頻 if not os.path.exists(ComOut_Path): CompVideo(FrameCom_Path, ComOut_Path, Video_Size)
OK,綠幕素材都已經(jīng)制作完畢,下一步就可以導(dǎo)入到后期軟件內(nèi)進(jìn)行創(chuàng)作啦,這里以PR為例。
03
后期創(chuàng)作
將綠幕素材和背景素材導(dǎo)入PR,在綠幕素材上使用`超級(jí)鍵`效果,并將主要顏色選取為綠幕的顏色,即可輕松去除綠幕顏色。
再往后的各種騷操作就看各位小伙伴的想象力啦!
這里附上我的作品:[AI人像摳圖]|百度PaddleHub摳圖創(chuàng)意賽[附教程、代碼]:
https://www.bilibili.com/video/BV1cA411b7r2
目前存在的問(wèn)題:
頭發(fā)、手指等細(xì)節(jié)部分還需要進(jìn)一步完善。人體動(dòng)作幅度大導(dǎo)致圖像幀模糊,會(huì)造成提取失敗。模型的API接口有待繼續(xù)豐富。
總結(jié)
以上是生活随笔為你收集整理的python视频处理代码_Python装逼指南——五行代码实现批量抠图,附视频抠图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: B. All the Vowels Pl
- 下一篇: 列举python的5个数据类型_pyth