用Python實現5毛錢特效

一、前言

請務必看到最後。Python牛已經不是一天兩天的事了,但是我開始也沒想到,Python能這麼牛。前段時間接觸了一個批量摳圖的模型庫,而後在一些視頻中找到靈感,覺得應該可以通過摳圖的方式,給視頻換一個不同的場景,於是就有了今天的文章。

我們先看看能實現什麼效果,先來個正常版的,先看看原場景:

用Python實現5毛錢特效

下面是我們切換場景後的樣子:

用Python實現5毛錢特效

看起來效果還是不錯的,有了這個我們就可以隨意切換場景,墳頭蹦迪不是夢。另外,我們再來看看另外一種效果,相比之下要狂放許多:

用Python實現5毛錢特效

二、實現步驟

我們都知道,視頻是有一幀一幀的畫面組成的,每一幀都是一張圖片,我們要實現對視頻的修改就需要對視屏中每一幀畫面進行修改。所以在最開始,我們需要獲取視頻每一幀畫面。

在我們獲取幀之後,需要摳取畫面中的人物。

摳取人物之後,就需要讀取我們的場景圖片了,在上面的例子中背景都是靜態的,所以我們只需要讀取一次場景。在讀取場景之後我們切換每一幀畫面的場景,並寫入新的視頻。

這時候我們只是生成了一個視頻,我們還需要添加音頻。而音頻就是我們的原視頻中的音頻,我們讀取音頻,並給新視頻設置音頻就好了。

具體步驟如下:

讀取視頻,獲取每一幀畫面

批量摳圖

讀取場景圖片

對每一幀畫面進行場景切換

寫入視頻

讀取原視頻的音頻

給新視頻設置音頻

因為上面的步驟還是比較耗時的,所以我在視頻完成後通過郵箱發送通知,告訴我視頻製作完成。

三、模塊安裝

我們需要使用到的模塊主要有如下幾個:


用Python實現5毛錢特效

我們都可以直接用pip安裝:

用Python實現5毛錢特效

其中OpenCV有一些適配問題,建議選取3.0以上版本。

四、具體實現

我們導入如下包:

用Python實現5毛錢特效

其中Pillow和opencv導入的名稱不太一樣,還有就是我自定義的mail模塊。另外我們還要先準備一些路徑:

用Python實現5毛錢特效

接下來我們按照上面說的步驟一個一個實現。

(1)讀取視頻,獲取每一幀畫面

在OpenCV中提供了讀取幀的函數,我們只需要使用VideoCapture類讀取視頻,然後調用read函數讀取幀,read方法返回兩個參數,ret為是否有下一幀,frame為當前幀的ndarray對象。完整代碼如下:

用Python實現5毛錢特效

在標處,我獲取了幀的總數,然後通過如下公式獲取比幀數大的整十整百的數:

用Python實現5毛錢特效

這樣做是為了讓畫面逐幀排序,這樣讀取的時候就不會亂。另外我們獲取了視頻的幀率和分辨率,這兩個參數在我們創建視頻時需要用到。這裡需要注意的是opencv3.0以下版本獲取幀率和畫面大小的寫法有些許差別。

(2)批量摳圖

批量摳圖需要用到paddlehub中的模型庫,代碼很簡單,這裡就不多說了:

用Python實現5毛錢特效

我們執行上面函數後會在項目下生成一個humanseg_output目錄,摳好的圖片就在裡面。

(3)讀取場景圖片

這也是簡單的圖片讀取,我們使用pillow中的Image對象:

用Python實現5毛錢特效

這裡的返回的對象並非ndarray對象,而是Pillow中定義的類對象。

(4)對每一幀畫面進行場景切換

簡單來說就是將摳好的圖片和背景圖片合併,我們知道摳好的圖片都在humanseg_output目錄,這也就是為什麼最開始要準備相應的變量存儲該目錄的原因:

用Python實現5毛錢特效

在標處,我們複製了背景,如果少了這一步的話,生成的就是我們上面的“千手觀音效果”了。

其它步驟都很好理解,只有返回值比較長,我們來詳細看一下:

用Python實現5毛錢特效

最後bgr_im_array就是我們最終的返回結果。

(5)寫入視頻

為了節約空間,我並非等將寫入圖片放在合併場景後面,而是邊合併場景邊寫入視頻:

用Python實現5毛錢特效

上面的代碼也非常簡單,執行完成後項目下會生成一個green.mp4,這是一個沒有音頻的視頻,後面就需要我們獲取音頻然後混流了。

(6)讀取原視頻的音頻

因為在opencv中沒找到音頻相關的處理,所以選用moviepy,使用起來也非常方便:

用Python實現5毛錢特效

然後就是混流了。

(7)給新視頻設置音頻

這裡同樣使用moviepy,傳入視頻名稱和音頻對象進行混流:

用Python實現5毛錢特效

其中output_video是我們在最開始定義的變量。

(8)刪除過渡文件

在我們生產視頻時,會產生許多過渡文件,在視頻合成後我們將它們刪除:

用Python實現5毛錢特效

最後就是將整個流程整合一下。

(8)整合

我們將上面完整的流程合併成一個函數:

用Python實現5毛錢特效

(9)在main中調用

我們可以把前面定義的路徑也放進了:

用Python實現5毛錢特效

這樣我們就完成了完整的流程。

五、發送郵件

郵件的發送又是屬於另外的內容了,我定義了一個mail.py文件,具體代碼如下:


用Python實現5毛錢特效

六、總結

老實說上述程序的效率非常低,不僅佔空間,而且耗時也比較長。在最開始我切換場景選擇的是遍歷圖片每一個像素,而後找到了更加高效的方式取代了。但是幀畫面的保存,和png圖片的存儲都很耗費空間。


七、喜歡可以幫小明轉發此文章哦 轉發後可以私信小明同學:驚喜

,有給你們準備了一點小小的驚喜哦


分享到:


相關文章: