jscam.jsのソースコード「キャプチャ・オブジェクト」

説明

 「crocro.jscam」は、クロノス・クラウンの柳井政和が開発しているJavaScirptのライブラリです。「crocro.jscam」を使うと、JavaScriptからWebカメラを扱うことができます。また、簡単な図形認識などを行えます。

 このページでは、この「crocro.jscam」のコアになる「jscam.js」(ver 1.1.0)のソースコードのうち、「キャプチャ・オブジェクト」に相当する部分を掲載します。

ソースコード

以下、ソースコードです。

    /**
     *  @variable   crocro.jscam.CaptureObject(id)
     *  @title  キャプチャ・オブジェクト
     *  @description
     *
     *      「crocro.jscam.makeCaptureObject()」で作成します。
     *      Canvasと1対1で対応して、Webカメラのキャプチャ、コールバックなどを行います。
     *
     *  @param  id      canvasのid。
     */
//== キャプチャ・オブジェクト
crocro.jscam.CaptureObject = function(id) {
    /**
     *  @variable   (crocro.jscam.CaptureObject).w
     *  @title  キャプチャ・オブジェクト - 横幅
     *  @description
     *
     *      カメラの横幅(crocro.jscam.option.w)と同じ値です。
     *      指定するキャンバスの横幅は、カメラの横幅(デフォルトは320)と同じ値にしてください。
     */
    /**
     *  @variable   (crocro.jscam.CaptureObject).h
     *  @title  キャプチャ・オブジェクト - 高さ
     *  @description
     *
     *      カメラの高さ(crocro.jscam.option.h)と同じ値です。
     *      指定するキャンバスの高さは、カメラの高さ(デフォルトは240)と同じ値にしてください。
     */
    /**
     *  @variable   (crocro.jscam.CaptureObject).cnvsObj
     *  @title  キャプチャ・オブジェクト - キャンバス・オブジェクト
     *  @description
     *
     *      指定したIDのキャンバスのDOM要素です。
     */
    /**
     *  @variable   (crocro.jscam.CaptureObject).cntxtObj
     *  @title  キャプチャ・オブジェクト - コンテクスト・オブジェクト
     *  @description
     *
     *      指定したIDのキャンバスの、2Dコンテクストです。
     */
    /**
     *  @variable   (crocro.jscam.CaptureObject).cntxtImg
     *  @title  キャプチャ・オブジェクト - イメージ・データ
     *  @description
     *
     *      指定したIDのキャンバスの、2Dコンテクストから、getImageData(0, 0, 横幅, 高さ)したオブジェクトです。
     */
    //== キャンバス用変数の初期化
    this.w = crocro.jscam.option.w;  this.h = crocro.jscam.option.h;  this.c = 4;
    this.cnvsObj = document.getElementById(id);
    this.cntxtObj = this.cnvsObj.getContext("2d");
    this.cntxtImg = this.cntxtObj.getImageData(0, 0, this.w, this.h);
    this.putImg = function(cptr) {      // 画像表示
        var d = this.cntxtImg.data;
        var sz = this.w * this.h;
        var c = this.c;
        for (var i = 0; i < sz; i++) {
            var j = i * c;
            var p = cptr[i];
            d[j    ] = (p >> 16) & 0xFF;
            d[j + 1] = (p >> 8) & 0xFF;
            d[j + 2] = p & 0xFF;
            d[j + 3] = 0xFF;
        }
        this.cntxtObj.putImageData(this.cntxtImg, 0, 0);
    };


    /**
     *  @variable   (crocro.jscam.CaptureObject).setBackDataType(arr)
     *  @title  キャプチャ・オブジェクト - 戻りデータ種類設定
     *  @description
     *
     *      キャプチャ実行時に取得するデータの種類を配列で指定します。
     *      配列の順番は自由です。
     *
     *      データの種類には、以下を指定可能です。
     *      pixelSwf、pixelRaw、pixelBinを指定した場合は、最初に指定した画像がCanvasに描画されます。
     *
     *      <div>pixelSwf - Flash上に描画されている画像の画素配列です。
     *          一次元の配列で、1画素の値は0x000000~0xFFFFFF(RGBが16進数で2桁ずつ)になります。</div>
     *      <div>pixelRaw - Webカメラが取得した画像の画素配列です。
     *          一次元の配列で、1画素の値は0x000000~0xFFFFFF(RGBが16進数で2桁ずつ)になります。</div>
     *      <div>pixelBin - 2値化した画像の画素配列です。事前に2値化がおこなわれている必要があります。
     *          一次元の配列で、1画素の値は0x000000~0xFFFFFF(RGBが16進数で2桁ずつ)になります。</div>
     *      <div>labelData - ラベルの情報が配列で入っています。
     *          各配列はオブジェクトになっており、
     *          tX, tY(上XY)、bX, bY(下XY)、lX, lY(左XY)、rX, rY(右XY)、
     *          cX, cY(中心XY)、cnt(ドット数)といった値が格納されています。</div>
     *      <div>label2dArr - 1画素につき1つの値で画面上のラベルの配置が入っています。
     *          これは一次元の配列です。値が0のマスが地のマスになります。
     *          1以降の値のマスは、その値がラベル番号になっています。</div>
     *      <div>dotsData - ドット・パターンを検出した時の値です。
     *          ltX, ltY(左上XY)rtX, rtY(右上XY)rbX, rbY(右上XY)lbX, lbY(左下XY)、
     *          rtt(判定時に回転させた角度)が入っています。</div>
     *      <div>markerData - マーカーを検出した時の値です。
     *          ltX, ltY(左上XY)rtX, rtY(右上XY)rbX, rbY(右上XY)lbX, lbY(左下XY)、
     *          rtt(判定時に回転させた角度)が入っています。<br>
     *          また、mtchThrshldPer(一致閾値%)、mtchThrshldCnt(一致閾値ドット数)、
     *          mtchCnt(一致数)、mtchMax(一致可能最大数)、mtchPer(一致%)も利用できます。</div>
     *
     *  @param  arr     戻りデータ種類の配列。
     */
    //== 戻りデータ種類設定
    this.backDataTypes = ["pixelSwf"];  // 戻りデータ種類
    this.setBackDataType = function(arr) {
        if (arr instanceof Array) this.backDataTypes = arr;
    }

    //== キャプチャ用変数の初期化
    this.id = id;
    this.callback = "callback" + this.id;
    var my = this;


    /**
     *  @variable   (crocro.jscam.CaptureObject).setExtrFnc(fnc)
     *  @title  キャプチャ・オブジェクト - コールバック終了時の追加処理
     *  @description
     *
     *      キャプチャが終了した際に、常時呼び出されるfunctionオブジェクトを指定します。
     *
     *      指定したfunctionオブジェクトは「function(resObj)」とすることで、
     *      setBackDataTypeで指定したオブジェクトを受け取れます。
     *
     *  @param  fnc     コールバック実行させるfunctionオブジェクト。
     */
    //== コールバック終了時の追加処理
    this.extrFnc = null;
    this.setExtrFnc = function(fnc) {
        this.extrFnc = fnc;
    };

    //== コールバック初期化
    (function() {
        crocro.jscam.CaptureObject[my.callback] = function (arr) {
            // キャンバスへの描画
            for (var i = 0; i < arr.length; i ++) {
                if (typeof arr[i] === "undefined") continue;
                if (arr[i].name == "pixelSwf"
                 || arr[i].name == "pixelRaw"
                 || arr[i].name == "pixelBin"
                ) {
                    my.putImg(arr[i].data);     // 出力
                    break;                      // 1回目のみ描画
                }
            }

            // 戻り値の変換
            var resObj = {};
            for (var i = 0; i < arr.length; i ++) {
                if (typeof arr[i] === "undefined") continue;
                resObj[arr[i].name] = arr[i].data;
            }

            // 追加関数の実行
            if (my.extrFnc)      my.extrFnc(resObj);        // 追加関数
            if (my.onceCallBack) my.onceCallBack(resObj);   // 1回のみのコールバック
            my.onceCallBack = null;
        }
    })()


    /**
     *  @variable   (crocro.jscam.CaptureObject).capture(callBack)
     *  @title  キャプチャ・オブジェクト - コールバック終了時の追加処理
     *  @description
     *
     *      キャプチャを実行します。引数にfunctionオブジェクトを指定した場合は、
     *      一度だけ実行されるコールバック関数になります。
     *      
     *      このfunctionオブジェクトは「function(resObj)」とすることで、
     *      setBackDataTypeで指定したオブジェクトを受け取れます。
     *
     *  @param  callBack        コールバック実行させるfunctionオブジェクト。未指定の場合は無視される。
     */
    //== キャプチャ
    this.onceCallBack = null;
    this.capture = function(callBack) {
        my.onceCallBack = callBack; // コールバックの初期化

        // キャプチャ
        var swfCam = crocro.jscam.swfCam;
        if (! swfCam.enable) return;    // キャプチャ不可
        try {
            if (swfCam.checkEnable()) {
                swfCam.captureCallback( // キャプチャ
                    "crocro.jscam.CaptureObject." + my.callback,
                    my.backDataTypes);
            }
        } catch(e) {}
    };


    /**
     *  @variable   (crocro.jscam.CaptureObject).detect(callBack)
     *  @title  キャプチャ・オブジェクト - 検知
     *  @description
     *
     *      ドットパターンやマーカーを発見すると、コールバックされるようにします。
     *      引数にfunctionオブジェクトを指定した場合は、
     *      一度だけ実行されるコールバック関数になります。
     *
     *      このfunctionオブジェクトは「function(resObj)」とすることで、
     *      setBackDataTypeで指定したオブジェクトを受け取れます。
     *
     *  @param  callBack        コールバック実行させるfunctionオブジェクト。未指定の場合は無視される。
     */
    //== 検知
    this.detect = function(callBack) {
        my.onceCallBack = callBack; // コールバックの初期化

        // 発見
        var swfCam = crocro.jscam.swfCam;
        if (! swfCam.enable) return;    // キャプチャ不可
        try {
            if (swfCam.checkEnable()) {
                swfCam.detectCallback(  // キャプチャ
                    "crocro.jscam.CaptureObject." + my.callback,
                    my.backDataTypes);
                return;
            }
        } catch(e) {}

        // まだ初期化されていない場合は時間を置く(事前に設定する可能性が高い関数なので)
        setTimeout(function(){
            my.detect(callBack);
        }, 200);
    };


    /**
     *  @variable   (crocro.jscam.CaptureObject).outputImage(id, type)
     *  @title  キャプチャ・オブジェクト - 画像の出力
     *  @description
     *
     *      指定したidのDOM要素内に、画像を作成して挿入します。
     *      typeは、pngやjpegなどの、HTML5のcanvasで指定可能な画像形式を指定します。
     *      setBackDataTypeで指定したオブジェクトを受け取れます。
     *
     *  @param  id      画像を出力させるのDOM要素のID。
     *  @param  type    作成する画像の形式。空文字の場合はデフォルトの形式で出力されます。
     */
    //== 画像の出力
    this.outputImage = function(id, type) {
        var imgSrc = this.cnvsObj.toDataURL(type);
        document.getElementById(id).src = imgSrc;
    };
};


    /**
     *  @variable   crocro.jscam.makeCaptureObject(id)
     *  @title  キャプチャー・オブジェクトの作成
     *  @description
     *
     *      指定したidのcanvasに対応したキャプチャー・オブジェクトを作成します。
     *
     *  @param  id      canvasのid。
     *  @return キャプチャー・オブジェクト。
     */
//== キャプチャー・オブジェクトの作成
crocro.jscam.makeCaptureObject = function(id) {
    return new crocro.jscam.CaptureObject(id);
};
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について