☞░GoへLaoYuanPythonはhttps://blog.csdn.net/LaoYuanPythonブログ░
I.はじめに
「OpenCV-Pythonの一般的に使用される画像操作:加算、減算、乗算、除算、および電力抽出の対数とビット操作」では、OpenCVの主な画像操作を紹介します。ビデオは1フレームの画像で構成されます。OpenCVとMoviepyを柔軟に使用することで、いくつかの特別な操作を実行できます。特殊効果。この記事では、OpenCV画像操作+ Moviepyを使用してビデオオーバーレイの透明効果を実現する方法を紹介します。
第二に、プログラムが実現されます
このケースでは、回転するビデオまたは回転する画像をビデオに重ね合わせることができる一般的な方法を実装し、コンテンツサイズが異なる2つのビデオの重ね合わせをサポートします。重ね合わせたオブジェクトを画像としてサポートするには、画像を動画に変換する必要があります。画像の内容をできるだけ強調するために、画像を動画に変換する前に、画像の背景色を黒に変換します。
関連するプログラムには、次の機能が含まれます。
- AdjustImgAccordingToRefImg:フレーム生成関数get_frameによって呼び出される、最下層のビデオのサイズを参照して、上層のビデオのサイズを調整します。
- get_frame:重ね合わせる必要のある2つのビデオフレームに基づいて結果のビデオフレームを生成し、adjustImgAccordingToRefImgを呼び出して、生成時に上限のビデオサイズを調整します。
- ridPicBackground:convertPicToVideoによって呼び出される画像の背景色を削除します
- convertPicToVideo:videoOverlyObjMaskによって呼び出される画像をビデオに変換します
- videoOverlyObjMask:オーバーレイオブジェクトのビデオと対応するビデオをオーバーレイし、オーバーレイ時にadjustImgAccordingToRefImgを介して基になるビデオフレームサイズを参照することにより、上部のビデオフレームサイズを調整します
上記の関数の主要な関数はget_frameとvideoOverlyObjMaskです。これらの2つの関数は、ビデオの回転とオーバーレイのメインプログラムコードです。関連するプログラムコードは次のとおりです。
def get_frame(level0Clip,level1Clip,t):
"""
功能:根据两个大小不同的剪辑生成结果剪辑的帧
:param level0Clip: 底层的剪辑,一般要求该剪辑的宽和高度不小于上层剪辑的宽和高,如果超过就只剪裁掉超出范围的边缘部分
:param level1Clip: 上层剪辑,要求该剪辑为黑色的部分不能覆盖底层剪辑的图像
:param t: 帧对应时刻
:return: 新剪辑对应t时刻的合成帧,其图像为上层剪辑非透明部分叠加底层剪辑未被上层非透明部分覆盖部分
"""
img1 = level0Clip.get_frame(t)
img2 = level1Clip.get_frame(t)
if img1.size!=img2.size:#如果两个剪辑大小不同
img2 = adjustImgAccordingToRefImg(img2, img1) #根据底层剪辑的帧大小调整上层剪辑的大小,确保最终两个剪辑大小一致
#取上层剪辑的非透明部分和底层剪辑未被覆盖部分
imgGray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #将上层剪辑帧图像转成灰度图
retval, imgMask = cv2.threshold(imgGray, 1, 255, type=cv2.THRESH_BINARY) #将灰度图二值化作为掩膜
maskInv = cv2.bitwise_not(imgMask) #上层剪辑掩膜求反,用于获取底层剪辑需要显示内容
result = cv2.bitwise_and(img2, img2, mask=imgMask) + cv2.bitwise_and(img1, img1, mask=maskInv)
return result
def videoOverlyRotateObj(videoFName,objType='self',obj=None):
"""
剪辑自身叠加一个该剪辑旋转的层,旋转层黑色的部分不能遮挡下层的剪辑内容
:param videoFName: 剪辑来源视频文件
:param objType、obj:
self:剪辑自身叠加自身旋转内容,obj值忽略
img:图片文件或图片矩阵对象,obj值为图片文件名会图片对象
video:视频文件或剪辑,obj为视频文件名或剪辑对象
:return: 参数视频剪辑自叠加一个旋转层对象,旋转层由参数objType、obj决定,对象大小最好小于videoFName对应视频大小,否则会被裁减
"""
clip = VideoFileClip(videoFName, audio=True)
if objType=='self':
objClip = clip
elif objType=='img':
objClip = convertPicToVideo(obj, duration=clip.duration, createMask=False).set_fps(clip.fps)
elif objType=='video':
if isinstance(obj,str): objClip = VideoFileClip(obj, audio=False)
else: objClip = obj
maskclip = objClip.rotate(angleF,expand=True).fx(vfx.resize,clip.size)
make_frame = lambda t:get_frame(clip,maskclip,t)
newclip = VideoClip( make_frame=make_frame, duration=clip.duration).set_fps(clip.fps)
return newclip
if __name__=='__main__':
result1 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
result1.write_videofile(r"F:\video\WinBasedWorkHard_new.mp4", threads=8)
result2 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4")
result2.write_videofile(r"F:\video\WinBasedWorkHard_mask_self.mp4", threads=8)
result3 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
result3.write_videofile(r"F:\video\WinBasedWorkHard_mask_pic.mp4", threads=8)
result4 = videoOverlyRotateObj(r"F:\video\mydream.mp4", 'video',r"F:\video\WinBasedWorkHard_src.mp4")
result4.write_videofile(r"F:\video\WinBasedWorkHard_mask_video.mp4", threads=8)
有料欄の記事と区別するために、他のマイナーな機能のコードはここでは提供されていません。この記事の対応する有料の列は、「OpenCV Image Operation + Moviepyを使用してビデオオーバーレイを実現する場合」です。
3.ケース効果
3.1。関連資料の紹介
- WinBasedWorkHard_src.mp4:ZhouXingchiの「勝つために戦うのが大好き」MVビブラトビデオ
- mydream.mp4:ZhangJianyingの「MyDream」ビブラトビデオ
- Lotus.jpg:蓮の絵
3.2。クリッピングと自己回転クリップオーバーレイ効果
3.3。ビデオと画像の構成の回転クリップオーバーレイ
3.4。クリップと別の回転クリップオーバーレイ効果
4、まとめ
この記事では、OpenCV画像操作+ Moviepyを使用してビデオオーバーレイを実現するスキームについて詳しく説明します。最終結果クリップの上部クリップと下部クリップを重ね合わせた後、上部クリップの背景色を下部クリップコンテンツに置き換えます。この実装ケースの紹介により、画像処理におけるOpenCV画像操作の役割を理解し、この方法を使用して、複数の編集特殊効果でビデオ特殊効果を作成することができます。
この記事があなたに役立つと思うなら、私が好きで、お気に入りを追加するのを手伝ってください、ありがとう!
OpenCV-Pythonの詳細については、「OpenCV-Pythonグラフィックス画像処理」
列のURLを参照してください:https://blog.csdn.net/laoyuanpython/category_9979286.html
映画の紹介については、「PyQt + moviepyオーディオおよびビデオ編集記事ディレクトリ」または「Moviepyオーディオおよびビデオ開発コラム」を参照してください。これら2つの列の内容に関するガイダンスについては、「Pythonオーディオおよびビデオ編集ライブラリMoviePy1.0.3中国語チュートリアルガイドおよび実行可能ツールのダウンロード」を参照してください。
この記事の対応する有料の列は、「OpenCV Image Operation + Moviepyを使用してビデオオーバーレイを実現する場合」です。
古い猿についての有料コラム
Lao Yuanの有料コラム「PyQtを使用したグラフィカルインターフェースPythonアプリケーションの開発」(https://blog.csdn.net/laoyuanpython/category_9607725.html)では、PythonベースのPyQtグラフィカルインターフェース開発の基本的なチュートリアルと、有料コラム「映画のようなオーディオとビデオの開発」を具体的に紹介しています。コラム」(https://blog.csdn.net/laoyuanpython/category_10232926.html)では、映画のようなオーディオとビデオの編集と合成の関連する方法と、関連する編集と合成のシーンを処理するための関連する方法の使用について詳しく紹介しています。どちらのコラムも特定のシーンに適しています。基本的なPythonを持っているが、関連する知識がない初心者の読者は学びます。
有料コラム記事ディレクトリ:「moviepyオーディオおよびビデオ開発コラム記事ディレクトリ」(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、「PyQtを使用してグラフィカルインターフェイスPythonアプリケーションコラムディレクトリを開発する」(https:// blog.csdn.net/LaoYuanPython/article/details/107580932)。
Pythonの基礎が不足している場合は、Lao Yuanの無料のコラム「Column:Python Basic Tutorial Directory」(https://blog.csdn.net/laoyuanpython/category_9831699.html)からPythonを最初から学ぶことができます。
Old Apeの読者に興味があり、喜んでサポートする場合は、有料のコラムを購入することを歓迎します。