Initial version for node.js

This commit is contained in:
Christoph Oberhofer
2015-06-02 07:54:40 +02:00
parent 89da5cc4e7
commit a042422515
12 changed files with 348 additions and 79 deletions
+11 -10
View File
@@ -1,8 +1,8 @@
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define, mat2, vec2 */
define("barcode_locator", ["image_wrapper", "cv_utils", "rasterizer", "tracer", "skeletonizer", "array_helper", "image_debug"],
function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, ImageDebug) {
define("barcode_locator", ["image_wrapper", "cv_utils", "rasterizer", "tracer", "skeletonizer", "array_helper", "image_debug", "gl-matrix"],
function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, ImageDebug, glMatrix) {
var _config,
_currentImageWrapper,
@@ -25,6 +25,8 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
_numPatches = {x: 0, y: 0},
_inputImageWrapper,
_skeletonizer,
vec2 = glMatrix.vec2,
mat2 = glMatrix.mat2,
self = this;
function initBuffers() {
@@ -100,15 +102,14 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
overAvg += 180;
}
//console.log(overAvg);
overAvg = (180 - overAvg) * Math.PI / 180;
transMat = mat2.create([Math.cos(overAvg), -Math.sin(overAvg), Math.sin(overAvg), Math.cos(overAvg)]);
transMat = mat2.clone([Math.cos(overAvg), Math.sin(overAvg), -Math.sin(overAvg), Math.cos(overAvg)]);
// iterate over patches and rotate by angle
for ( i = 0; i < patches.length; i++) {
patch = patches[i];
for ( j = 0; j < 4; j++) {
mat2.xVec2(transMat, patch.box[j]);
vec2.transformMat2(patch.box[j], patch.box[j], transMat);
}
if (_config.boxFromPatches.showTransformed) {
@@ -143,9 +144,9 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
scale = _config.halfSample ? 2 : 1;
// reverse rotation;
transMat = mat2.inverse(transMat);
transMat = mat2.invert(transMat, transMat);
for ( j = 0; j < 4; j++) {
mat2.xVec2(transMat, box[j]);
vec2.transformMat2(box[j], box[j], transMat);
}
if (_config.boxFromPatches.showBB) {
@@ -153,7 +154,7 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
}
for ( j = 0; j < 4; j++) {
vec2.scale(box[j], scale);
vec2.scale(box[j], box[j], scale);
}
return box;
@@ -377,10 +378,10 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
x : x,
y : y
},
box : [vec2.create([x, y]), vec2.create([x + _subImageWrapper.size.x, y]), vec2.create([x + _subImageWrapper.size.x, y + _subImageWrapper.size.y]), vec2.create([x, y + _subImageWrapper.size.y])],
box : [vec2.clone([x, y]), vec2.clone([x + _subImageWrapper.size.x, y]), vec2.clone([x + _subImageWrapper.size.x, y + _subImageWrapper.size.y]), vec2.clone([x, y + _subImageWrapper.size.y])],
moments : matchingMoments,
rad : avg,
vec : vec2.create([Math.cos(avg), Math.sin(avg)])
vec : vec2.clone([Math.cos(avg), Math.sin(avg)])
};
patchesFound.push(patch);
}
+6 -5
View File
@@ -1,9 +1,10 @@
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define, vec2 */
/* global define */
define(function() {
define(["gl-matrix"], function(glMatrix) {
"use strict";
var vec2 = glMatrix.vec2;
/**
* Creates a cluster for grouping similar orientations of datapoints
*/
@@ -11,7 +12,7 @@ define(function() {
create : function(point, threshold) {
var points = [], center = {
rad : 0,
vec : vec2.create([0, 0])
vec : vec2.clone([0, 0])
}, pointMap = {};
function init() {
@@ -30,7 +31,7 @@ define(function() {
sum += points[i].rad;
}
center.rad = sum / points.length;
center.vec = vec2.create([Math.cos(center.rad), Math.sin(center.rad)]);
center.vec = vec2.clone([Math.cos(center.rad), Math.sin(center.rad)]);
}
init();
+7 -5
View File
@@ -1,7 +1,7 @@
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define, vec2, vec3 */
/* global define */
define(['cluster', 'glMatrixAddon', "array_helper"], function(Cluster2, glMatrixAddon, ArrayHelper) {
define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper, glMatrix) {
"use strict";
/*
@@ -14,7 +14,9 @@ define(['cluster', 'glMatrixAddon', "array_helper"], function(Cluster2, glMatrix
* @class Represents a collection of useful CV algorithms/functions
*/
var CVUtils = {};
var CVUtils = {},
vec2 = glMatrix.vec2,
vec3 = glMatrix.vec3;
/**
* @param x x-coordinate
@@ -26,10 +28,10 @@ define(['cluster', 'glMatrixAddon', "array_helper"], function(Cluster2, glMatrix
x : x,
y : y,
toVec2 : function() {
return vec2.create([this.x, this.y]);
return vec2.clone([this.x, this.y]);
},
toVec3 : function() {
return vec3.create([this.x, this.y, 1]);
return vec3.clone([this.x, this.y, 1]);
},
round : function() {
this.x = this.x > 0.0 ? Math.floor(this.x + 0.5) : Math.floor(this.x - 0.5);
+3 -3
View File
@@ -224,7 +224,7 @@ mat2.inverse = function(mat){
};
var vec2 = {};
vec2.create = function(vec){
vec2.clone = function(vec){
var dest;
if(vec) {
@@ -324,7 +324,7 @@ vec2.length = function(vec){
};
vec2.perspectiveProject = function(vec){
var result = vec2.create(vec);
var result = vec2.clone(vec);
return vec2.scale(result, 1/vec[2]);
};
@@ -333,7 +333,7 @@ vec2.perspectiveProject = function(vec){
* @returns vec2 projected vector
*/
vec3.project = function(vec){
return vec2.scale(vec2.create(vec), 1/vec[2]);
return vec2.scale(vec2.clone(vec), 1/vec[2]);
};
var vec6 = {};
+11 -8
View File
@@ -1,14 +1,17 @@
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define, vec2, mat2 */
/* global define */
define([
"subImage",
"cv_utils",
"array_helper"
"array_helper",
"gl-matrix"
],
function(SubImage, CVUtils, ArrayHelper) {
function(SubImage, CVUtils, ArrayHelper, glMatrix) {
'use strict';
var vec2 = glMatrix.vec2,
mat2 = glMatrix.mat2;
/**
* Represents a basic image combining the data and size.
@@ -62,11 +65,11 @@ define([
*/
ImageWrapper.transform = function(inImg, outImg, M, inOrig, outOrig) {
var w = outImg.size.x, h = outImg.size.y, iw = inImg.size.x, ih = inImg.size.y;
var across = vec2.create([M[0], M[2]]);
var down = vec2.create([M[1], M[3]]);
var across = vec2.clone([M[0], M[2]]);
var down = vec2.clone([M[1], M[3]]);
var defaultValue = 0;
var p0 = vec2.subtract(inOrig, mat2.xVec2(M, outOrig, vec2.create()), vec2.create());
var p0 = vec2.subtract(inOrig, mat2.xVec2(M, outOrig, vec2.clone()), vec2.clone());
var min_x = p0[0], min_y = p0[1];
var max_x = min_x, max_y = min_y;
@@ -94,7 +97,7 @@ define([
else
max_y += h * down[1];
var carrigeReturn = vec2.subtract(down, vec2.scale(across, w, vec2.create()), vec2.create());
var carrigeReturn = vec2.subtract(down, vec2.scale(across, w, vec2.clone()), vec2.clone());
if (min_x >= 0 && min_y >= 0 && max_x < iw - 1 && max_y < ih - 1) {
p = p0;
@@ -346,7 +349,7 @@ define([
label.theta += 180;
}
label.rad = tmp > PI ? tmp - PI : tmp;
label.vec = vec2.create([Math.cos(tmp), Math.sin(tmp)]);
label.vec = vec2.clone([Math.cos(tmp), Math.sin(tmp)]);
result.push(label);
}
}
+53 -46
View File
@@ -1,5 +1,5 @@
/* jshint undef: true, unused: true, browser:true, devel: true, evil: true */
/* global define, vec2 */
/* global define */
define([
@@ -15,7 +15,8 @@ define([
"events",
"camera_access",
"image_debug",
"cv_utils"],
"cv_utils",
"gl-matrix"],
function(Code128Reader,
EANReader,
InputStream,
@@ -28,7 +29,8 @@ function(Code128Reader,
Events,
CameraAccess,
ImageDebug,
CVUtils) {
CVUtils,
glMatrix) {
"use strict";
var _inputStream,
@@ -48,7 +50,8 @@ function(Code128Reader,
_boxSize,
_decoder,
_workerPool = [],
_onUIThread = true;
_onUIThread = true,
vec2 = glMatrix.vec2;
function initializeData(imageWrapper) {
initBuffers(imageWrapper);
@@ -56,20 +59,22 @@ function(Code128Reader,
}
function initConfig() {
var vis = [{
node : document.querySelector("div[data-controls]"),
prop : _config.controls
}, {
node : _canvasContainer.dom.overlay,
prop : _config.visual.show
}];
if (typeof document !== "undefined") {
var vis = [{
node: document.querySelector("div[data-controls]"),
prop: _config.controls
}, {
node: _canvasContainer.dom.overlay,
prop: _config.visual.show
}];
for (var i = 0; i < vis.length; i++) {
if (vis[i].node) {
if (vis[i].prop === true) {
vis[i].node.style.display = "block";
} else {
vis[i].node.style.display = "none";
for (var i = 0; i < vis.length; i++) {
if (vis[i].node) {
if (vis[i].prop === true) {
vis[i].node.style.display = "block";
} else {
vis[i].node.style.display = "none";
}
}
}
}
@@ -161,35 +166,37 @@ function(Code128Reader,
}
function initCanvas() {
var $viewport = document.querySelector("#interactive.viewport");
_canvasContainer.dom.image = document.querySelector("canvas.imgBuffer");
if (!_canvasContainer.dom.image) {
_canvasContainer.dom.image = document.createElement("canvas");
_canvasContainer.dom.image.className = "imgBuffer";
if($viewport && _config.inputStream.type == "ImageStream") {
$viewport.appendChild(_canvasContainer.dom.image);
if (typeof document !== "undefined") {
var $viewport = document.querySelector("#interactive.viewport");
_canvasContainer.dom.image = document.querySelector("canvas.imgBuffer");
if (!_canvasContainer.dom.image) {
_canvasContainer.dom.image = document.createElement("canvas");
_canvasContainer.dom.image.className = "imgBuffer";
if ($viewport && _config.inputStream.type == "ImageStream") {
$viewport.appendChild(_canvasContainer.dom.image);
}
}
}
_canvasContainer.ctx.image = _canvasContainer.dom.image.getContext("2d");
_canvasContainer.dom.image.width = _inputStream.getWidth();
_canvasContainer.dom.image.height = _inputStream.getHeight();
_canvasContainer.ctx.image = _canvasContainer.dom.image.getContext("2d");
_canvasContainer.dom.image.width = _inputStream.getWidth();
_canvasContainer.dom.image.height = _inputStream.getHeight();
_canvasContainer.dom.overlay = document.querySelector("canvas.drawingBuffer");
if (!_canvasContainer.dom.overlay) {
_canvasContainer.dom.overlay = document.createElement("canvas");
_canvasContainer.dom.overlay.className = "drawingBuffer";
if($viewport) {
$viewport.appendChild(_canvasContainer.dom.overlay);
}
var clearFix = document.createElement("br");
clearFix.setAttribute("clear", "all");
if($viewport) {
$viewport.appendChild(clearFix);
_canvasContainer.dom.overlay = document.querySelector("canvas.drawingBuffer");
if (!_canvasContainer.dom.overlay) {
_canvasContainer.dom.overlay = document.createElement("canvas");
_canvasContainer.dom.overlay.className = "drawingBuffer";
if ($viewport) {
$viewport.appendChild(_canvasContainer.dom.overlay);
}
var clearFix = document.createElement("br");
clearFix.setAttribute("clear", "all");
if ($viewport) {
$viewport.appendChild(clearFix);
}
}
_canvasContainer.ctx.overlay = _canvasContainer.dom.overlay.getContext("2d");
_canvasContainer.dom.overlay.width = _inputStream.getWidth();
_canvasContainer.dom.overlay.height = _inputStream.getHeight();
}
_canvasContainer.ctx.overlay = _canvasContainer.dom.overlay.getContext("2d");
_canvasContainer.dom.overlay.width = _inputStream.getWidth();
_canvasContainer.dom.overlay.height = _inputStream.getHeight();
}
function initBuffers(imageWrapper) {
@@ -204,10 +211,10 @@ function(Code128Reader,
console.log(_inputImageWrapper.size);
_boxSize = [
vec2.create([20, _inputImageWrapper.size.y / 2 - 100]),
vec2.create([20, _inputImageWrapper.size.y / 2 + 100]),
vec2.create([_inputImageWrapper.size.x - 20, _inputImageWrapper.size.y / 2 + 100]),
vec2.create([_inputImageWrapper.size.x - 20, _inputImageWrapper.size.y / 2 - 100])
vec2.clone([20, _inputImageWrapper.size.y / 2 - 100]),
vec2.clone([20, _inputImageWrapper.size.y / 2 + 100]),
vec2.clone([_inputImageWrapper.size.x - 20, _inputImageWrapper.size.y / 2 + 100]),
vec2.clone([_inputImageWrapper.size.x - 20, _inputImageWrapper.size.y / 2 - 100])
];
BarcodeLocator.init(_inputImageWrapper, _config.locator);
}
+10
View File
@@ -4,6 +4,16 @@
define(function() {
"use strict";
Math.imul = Math.imul || function(a, b) {
var ah = (a >>> 16) & 0xffff;
var al = a & 0xffff;
var bh = (b >>> 16) & 0xffff;
var bl = b & 0xffff;
// the shift by 0 fixes the sign on the high part
// the final |0 converts the unsigned value into a signed value
return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0);
};
/* @preserve ASM BEGIN */
function Skeletonizer(stdlib, foreign, buffer) {
"use asm";