SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「crocro.jscam」ライブラリの使い方
――JavaScriptでWebカメラの画像やマーカー情報を取得するライブラリ

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード jscam_1.1.0.zip (60.2 KB)

開発の背景

 ここで少し、「crocro.jscam」の開発の背景について触れておきます。

 去年の春ごろ、JavaでARマーカーを利用したモーションキャプチャーソフトを作って、紙人形ムービーを作っていました。その際、ARToolKitを使っていたのですが、ライセンスの関係からARToolKit互換のARマーカー認識ライブラリが欲しくなり、フルスクラッチで書いて差し替えました。

 このソースコードを整理して、ライブラリとして公開することを当初は考えていたのですが、Javaの基本環境だけでは動かないという問題があり、労力の割には使用者はあまりいなさそうだと思い、計画を途中でやめました。

 その後、去年の秋ごろ、HTML5を触りはじめて、ゲームエンジンを作ったりしていました。その際「これからはJavaScriptがよさそうだ」と思い、HTML5のWebカメラ利用の仕様を調べていたのですが、ほとんどのブラウザで実装されていないことが分かり、その計画もまた消えてしまいました。

 その後、Flashなら簡単にWebカメラの画像が取得でき、FlashとJavaScriptで連携できる仕様もあることに気づき、去年の12月28日にFlex SDKをダウンロードして、Flashの勉強を始めました。

 当初は、Flash側ではWebカメラの画像の取得だけを行う予定だったのですが、2つ問題が発生しました。1つ目は転送速度です。FlashからJavaScriptにデータを転送する際、配列数が大きいと転送時間がかなりかかることが分かりました。2つ目はメモリーです。ChromeやFirefoxでは問題ないのですが、IEでFlashからJavaScriptにデータを転送すると、転送回数分だけ消費メモリーが増大していくことが分かりました。

 そこで仕様を仕切りなおして、リアルタイム処理のほとんどをFlash側で行うようにして、JavaScript側では、必要な情報を指定してコールバックでデータを取得する仕組みに切り替えました。また、フィルター設定を行うことで、Flash側のプログラムをJavaScriptから制御できるようにしました。

 こういった背景で、「crocro.jscam」は作成されました。こういった背景が分かっていると、使う勘所が分かりやすいと思います。

 それではこれから、「crocro.jscam」の使い方を紹介します。また、最後にマーカー認識の簡単な仕組みも解説しておきます。以下、簡単な目次です。

目次
タイトル 内容
シンプルなサンプル Webカメラのキャプチャと、ラベルデータの取得
ゲームコントローラのサンプル Webカメラを使った、方向と強さの入力
全部盛りのサンプル ラジオボタンで機能を切り替え
マーカー認識の仕組み どうやってマーカーを認識しているのか簡単な紹介

シンプルなサンプル

 Webカメラのキャプチャと、ラベルデータの取得を行うシンプルなサンプルです。

 「crocro.jscam」の使い方は、大きな流れを書くと、以下のようになります。

  • 【1】 ライブラリを使い、HTML中にFlashのSWFオブジェクトを書き出す。
  • 【2】 ライブラリを使い、Webカメラの初期化を行う。
  • 【3】★ ライブラリを使い、Webカメラの動作を配列で設定する。
  • 【4】 ライブラリを使い、キャプチャ用のオブジェクトを作成する。
  • 【5】★ キャプチャ用のオブジェクトに、Webカメラから取得するデータの種類を配列で指定する。
  • 【6】 キャプチャ用のオブジェクトに、取得時のコールバック処理を登録する。
  • 【7】 キャプチャ用のオブジェクトで、キャプチャを実行する。

 ポイントとなるのは、【3】と【5】です。この2つの設定で、FlashのWebカメラ機能をコントロールします。

シンプルなサンプル

 それでは実際にソースコードを見てもらいます。それぞれの処理が行われる行が分かるように、数字のラベルをつけています。

シンプルなサンプル
<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>「crocro.jscam」 - サンプル シンプル - クロノス・クラウン</title>
    <script
        type="text/javascript"
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"
    ></script>
    <script type="text/javascript" src="jscam.js"></script>
    <script language="javascript">
        var cap;
        $(document).ready(function() {
            // JSカメラ初期化
            crocro.jscam.initSwfCam();  // ………【2】Webカメラの初期化
            crocro.jscam.setFilter(["bin", "label", "hidePaint"]);
                                        // ………【3】Webカメラの動作を設定
            cap = crocro.jscam.makeCaptureObject("cnvsCap");
                                        // ………【4】キャプチャ用のオブジェクトを作成

            // コールバックの設定
            cap.setBackDataType(["pixelSwf", "labelData"]);
                                        // ………【5】取得するデータの種類を指定
            cap.setExtrFnc(function(resObj){
                                        // ………【6】取得時のコールバック処理を登録
                                        //       【7】キャプチャを実行
                var resArr = [];
                if ("labelData" in resObj) {
                    var ld = resObj.labelData;
                    resArr.push("labelData.length : " + ld.length);
                    for (var i = 0; i < ld.length; i ++) {
                        var s = "";
                        $.each(ld[i], function(k, v) {s += k + ":" + v + ", "});
                        resArr.push("labelData[" + i + "] : " + s);
                    }
                }
                $("#resData").html(resArr.join("<br>"));
            })
        });

        // キャプチャ
        function captureImg() {
            cap.capture();  // キャプチャ
        }
    </script>
</head>
<body bgcolor="#ffffff">

    <div class="boxOut">
        <script language="javascript">
            crocro.jscam.write();  // ………【1】FlashのSWFオブジェクトを書き出す
        </script>
        <br>
        <input type="button" onClick="captureImg()" value="キャプチャ">
        <br>
        <canvas id="cnvsCap" width="320" height="240"></canvas>
        <div id="resData"></div>
    </div>

</body>
</html>
	

 JavaScriptの処理に慣れている人は、それほど難しいソースコードではないと思います。これだけでWebカメラの画像を取得できます。

 簡単に解説すると、[キャプチャ]というボタンを押すと、id cnvsCapcanvas タグの場所にWebカメラの画像が取得されます。また、id resDatadiv タグの場所に、ラベル情報が出力されます。

 setFilter メソッドに ["bin", "label", "hidePaint"] を指定しているので、Flash内では「2値化」と「ラベリング」が行われ、その結果を「非表示」にするという流れで処理が進みます。

 また setBackDataType メソッドに ["pixelSwf", "labelData"] を指定しているので、「SWFオブジェクト全体の画面」と「ラベル・データ」を受け取ります。

 受け取ったデータは、【6】【7】のコールバック関数の引数 resObj の中に格納されます。

次のページ
ゲームコントローラのサンプル

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6393 2012/02/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング