2014年8月2日土曜日

OpenCVでAVIファイル作成をやってみる

多数のPNGなどの画像ファイルから動画ファイルを作成する方法について調べてみた。
ImageMagickとかffmpegとかあるみたいだけどOpenCVやAviSynthを使うのがよさそうだ。
# coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont

font = ImageFont.truetype('Consola.ttf', 24, encoding='utf-8')

def get_size(font, text):
    # フォントのサイズを取得するダミーのImage
    img_tmp = Image.new('RGBA', (128,128))
    draw_tmp = ImageDraw.Draw(img_tmp)

    w,h = draw_tmp.textsize(text, font)
    return (w,h)

w,h = get_size(font, "000")



for idx in range(100):
    # デフォルト背景色の 128x128 サイズのキャンヴァスを用意する。
    img = Image.new('RGB', (128, 128))
    # Draw 関数でオブジェクトを作成。
    draw = ImageDraw.Draw(img)
    # 画面の左上にテキストを描画する
    draw.text((0,1), '{0:03d}'.format(idx), font=font, fill='white')
    ## 画面の右下隅にテキストを描画する。
    #draw.text((128-w-10, 128-h-10), '{0:03d}'.format(idx), font=font, fill='white')
    img.save('{0:03d}.png'.format(idx))
画像の生成は(なんとなく)PILを使ってみる。

そして動画の生成はOpenCVを使ってみる。
# coding: utf-8

import cv2

isColor = 1
fps     = 3  # or 30, frames per second
frameW  = 128 # images width
frameH  = 128 # images height
fourcc  = cv2.cv.CV_FOURCC(*'ULRG')
#fourcc = cv2.VideoWriter_fourcc(*'ULRG')
writer = cv2.VideoWriter("video.avi",fourcc, fps,(frameW,frameH),isColor)

fontface = cv2.FONT_HERSHEY_PLAIN
fontscale = 1.0
color = (255,199,0)
thickness = 1

#-----------------------------
#Writing the video file:
#-----------------------------
nFrames = 100; #number of frames
for i in range(nFrames):
    imgfile = "{0:03d}.png".format(i)
    img = cv2.imread(imgfile) #specify filename and the extension
    
    # ファイル名を描画
    (w,h),baseline = cv2.getTextSize(imgfile, fontface, fontscale, thickness)
    print "w:{0:d} h:{1:d} baseline:{2:d}".format(w,h,baseline)
    cv2.putText(img, imgfile, (thickness,img.shape[0]-baseline), fontface, fontscale, color, thickness, cv2.CV_AA)
    #cv2.line(img, (0,50), (100,50), (255,0,0), 1)
    # add the frame to the video
    writer.write(img)

writer.release()
OpenCVで文字描画する際はcv2.CV_AAを指定しないと汚くて読めたもんじゃないことに注意。 あと、左下に描画しているつもりだけど、計算式が合ってない気がする・・・

0 件のコメント:

コメントを投稿