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()
コメント