python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)
一、前言
請務(wù)必看到最后。Python牛已經(jīng)不是一天兩天的事了,但是我開始也沒想到,Python能這么牛。前段時間接觸了一個批量摳圖的模型庫,而后在一些視頻中找到靈感,覺得應(yīng)該可以通過摳圖的方式,給視頻換一個不同的場景,于是就有了今天的文章。
我們先看看能實(shí)現(xiàn)什么效果,先來個正常版的,先看看原場景:
下面是我們切換場景后的樣子:
看起來效果還是不錯的,有了這個我們就可以隨意切換場景,墳頭蹦迪不是夢。另外,我們再來看看另外一種效果,相比之下要狂放許多:
光理論是不夠的,在此送大家一套2020Pyhon學(xué)習(xí)手冊(第4版)、Python開發(fā)技術(shù)詳解鏈接、PYTHON網(wǎng)絡(luò)爬蟲從入門到實(shí)踐、Python爬蟲開發(fā)與項(xiàng)目實(shí)戰(zhàn), 私信小編“學(xué)習(xí)”來免費(fèi)獲取吧,希望大家一起進(jìn)步哦!
二、實(shí)現(xiàn)步驟
我們都知道,視頻是有一幀一幀的畫面組成的,每一幀都是一張圖片,我們要實(shí)現(xiàn)對視頻的修改就需要對視屏中每一幀畫面進(jìn)行修改。所以在最開始,我們需要獲取視頻每一幀畫面。
在我們獲取幀之后,需要摳取畫面中的人物。
摳取人物之后,就需要讀取我們的場景圖片了,在上面的例子中背景都是靜態(tài)的,所以我們只需要讀取一次場景。在讀取場景之后我們切換每一幀畫面的場景,并寫入新的視頻。
這時候我們只是生成了一個視頻,我們還需要添加音頻。而音頻就是我們的原視頻中的音頻,我們讀取音頻,并給新視頻設(shè)置音頻就好了。
具體步驟如下:
讀取視頻,獲取每一幀畫面
批量摳圖
讀取場景圖片
對每一幀畫面進(jìn)行場景切換
寫入視頻
讀取原視頻的音頻
給新視頻設(shè)置音頻
因?yàn)樯厦娴牟襟E還是比較耗時的,所以我在視頻完成后通過郵箱發(fā)送通知,告訴我視頻制作完成。
三、模塊安裝
我們需要使用到的模塊主要有如下幾個:
我們都可以直接用pip安裝:
其中OpenCV有一些適配問題,建議選取3.0以上版本。
在我們使用paddlehub之前,我們需要安裝paddlepaddle:具體安裝步驟可以參見官網(wǎng)。用paddlehub摳圖參考:別再自己摳圖了,Python用5行代碼實(shí)現(xiàn)批量摳圖。我們這里直接用pip安裝cpu版本的:
有了這些準(zhǔn)備工作就可以開始我們功能的實(shí)現(xiàn)了。
四、具體實(shí)現(xiàn)
我們導(dǎo)入如下包:
其中Pillow和opencv導(dǎo)入的名稱不太一樣,還有就是我自定義的mail模塊。另外我們還要先準(zhǔn)備一些路徑:
接下來我們按照上面說的步驟一個一個實(shí)現(xiàn)。
(1)讀取視頻,獲取每一幀畫面
在OpenCV中提供了讀取幀的函數(shù),我們只需要使用VideoCapture類讀取視頻,然后調(diào)用read函數(shù)讀取幀,read方法返回兩個參數(shù),ret為是否有下一幀,frame為當(dāng)前幀的ndarray對象。完整代碼如下:
在標(biāo)處,我獲取了幀的總數(shù),然后通過如下公式獲取比幀數(shù)大的整十整百的數(shù):
1|frame_name = math.pow(10, len(frame_num))
這樣做是為了讓畫面逐幀排序,這樣讀取的時候就不會亂。另外我們獲取了視頻的幀率和分辨率,這兩個參數(shù)在我們創(chuàng)建視頻時需要用到。這里需要注意的是opencv3.0以下版本獲取幀率和畫面大小的寫法有些許差別。
(2)批量摳圖
批量摳圖需要用到paddlehub中的模型庫,代碼很簡單,這里就不多說了:
我們執(zhí)行上面函數(shù)后會在項(xiàng)目下生成一個humanseg_output目錄,摳好的圖片就在里面。
(3)讀取場景圖片
這也是簡單的圖片讀取,我們使用pillow中的Image對象:
這里的返回的對象并非ndarray對象,而是Pillow中定義的類對象。
(4)對每一幀畫面進(jìn)行場景切換
簡單來說就是將摳好的圖片和背景圖片合并,我們知道摳好的圖片都在humanseg_output目錄,這也就是為什么最開始要準(zhǔn)備相應(yīng)的變量存儲該目錄的原因:
在標(biāo)處,我們復(fù)制了背景,如果少了這一步的話,生成的就是我們上面的“千手觀音效果”了。
其它步驟都很好理解,只有返回值比較長,我們來詳細(xì)看一下:
最后bgr_im_array就是我們最終的返回結(jié)果。
(5)寫入視頻
為了節(jié)約空間,我并非等將寫入圖片放在合并場景后面,而是邊合并場景邊寫入視頻:
上面的代碼也非常簡單,執(zhí)行完成后項(xiàng)目下會生成一個green.mp4,這是一個沒有音頻的視頻,后面就需要我們獲取音頻然后混流了。
(6)讀取原視頻的音頻
因?yàn)樵趏pencv中沒找到音頻相關(guān)的處理,所以選用moviepy,使用起來也非常方便:
然后就是混流了。
(7)給新視頻設(shè)置音頻
這里同樣使用moviepy,傳入視頻名稱和音頻對象進(jìn)行混流:
其中output_video是我們在最開始定義的變量。
(8)刪除過渡文件
在我們生產(chǎn)視頻時,會產(chǎn)生許多過渡文件,在視頻合成后我們將它們刪除:
最后就是將整個流程整合一下。
(9)整合
我們將上面完整的流程合并成一個函數(shù):
(10)在main中調(diào)用
我們可以把前面定義的路徑也放進(jìn)了:
這樣我們就完成了完整的流程。
五、發(fā)送郵件
郵件的發(fā)送又是屬于另外的內(nèi)容了,我定義了一個mail.py文件,具體代碼如下:
里面的郵箱我是直接寫死了,大家可以自由發(fā)揮。為了方便,推薦發(fā)件人使用163郵箱,收件人使用QQ郵箱。另外在登錄的時候直接使用密碼比較方便,但是有安全隱患。最后送大家一套2020最新Pyhon學(xué)習(xí)手冊(第4版)、Python開發(fā)技術(shù)詳解鏈接、PYTHON網(wǎng)絡(luò)爬蟲從入門到實(shí)踐、Python爬蟲開發(fā)與項(xiàng)目實(shí)戰(zhàn), 私信小編“學(xué)習(xí)”來免費(fèi)獲取吧,希望大家一起進(jìn)步哦!
六、總結(jié)
老實(shí)說上述程序的效率非常低,不僅占空間,而且耗時也比較長。在最開始我切換場景選擇的是遍歷圖片每一個像素,而后找到了更加高效的方式取代了。但是幀畫面的保存,和png圖片的存儲都很耗費(fèi)空間。
另外程序設(shè)計(jì)還是有許多不合理的地方,像是ndarray對象和Image的區(qū)分度不高,另外有些函數(shù)選擇傳入路徑,而有些函數(shù)選擇傳入文件對象也很容易讓人糊涂。最后說一下,我們用上面的方式不僅可以做靜態(tài)的場景切換,還可以做動態(tài)的場景切換,這樣我們就可以制作更加豐富的視頻。當(dāng)然,效率依舊是個問題。
感謝大家閱讀,喜歡就關(guān)注一下小編,感謝你們,記得轉(zhuǎn)發(fā),收藏^_^
總結(jié)
以上是生活随笔為你收集整理的python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想台式机网卡驱动_【装机帮扶站】第33
- 下一篇: android 渠道号_亲测:安卓打渠道