連載
» 2008年12月17日 00時00分 公開

やっと出た! 公式版のProcessingを動画で確認しよう絵心がなくても簡単に絵が描けるProcessing(最終回)(2/3 ページ)

[田中孝太郎,collisions.doppac.cc]

外部ライブラリを使用する方法

 Processingのプログラムで外部ライブラリを使用する場合、ライブラリのアーカイブを展開したフォルダを所定のライブラリフォルダ()にインストールした後、プログラムの最初でライブラリの使用を宣言する必要があります(通常のJavaでのimport文と同様です)。ライブラリが正しくインストールされていれば、Processingエディタのメニュー[Sketch]→[Import Library...]からライブラリが選択できるようになり、選択することでプログラムの冒頭にライブラリ宣言行を追加できます。

外部ライブラリのインストールフォルダは、Processing 1.0のバージョンアップに伴い従来のProcessingインストールフォルダから「Sketchbook」フォルダ(Mac OS Xならば「書類」フォルダ内、Windowsならば「マイドキュメント」フォルダ内の、「Processing」フォルダ)に変更されました。前バージョンの方法に慣れている方は注意してください。

Videoライブラリを使ってみよう

 それでは実際に外部ライブラリを使用したプログラミングを始めてみましょう。まず今回はVideoライブラリを使用して、USBカメラ映像を取り込むサンプルを紹介します。

import processing.video.*;  // Videoライブラリの読み込み

Capture cam;  // USBカメラを制御するCaptureクラスを使う

void setup() {
    size(400, 400);  // 画面サイズを設定

    // 画面と同じサイズ、30フレームでカメラ動画を取り込み開始
    cam = new Capture(this, width, height, 30);  
}

// カメラのフレーム取り込み完了イベントの関数
void captureEvent(Capture cam) {
    cam.read();  // カメラ画像を読み込み
}

void draw() {
    image(cam, 0, 0);  // カメラ画像を画面に描画
}

※Windows版Processingを使用する際の注意

 Windows版ProcessingでVideoライブラリを使用する場合は、QuickTimeとWinVDIGドライバ(1.0.1)のインストールが必要となります。詳しくはVideoライブラリのページを参照してください。

 現在WinVDIGの公式サイトがサポートされない状態となっているため(ミラーサイトからダウンロード自体は可能になっています)、WinVDIGを必要としないカメラライブラリ「JMyron」を使用するサンプルも用意しました。場合によってはこちらを参考にしてください。


 シンプルにUSBカメラの動画を画面に表示するサンプルですが、プログラムも非常にシンプルに書けることが分かります。Videoライブラリに含まれているカメラを制御するクラス「Capture」はフレーム画像を読み込むことで、通常の画像クラス(PImage)と同様に画面に表示したり、ピクセル操作を行えます。このサンプルではdraw関数(前回記事で説明したように、プログラム実行中に決められたフレームレートで繰り返し呼び出されるメインループ関数です)で画像を画面に描画するimage命令でカメラ画像を画面にそのまま描画しているわけです。

 プログラムに少し手を加えてみましょう。今度はカメラ画像をピクセル単位で扱うようにします。

<前半は上記のソースコードと同じです>

void draw() {
    loadPixels();  // pixels配列を読み出し

    for(int i=0 ; i < 10 ; i++) {

        // Y座標をランダムに決定
        int rndY = int(random(height));

        // X座標方向の1列のピクセルを画面に描画  
        for(int x = 0 ; x < width ; x++) {

            // pixelsの位置を計算(※1)  
            int pos = rndY * width + x;

            // 画像のピクセル(色)を画面上の同じ位置に保存(※2)       
            pixels[pos] = cam.pixels[pos]; 
        }
    }
    updatePixels();  // 書き換えたpixels配列を画面に反映
}

JMyron版サンプル
video_sample2_jmyron.pde


 実際にカメラを使って実行したサンプル動画をご覧ください。動画の映像がライン単位で更新されるのが分かると思います。

 カメラ画像をピクセル単位で扱うソースコードでは「loadPixels」「updatePixels」という命令が使用されています。これらはProcessingで画面のピクセル処理を開始し、それを実際の画面に反映するための命令です。ピクセル処理を開始し反映するタイミングを命令で明示することで、高速なピクセル処理を実現しています。

 loadPixelsを実行すると、「pixels」というグローバル変数の配列に、画面全体のピクセル(色)情報が読み込まれます。今回のサンプルのようにdraw関数の最初でloadPixelsを実行すれば、pixels配列に読み込まれるのは前回のdraw関数の実行で描画されたフレームの最終状態です。注意が必要なのはpixels配列がラインごとのピクセル情報を直列にした1次元配列として読み込まれるため、画面の任意のX、Y座標の点をpixels配列で指定するためには(※1)行のような計算で求める必要があります。

 そしてランダムに決めたY座標の画面左端から右端までの1ラインのピクセル情報を、現在のUSBカメラのキャプチャ画像の同じラインのピクセル情報に書き換える処理を行っています。loadPixels命令は画面の状態をpixelsに読み込むのに加えて、プログラムで使用されている画像オブジェクトのピクセル情報もオブジェクトのpixels変数として読み込む仕組みになっているため、(※2)行のように特別な指定なしにキャプチャ画像のピクセル情報を「cam.pixels」として指定できます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。