OpenCV で画像を動画にして保存する

OpenCV で画像を動画にするには、writer = cv2.VideoWriter(outfile, fmt, frame_rate, size) で writer を作り、writer.write(write_frame) で画像を書き込んでいけば良い。writer に渡すべきパラメータがいくつかあるので、それぞれ設定する必要がある。

作成した動画

試しに葉の色を変える動画を作った。画像の一部分の色を変えながら、保存した。

コード

コードは下記。色を変える部分の表記(mkimg 関数周辺)が多めで乱雑になってしまったが、「# サイズを取得」より下の部分のコードが動画編集に関わる部分だ。

import cv2
import sys
import numpy as np

# 画像を加工する
def mkimg(img,param):
    rc1 = np.array([[0.6, 0. , 0.1],
                    [0. , 0.6, 0.1],
                    [0. , 0. , 0.8]])
    rc2 = np.array([[0.6, 0.1, 0. ],
                    [0. , 0.8, 0. ],
                    [0. , 0.1, 0.5]])
    rc = rc1 * param + rc2 * (1. - param)
    imgr = bgrtune(img,rc)
    mask = mkmask(img,90,120,0,255,0,255)
    img2 = img * (mask/255) + imgr * (1-mask/255)
    
    return ct(img2)

# HSV情報からmaskを作成
def mkmask(img,hmin,hmax,smin,smax,vmin,vmax):
    h,s,v = np.float32(cv2.split(cv2.cvtColor(img,cv2.COLOR_BGR2HSV)))  # 色空間をBGRからHSVに変換
    mask = (cv2.inRange(h,hmin,hmax)/255) \
         * (cv2.inRange(s,smin,smax)/255) \
         *  cv2.inRange(v,vmin,vmax)
    return cv2.cvtColor(ct(mask), cv2.COLOR_GRAY2BGR)

# 行列でBGRを編集する
def bgrtune(img,rc):
    img2 = np.dot(np.float32(img) , rc)
    return ct(img2)

# 値を0-255にclipして、typeをuint8にする                                                 
def ct(img):
    return np.clip(img,0,255).astype(np.uint8)

file_name = sys.argv[1]
img = cv2.imread(file_name)

# サイズを取得
height, width, channels = img.shape[:3]
size = (width, height)
print(size)

# 動画保存用
frame_rate = 2 #あまり動かさない
outfile = file_name.replace(".JPG",".out.mp4")
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
writer = cv2.VideoWriter(outfile, fmt, frame_rate, size)

frame_count = 30
for i in range(frame_count):
    print("frame=",i)
    write_frame = mkimg(img,(i*1.)/frame_count)
    writer.write(write_frame)
    cv2.imshow("Frame", write_frame)

    # qキーが押されたら途中終了
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

writer.release()
cv2.destroyAllWindows()

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)