(疑似) 手描きの線画スタイルを生成するためのエッジ検出に関する簡単なビデオ チュートリアル

(疑似) 手描きの線画スタイルを生成するためのエッジ検出に関する簡単なビデオ チュートリアル

エフェクト動画デモンストレーション

エッジ検出で作った原神(疑似)線画風PV

エッジ検出で作った(疑似)線画風原神PV

準備

便宜上、最初にコードが配置されているディレクトリに、videos という名前のフォルダーと new という名前のフォルダーを作成します。

ビデオ フレームの抽出

原理は、cv2 を使用してビデオを読み取り、次にフレームごとに imwrite を呼び出して保存することです. パラメータ frameRate (フレーム レート) があり、これは 1 秒あたりのフレーム数を示します。オリジナルなので、ここでその値を1に設定します

import cv2
import os

path = "./videos"
c = 1
for name in os.listdir(path):
    cap = cv2.VideoCapture(os.path.join(path, name))

    frameRate = 1

    while (True):
        ret, frame = cap.read()
        if ret:
            if (c % frameRate == 0):
                print("开始截取视频第:" + str(c) + " 帧")
                # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                cv2.imwrite(os.path.join(path, "%05d" % c + '.jpg'), frame)  # 这里是将截取的图像保存在本地
            c += 1
            cv2.waitKey(0)
        else:
            print("所有帧都已经保存完成")
            break
    cap.release()

抽出後の結果は、各フレームの写真がビデオ フォルダーに保存されることです.
ここに画像の説明を挿入
そのうちの 1 つを開いて見てみましょう.
ここに画像の説明を挿入

エッジ検出と保存

原則は、エッジ検出のためにcv2でCannyを呼び出し、検出結果を保存することです

import cv2
import os
from random import randint
import numpy as np

path = "./videos"
line_color = (0, 0, 0)
bg_color = (255, 255, 255)
cnt = 1
for name in os.listdir(path):

    img=cv2.imread(os.path.join(path, name))
    img1 = np.zeros((img.shape[0], img.shape[1], 3))
    i=cv2.Canny(img,80,120)
    img1[i!=255] = bg_color
    img1[i==255] = line_color
    cv2.imwrite(os.path.join("./new", name), img1)

操作の結果、エッジ検出後の画像が新しいフォルダーに表示されます.
ここに画像の説明を挿入
1 つを開いて見てみましょう.
ここに画像の説明を挿入

画像合成ビデオ

ここで、画像のサイズであるサイズ パラメータに注意する必要があります。画像の上にマウスを移動すると、画像のサイズが表示されます. 同時に、 cv2.VideoWriter の 3 番目のパラメーターはフレーム レートです。これは、元のビデオのフレーム レートを通じて、または次の手順で抽出する音声の長さを設定してみてください。

import numpy as np
import cv2
import os

path = r"./new"
size = (1920, 1080)#这个是图片的尺寸,一定要和要用的图片size一致
#完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
videowrite = cv2.VideoWriter(r'./videos/test.mp4',-1,60,size)#20是帧数,size是图片尺寸
img_array=[]
for filename in os.listdir(path):#这个循环是为了读取所有要用的图片文件

    img = cv2.imread(os.path.join(path, filename))
    if img is None:
        print(filename + " is error!")
        continue
    for i in range(1):
        videowrite.write(img)


videowrite.release()
print('end!')

合成後、音声なしのビデオが得られます
ここに画像の説明を挿入

次に、videos フォルダーの下にある test.mp4 という名前のビデオを別のフォルダーに変更し、元のビデオ ファイルのみを残して冗長な画像を削除し、オーディオを抽出する必要があります。

音声抽出

from moviepy.editor import AudioFileClip
import os

path = r"./videos"
for name in os.listdir(path):
    my=AudioFileClip(os.path.join(path, name))
    my.write_audiofile(os.path.join(path, name.split(".")[-2]+".mp3"))

ビデオとオーディオの統合

編集ソフトやコードで合成することもできますが、動画の元のフレームレートを完全に把握することは不可能であるため、動画と音声の長さをよりよく比較できる編集ソフトを使用して合成することをお勧めします。

終わり

ライブ中のエッジ検出
ここに画像の説明を挿入

エッジ検出で開く: チキン君は美しすぎる

エッジ検出で開く: チキン君は美しすぎる

おすすめ

転載: blog.csdn.net/DuLNode/article/details/127724729