Quantcast
Channel: okahiro | Okahiro's Gadget Lab
Viewing all articles
Browse latest Browse all 40

ラズパイでストップモーション・アニメをサクッと作ってみた。

$
0
0

今回もRaspberry Piネタです。ラズパイで「ひつじのショーン」のようなストップモーション・アニメーションを簡単に作成できるスクリプトをPythonで作成してみました。

とはいえ一から作るのも大変なので、またしてもよそ様のスクリプトを拝借してちょっといじるだけです。

参考サイト(?)は以下です。

https://gist.github.com/snim2/255151

まず、ハードウェアの構成ですが、ラズパイ2にUSB接続のWecCam(ELECOM UCAM-C0220FB)をつなぐだけです。

単純に静止画を撮影して保存するだけなら、fswebcamというアプリを入れて使えばいいんですが、これだと撮影前のプレビューを見ながら撮影することができません。(撮影が完了したファイルを開くことしかできない。)

代替案としてはcheeseというアプリを入れて使うことも考えられますが、ちょっと動作が重いですしあまりスマートではありません。ラズパイの純正カメラモジュールであれば手軽にプレビューしながら撮影できるのですが、今回は普通のWebCamですのでちょっと工夫が必要です。

というわけで、最初に紹介した参考サイトのコードを利用させてもらうことにします。このコードではpygameを利用して、うまいことプレビューしながら静止画を撮影しています。

これだけでもまぁ良いのですが、ファイル名が固定なので連続撮影すると前のファイルに上書きされてしまいますので、ファイル名を自動で変更する仕組みが必要です。これにはdatetimeを利用して、撮影時の日時をファイル名にするように加工しました。

また、撮影時にシャッター音が鳴った方が分かりやすいので、wavファイルを再生するようにしました。シャッター音のするwavファイルなら何でもいいんですが、例えば以下のYouTubeのリンクにあるcamera_shutter.wavを作業ディレクトリに保存してください。

で、以上のような加工を施したスクリプトが以下です。

import pygame
import pygame.camera
from pygame.locals import *
from datetime import datetime
import subprocess

DEVICE = '/dev/video0'
SIZE = (640, 480)

def shutter_sound():
    cmd = 'aplay camera_shutter.wav'
    subprocess.call(cmd, shell=True)
    
def camstream():
    pygame.init()
    pygame.camera.init()
    display = pygame.display.set_mode(SIZE, 0)
    camera = pygame.camera.Camera(DEVICE, SIZE)
    camera.start()
    screen = pygame.surface.Surface(SIZE, 0, display)
    capture = True
    while capture:
        screen = camera.get_image(screen)
        display.blit(screen, (0,0))
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == QUIT:
                capture = False
            elif event.type == KEYDOWN and event.key == K_s:
                shutter_sound()
                timestamp = datetime.now().isoformat()
                pygame.image.save(screen,  timestamp + ".png")
    camera.stop()
    pygame.quit()
    return

if __name__ == '__main__':
    camstream()

これを実行しているのが下のスクショです。画面右下にpygameによるプレビュー画像が見えます。キーボードのKとSを同時に押すと撮影されます。カメラの前の人形などを少しづつ動かしながら静止画をどんどん撮影していきます。

2016-09-28-213027_1920x1080_scrot

撮影が完了したら作業ディレクトリで以下のコマンドを実行します。(ImageMagickというパッケージの機能を利用しています。もし入っていなければapt-get installしてください。)これは、自動的に日時の若い順にPNGファイルをつなげて一つのアニメーションGIFファイルを生成するコマンドです。

convert -delay 50 -loop 0 *.png animated.gif

そして、今回私が以上のツールを使用して作成してみたのが以下のGIFアニメです。

animated

いたって簡単に作成できました。

まぁこの手のアプリはWindowsなどでいくらでもあるようなのですが、ラズパイと普通のWebCamという限られた制約の中で実現したことに多少の意義があるかと。(;^ω^)
(20160929追記:stopmotionという優れたパッケージを見つけました。いますぐapt-get installです!)

今日のところはこの辺で。☕️


Viewing all articles
Browse latest Browse all 40