python视频处理代码_Python装逼指南——五行代码实现批量抠图,附视频抠图
你是否曾經想將某張照片中的人物摳出來,然后拼接到其他圖片上去,從而可以即使你在天涯海角,我也可以到此一游?
專業點的人使用 PhotoShop 的“魔棒”工具可以摳圖,非專業人士可以使用各種美圖 APP 來實現,但是他們畢竟處理能力有限,一次只能處理一張圖片,而且比較復雜的圖像可能耗時較久。
今天我來向大家展示第三種途徑——用 Python 一鍵批量摳圖。
準備工作
既然要裝逼,準備工作是少不了的。所謂“站在巨人的肩膀上,做事事半功倍”,我們這里的“巨人”就是 paddlepaddle 了,中文名稱叫“飛槳”,那么這個 paddlepaddle 是什么呢?
它是“源于產業實踐的開源深度學習平臺,致力于讓深度學習技術的創新與應用更簡單”,直白點就是我幫你實現了深度學習底層框架,你只要有創意就可以在我平臺上運用少量簡單代碼輕松實現。
它的官網是 https://www.paddlepaddle.org.cn/ 。
它的安裝也比較簡單,官網首頁就有安裝指引,我們這里根據官網的安裝指引,使用 pip 方式來安裝 CPU 版本。
我們首先執行語句:
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安裝成功后,我們在 python 環境中測試一下是否安裝成功(這個也是按照官網指引來做),我們切換到 python 環境,運行如下代碼:
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 就表示安裝成功了。
我們接下來需要使用的是這個平臺的 paddlehub 工具,所以我們還需要安裝 paddlehub :
pip install -i https://mirror.baidu.com/pypi/simple paddlehub
安裝完成后,我們就可以開始運用了。
代碼實現
我們的實現步驟很簡單:導入模塊 -> 加載模型 -> 獲取圖片文件 -> 調用模塊摳圖。
下面我們看代碼實現:
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}) # 摳圖
我將圖片放在代碼文件夾的同級目錄 imgs 文件夾下,運行代碼后,輸出的摳圖圖片會自動放在代碼同級目錄的 humanseg_output 目錄下,文件名稱跟原圖片的名稱相同,但是文件格式是 png 。
我在 imgs 目錄下放了5張圖片,為了便于展示,我將他們放在一起截圖:
運行程序后,在 humanseg_output 目錄下生成了5張圖片,同樣的,我將他們放在一起截圖:
我們可以看到程序將每張圖片中的人物(可以是一個,也可以是多個)識別出來,并且摳出來成圖,背景是白色。雖然有些細節處還有些許瑕疵,但是看起來還算不錯。
總結:
本文基于 paddlepaddle 平臺,使用簡單的五行代碼實現了批量摳圖,不僅解放了好多人的雙手和雙眼,而且為某些程序猿/程序媛的裝逼工具箱提供了一件寶器。下次如果碰到某個女生或者閨蜜在為摳圖發愁,別忘了掏出神器,贏得芳心哦!
在視頻創作過程中,有時也會遇到人像摳圖的需求,最一般的做法是使用PR、AE等工具將視頻中的每一幀圖像手動摳圖。這么繁瑣的步驟在理工男面前簡直是不可存在的,那么有什么簡單的方法能快速摳圖嗎?
當然有啦,接下來給大家介紹如何使用PaddleHub一鍵視頻人像摳圖。
效果展示
首先展示一些摳圖完畢的小片段,上一秒我還在家里的小房間,下一秒我就出現在了土耳其。
那順便去看看埃菲爾鐵塔唄。
到洛杉磯的海邊散散步。
到上海歡樂谷鍛煉鍛煉身體。
最后到東京的觀景臺上看個日落
視頻效果是不是很逼真呢,一天環游世界不是夢哈哈哈……
其實這些人像素材都是在房間里拍攝,然后使用PaddleHub工具庫一鍵摳圖,最后使用PR進行后期創作的,接下來介紹下如何操作吧。
這是如何實現的?
視頻人像摳圖跟上面是類似的,只要把視頻的每一幀圖像所含有的人像提取出來,然后加上背景重新合成視頻就可以啦。大體的步驟知道了,那接下來開始實踐吧。
哦對了,還得有一段含有人像的素材,小伙伴們可以自己拍攝或者從網絡搜集。
01
安裝必要組建
需要安裝的是飛槳框架和PaddleHub工具庫,安裝步驟可以參考別再用PS了,我用5行Python代碼就實現了批量摳圖。或者直接閱讀原文進入飛槳官網查看安裝步驟。
02
人像摳圖制作素材
由于目前PaddleHub人像摳圖模型API的輸入是單張圖像的路徑,故需要先將視頻的每一幀圖像分離存儲后才能進行摳圖。
當然也可以通過修改模型的源碼,將API的輸入修改成圖像輸入,這樣就省去了視頻分離存儲的步驟,具體的源碼可以參考:
https://aistudio.baidu.com/aistudio/projectdetail/370260,
這里主要介紹前一種方法。
2.1 導入所有相關模塊
import cv2import osimport numpy as npfrom PIL import Imageimport paddlehub as hub
2.2 將視頻內圖像分離存儲
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)
該步驟將會把每一幀圖像保存到本地目錄。
2.3 導入模型進行人像摳圖
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)
該步驟將會把人像提取并保存為png至本地
2.4 生成綠幕并與人像合成
為什么要使用綠幕呢,主要是為了后續在視頻后期軟件里方便使用素材。當然熟悉Python的同學也可以直接使用一些Python模塊進行視頻后期。但是在這里還是推薦使用PR、AE這類專業軟件,可以方便地對素材進行縮放、變速、位置處理、以及添加特效等操作。更重要的是,可以對素材進行調色,與新的背景更好地融合。
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) # 圖片加權合成 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)
該步驟完成后將會得到類似這樣的綠幕圖片:
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()
該步驟完成后即可得到類似下圖的人體綠幕素材
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,綠幕素材都已經制作完畢,下一步就可以導入到后期軟件內進行創作啦,這里以PR為例。
03
后期創作
將綠幕素材和背景素材導入PR,在綠幕素材上使用`超級鍵`效果,并將主要顏色選取為綠幕的顏色,即可輕松去除綠幕顏色。
再往后的各種騷操作就看各位小伙伴的想象力啦!
這里附上我的作品:[AI人像摳圖]|百度PaddleHub摳圖創意賽[附教程、代碼]:
https://www.bilibili.com/video/BV1cA411b7r2
目前存在的問題:
頭發、手指等細節部分還需要進一步完善。人體動作幅度大導致圖像幀模糊,會造成提取失敗。模型的API接口有待繼續豐富。
總結
以上是生活随笔為你收集整理的python视频处理代码_Python装逼指南——五行代码实现批量抠图,附视频抠图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B. All the Vowels Pl
- 下一篇: 列举python的5个数据类型_pyth