? ? 老猿Python博文目錄:https://blog.csdn.net/LaoYuanPython ?

一、背景和需求
在《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python圖形影像處理:制作雪花飄落特效》介紹了使用OpenCV制作雪花飄落特效的影像播放的程序,如果要將該功能引入到視頻中,在上面博文的基礎上其實是非常容易的,下面我們就來介紹實作,
二、實作原理
要給視頻加雪花特效,是基于以下原理來實作的:
- 每個視頻都是由一個個視頻幀構成,每個視頻幀都是一副靜態的影像,通過視頻幀的連續顯示形成動態視頻;
- 實作視頻雪花飄落,就是在視頻的每幀影像中添加雪花,并在前后相連的視頻幀中變化雪花的位置,形成雪花下飄帶橫向移動的效果;
- 雪花的圖片本身是一個矩形,矩形內有黑色背景和白色的雪花,在將雪花圖片添加到視頻幀時,需要確保黑色部分不會遮蓋幀影像的內容,只有白色的雪花前景色才可以遮擋幀影像內容,這就需要通過影像的閾值處理確得到雪花影像的二值圖,用該二值圖及其補圖作為掩膜,二值圖作為雪花原始圖片與自身與運算的掩碼來獲取雪花圖片的前景色,補圖作為幀圖片雪花對應位置的子圖與子圖自身與運算的掩膜來獲取雪花黑色背景部分對應的幀影像作為背景色;
- 對視頻幀呼叫雪花融合影像的函式進行動態融合雪花的處理
- Moviepy的fl_image是視頻剪輯基類VideoClip的方法,該方法用于對視頻的幀影像進行變換,其引數包括一個對幀影像進行變換的函式image_func,具體變換由應用實作對影像進行變換處理的一個函式,然后將該函式作為image_func的值參傳入fl_image,Moviepy就會呼叫該函式完成對視頻每幀影像的處理生成新的剪輯
三、具體實作
3.1、實作流程

3.2、關鍵實作
本文的大部分代碼來源于《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python圖形影像處理:制作雪花飄落特效》,小部分進行了調整,增加了視頻生成相關代碼:
3.2.1、將所有雪花物件融合到背景影像
上幀影像中的雪花在當前幀中需要隨機下落一定位置,并在一定幅度內橫向漂移,當有雪花落到影像底部之下時,需要釋放對應物件以節省資源,
addSnowEffectToImg融合雪花到圖片的函式addSnowEffectToImg本文進行了優化,主要是在融合前的生成一排新雪花物件的功能合并到本函式中:
def addSnowEffectToImg(img):
"""
將所有snowObjects中的雪花物件融合放到影像img中,融合時y坐標隨機下移一定高度,x坐標左右隨機小范圍內移動
"""
global snowShapesList,snowObjects
horizontalMaxDistance,verticalMaxDistance = 5,10 #水平方向左右漂移最大值和豎直方向下落最大值
rows,cols = img.shape[:2]
maxObjsPerRow = int(cols/100)
snowObjects += generateOneRowSnows(cols, random.randint(0, maxObjsPerRow))
snowObjectCount = len(snowObjects)
rows,cols = img.shape[0:2]
imgResult = np.array(img)
for index in range(snowObjectCount-1,-1,-1):
imgObj = snowObjects[index] #每個元素為(imgId,x,y)
if imgObj[2]>rows: #如果雪花的起始縱坐標已經超出背景影像的高度(即到達背景影像底部),則該雪花物件需進行失效處理
del(snowObjects[index])
else:
imgSnow = snowShapesList[imgObj[0]]
x,y = imgObj[1:] #取該雪花上次的位置
x = x+random.randint(-1*horizontalMaxDistance,horizontalMaxDistance) #橫坐標隨機左右移動一定范圍
y = y+random.randint(1,verticalMaxDistance) #縱坐標隨機下落一定范圍
snowObjects[index] = (imgObj[0],x,y) #更新雪花物件資訊
imgResult = addImgToLargeImg(imgSnow,imgResult,(x,y),180) #將所有雪花物件影像按照其位置融合到背景影像中
return imgResult #回傳融合影像
3.2.2、實作視頻雪花飄落特效視頻合成
下面的代碼呼叫addSnowEffectToImg實作對《粉絲記事本》視頻的雪花飄落特效:
from moviepy.editor import *
def addVideoSnowEffect(videoFileName,resultFileName):
clip = VideoFileClip(videoFileName)
newclip = clip.fl_image(addSnowEffectToImg, apply_to=['mask'])
newclip.write_videofile(resultFileName)
if __name__ == '__main__':
addVideoSnowEffect(r'f:\video\fansNote.mp4',r'f:\video\fansNote_snow.mp4')
3.3、雪花飄落效果

四、小結
本文介紹了制作視頻雪花飄落特效的原理、實作的思想以及流程,并利用Python+OpenCV+Moviepy提供了關鍵的實作代碼,是一個供大家理解影像融合、Moviepy視頻變換的完整案例,
更多相關moviepy知識的介紹請參考《https://blog.csdn.net/LaoYuanPython/article/details/108184832 Python音視頻剪輯庫MoviePy1.0.3中文教程導覽及可執行工具下載》的導覽式介紹,
寫博不易,敬請支持:
如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!
關于老猿的付費專欄
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt開發圖形界面Python應用》專門介紹基于Python的PyQt圖形界面開發基礎教程,對應文章目錄為《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt開發圖形界面Python應用專欄目錄》;
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音視頻開發專欄 )詳細介紹moviepy音視頻剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,對應文章目錄為《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音視頻開發專欄文章目錄》;
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初學者疑難問題集》為《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形影像處理 》的伴生專欄,是筆者對OpenCV-Python圖形影像處理學習中遇到的一些問題個人感悟的整合,相關資料基本上都是老猿反復研究的成果,有助于OpenCV-Python初學者比較深入地理解OpenCV,對應文章目錄為《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初學者疑難問題集專欄目錄 》
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬蟲入門 》站在一個互聯網前端開發小白的角度介紹爬蟲開發應知應會內容,包括爬蟲入門的基礎知識,以及爬取CSDN文章資訊、博主資訊、給文章點贊、評論等實戰內容,
前兩個專欄都適合有一定Python基礎但無相關知識的小白讀者學習,第三個專欄請大家結合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形影像處理 》的學習使用,
對于缺乏Python基礎的同仁,可以通過老猿的免費專欄《https://blog.csdn.net/laoyuanpython/category_9831699.html 專欄:Python基礎教程目錄)從零開始學習Python,
如果有興趣也愿意支持老猿的讀者,歡迎購買付費專欄,
如果對文章內容存在疑問,可以在博客評論區留言,或關注:老猿Python 微信公號發訊息咨詢,


跟老猿學Python!
? ? 前往老猿Python博文目錄 https://blog.csdn.net/LaoYuanPython ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274493.html
標籤:其他
