サンプル 基本 - ソースコード
説明
「crocro.jscam」は、クロノス・クラウンの柳井政和が開発しているJavaScirptのライブラリです。「crocro.jscam」を使うと、JavaScriptからWebカメラを扱うことができます。また、簡単な図形認識などを行えます。
このページでは、この「crocro.jscam」のサンプルである「サンプル 基本」のソースコードを掲載します。
- 動作を確認する:サンプル 基本
ソースコード
以下、ソースコードです。
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>「crocro.jscam」 - サンプル 基本 - クロノス・クラウン</title>
<script
type="text/javascript"
src="https://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();
cap = crocro.jscam.makeCaptureObject("cnvsCap");
// コールバックの設定
cap.setBackDataType(["pixelSwf", "pixelRaw", "pixelBin",
"labelData", "label2dArr", "dotsData", "markerData"]);
cap.setExtrFnc(function(resObj){ // 各戻り値ごとの処理
var resArr = [];
if ("pixelSwf" in resObj) {
resArr.push("pixelSwf : " + resObj.pixelSwf.length);
}
if ("pixelRaw" in resObj) {
resArr.push("pixelRaw : " + resObj.pixelRaw.length);
}
if ("pixelBin" in resObj) {
resArr.push("pixelBin : " + resObj.pixelBin.length);
}
if ("label2dArr" in resObj) {
resArr.push();
resArr.push("<hr>label2dArr : " + resObj.label2dArr.length
+ " (16ドットずつスキップさせてラベルを表示)");
var miniMtrxArr = [];
for (var y = 0; y < cap.h; y += 16) {
var miniMtrx = "";
for (var x = 0; x < cap.w; x += 16) {
var p = y * cap.w + x;
var i = resObj.label2dArr[p];
miniMtrx += (i < 10 ? "0" : "") + i + " ";
}
miniMtrxArr.push(miniMtrx);
}
resArr.push(miniMtrxArr.join("<br>"));
}
if ("labelData" in resObj) {
var ld = resObj.labelData;
resArr.push("<hr>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);
}
}
if ("dotsData" in resObj) {
var s = "";
var dd = resObj.dotsData;
$.each(dd, function(k, v) {s += k + ":" + v + ", "});
s += "<br>"
s += "lt(" + dd.ltX + ", " + dd.ltY + ") / "
+ "rt(" + dd.rtX + ", " + dd.rtY + ")<br>";
s += "lb(" + dd.lbX + ", " + dd.lbY + ") / "
+ "rb(" + dd.rbX + ", " + dd.rbY + ")";
resArr.push("<hr>dotsData : " + s);
}
if ("markerData" in resObj) {
var s = "";
var md = resObj.markerData;
$.each(md, function(k, v) {s += k + ":" + v + ", "});
s += "<br>"
s += "lt(" + md.ltX + ", " + md.ltY + ") / "
+ "rt(" + md.rtX + ", " + md.rtY + ")<br>";
s += "lb(" + md.lbX + ", " + md.lbY + ") / "
+ "rb(" + md.rbX + ", " + md.rbY + ")";
resArr.push("<hr>markerData : " + s);
}
$("#resData").html(resArr.join("<br>"));
})
// 検出
cap.detect(function() {
alert("最初の検出!");
});
// ドット・パターンの設定
viewDots();
// マーカーの設定
viewMarker();
});
// キャプチャ
function captureImg() {
cap.capture(); // キャプチャ
}
// 画像出力
function outputImg() {
cap.capture(function() {
var dId = "img" + new Date().getTime();
$("#output").append($("<img>").attr("id", dId));
cap.outputImage(dId, "");
});
}
// 画像削除
function delImg() {
$("#output").empty();
}
// 種類切り替え
function swicthTyp() {
var val = $("input:radio[@name='swtchTyp']:checked").val();
var fltr = [];
if (val == "onlyDots") {
fltr.push(
"bin", "label"
,"detectDots", "drawDots", "drawClipDots"
,"hidePaint");
crocro.jscam.setFilter(fltr);
return;
}
if (val == "onlyMrkr") {
fltr.push(
"bin", "label"
,"detectMarker", "drawMarker", "drawClipMarker"
,"hidePaint");
crocro.jscam.setFilter(fltr);
return;
}
if (val.indexOf("bin") >= 0) fltr.push("bin");
if (val.indexOf("lbl") >= 0) fltr.push("label");
if (val.indexOf("prm") >= 0) fltr.push("drawLabel");
if (val.indexOf("dotPtrn") >= 0) {
fltr.push("detectDots", "drawDots", "drawClipDots");
}
if (val.indexOf("mrkr") >= 0) {
fltr.push("detectMarker", "drawMarker", "drawClipMarker");
}
if (val == "onlyPrm") fltr.push("hidePaint", "bin", "label", "drawLabel");
if (val != "onlyPrm") fltr.push("showPaint");
if (val.indexOf("hidePaint") >= 0) fltr.push("hidePaint");
crocro.jscam.setFilter(fltr);
}
// ラベル・カットオフ設定
function chngLblRng() {
// マーカーの作成
crocro.jscam.setsetLabelCutOff($("#lblMin").val(), $("#lblMax").val());
}
// ドット・パターン設定
var dotsArr = crocro.jscam.util.swapXY(4, 4, [
[1,1,0,1],
[1,0,0,1],
[0,0,0,1],
[1,1,1,1]
]);
// ドットパターン表示
function viewDots() {
// ドットパターンの作成
crocro.jscam.util.makeDots("dots", dotsArr, 50, true,
function(x, y, prm){
dotsArr[x][y] = prm;
crocro.jscam.setDots(dotsArr);
}
);
}
// マーカー設定
var mrkrArr = crocro.jscam.util.swapXY(16, 16, [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
[1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
[1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
]);
// マーカー表示
function viewMarker() {
// マーカーの作成
crocro.jscam.util.makeMarker("marker", mrkrArr, 13, true,
function(x, y, prm){
mrkrArr[x][y] = prm;
crocro.jscam.setMarker(mrkrArr);
}
);
}
// マーカー一致閾値の変更
function chngMtchThrshld() {
// マーカーの作成
crocro.jscam.setMarkerMatchThreshold($("#setMtchThrshld").val());
}
</script>
</head>
<body bgcolor="#ffffff">
<div id="jscamAS" class="boxOut">
<table border=0><tr><td valign="top">
<script language="javascript">
crocro.jscam.write();
</script>
</td><td valign="top" style="padding-left: 32px;">
●ドットパターン形式<br>
<br>
<div id="dots"></div>
</td><td valign="top" style="padding-left: 32px;">
●マーカー形式<br>
<br>
<div id="marker"></div>
</td></tr></table>
</div>
<div id="cntrl" style="line-height: 170%;" class="boxOut">
<br>
<input type="radio" value="non" name="swtchTyp" id="swtchTypNon" checked
onClick="swicthTyp()"><label for="swtchTypNon">なし</label>
<input type="radio" value="bin" name="swtchTyp" id="swtchTypBin"
onClick="swicthTyp()"><label for="swtchTypBin">2値化</label>
<input type="radio" value="bin+lbl" name="swtchTyp" id="swtchTypBinLbl"
onClick="swicthTyp()"><label for="swtchTypBinLbl">2値化+ラベリング</label>
<input type="radio" value="bin+lbl+prm" name="swtchTyp" id="swtchTypBinLblPrm"
onClick="swicthTyp()"><label for="swtchTypBinLblPrm">2値化+ラベリング+情報</label>
<input type="radio" value="onlyPrm" name="swtchTyp" id="swtchTypOnlyPrm"
onClick="swicthTyp()"><label for="swtchTypOnlyPrm">情報のみ</label>
<br>
<span style="font-weight: bold;">ラベル認識範囲</span> :
<input type="text" value="10" style="width: 3em;" id="lblMin">
~
<input type="text" value="57600" style="width: 3em;" id="lblMax">
ドット
<input type="button" onClick="chngLblRng()" value="範囲変更">
(57600は縦×横×3/4、縦×横は76800)
<br>
<span style="font-weight: bold;">ドットパターン検出</span> :
<input type="radio" value="bin+lbl+dotPtrn+prm" name="swtchTyp" id="swtchTypBinLblDotPtrnPrm"
onClick="swicthTyp()"><label for="swtchTypBinLblDotPtrnPrm">デバッグ表示</label>
<input type="radio" value="onlyDots" name="swtchTyp" id="swtchTypDotPtrnPrm"
onClick="swicthTyp()"><label for="swtchTypDotPtrnPrm">ドットパターンのみ</label>
<br>
<span style="font-weight: bold;">マーカー検出</span> :
<input type="radio" value="bin+lbl+mrkr+prm" name="swtchTyp" id="swtchTypBinLblMrkrPrm"
onClick="swicthTyp()"><label for="swtchTypBinLblMrkrPrm">デバッグ表示</label>
<input type="radio" value="onlyMrkr" name="swtchTyp" id="swtchTypMrkrPrm"
onClick="swicthTyp()"><label for="swtchTypMrkrPrm">マーカーのみ</label>
<input type="text" value="80" style="width: 3em;" id="setMtchThrshld">
%以上一致で検出
<input type="button" onClick="chngMtchThrshld()" value="閾値変更">
<hr>
<input type="button" onClick="captureImg()" value="1回ずつ描画">
<input type="button" onClick="outputImg()" value="画像出力">
<input type="button" onClick="delImg()" value="画像削除">
<hr>
<div id="jscamJS" style="">
<table border=0><tr><td valign="top">
<canvas id="cnvsCap" width="320" height="240"></canvas>
</td><td valign="top">
<div id="resData" style="height: 240px; overflow-y: scroll;"></div>
</td></tr></table>
</div>
<div id="output"></div>
<div id="dbg"></div>
</body>
</html>







