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);
};







