|
|
@ -1,29 +1,15 @@
|
|
|
|
/* jshint undef: true, unused: true, browser:true, devel: true */
|
|
|
|
import Cluster2 from './cluster';
|
|
|
|
/* global define */
|
|
|
|
import ArrayHelper from './array_helper';
|
|
|
|
|
|
|
|
import {vec2, vec3} from 'gl-matrix';
|
|
|
|
|
|
|
|
|
|
|
|
define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper, glMatrix) {
|
|
|
|
var CVUtils = {};
|
|
|
|
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
|
|
/*
|
|
|
|
|
|
|
|
* cv_utils.js
|
|
|
|
|
|
|
|
* Collection of CV functions and libraries
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Namespace for various CV alorithms
|
|
|
|
|
|
|
|
* @class Represents a collection of useful CV algorithms/functions
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var CVUtils = {},
|
|
|
|
|
|
|
|
vec2 = glMatrix.vec2,
|
|
|
|
|
|
|
|
vec3 = glMatrix.vec3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @param x x-coordinate
|
|
|
|
* @param x x-coordinate
|
|
|
|
* @param y y-coordinate
|
|
|
|
* @param y y-coordinate
|
|
|
|
* @return ImageReference {x,y} Coordinate
|
|
|
|
* @return ImageReference {x,y} Coordinate
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
CVUtils.imageRef = function(x, y) {
|
|
|
|
CVUtils.imageRef = function(x, y) {
|
|
|
|
var that = {
|
|
|
|
var that = {
|
|
|
|
x : x,
|
|
|
|
x : x,
|
|
|
|
y : y,
|
|
|
|
y : y,
|
|
|
@ -40,13 +26,13 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
return that;
|
|
|
|
return that;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Computes an integral image of a given grayscale image.
|
|
|
|
* Computes an integral image of a given grayscale image.
|
|
|
|
* @param imageDataContainer {ImageDataContainer} the image to be integrated
|
|
|
|
* @param imageDataContainer {ImageDataContainer} the image to be integrated
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
CVUtils.computeIntegralImage2 = function(imageWrapper, integralWrapper) {
|
|
|
|
CVUtils.computeIntegralImage2 = function(imageWrapper, integralWrapper) {
|
|
|
|
var imageData = imageWrapper.data;
|
|
|
|
var imageData = imageWrapper.data;
|
|
|
|
var width = imageWrapper.size.x;
|
|
|
|
var width = imageWrapper.size.x;
|
|
|
|
var height = imageWrapper.size.y;
|
|
|
|
var height = imageWrapper.size.y;
|
|
|
@ -86,9 +72,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
posD++;
|
|
|
|
posD++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.computeIntegralImage = function(imageWrapper, integralWrapper) {
|
|
|
|
CVUtils.computeIntegralImage = function(imageWrapper, integralWrapper) {
|
|
|
|
var imageData = imageWrapper.data;
|
|
|
|
var imageData = imageWrapper.data;
|
|
|
|
var width = imageWrapper.size.x;
|
|
|
|
var width = imageWrapper.size.x;
|
|
|
|
var height = imageWrapper.size.y;
|
|
|
|
var height = imageWrapper.size.y;
|
|
|
@ -108,9 +94,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
integralImageData[((v) * width) + u] = sum + integralImageData[(v - 1) * width + u];
|
|
|
|
integralImageData[((v) * width) + u] = sum + integralImageData[(v - 1) * width + u];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.thresholdImage = function(imageWrapper, threshold, targetWrapper) {
|
|
|
|
CVUtils.thresholdImage = function(imageWrapper, threshold, targetWrapper) {
|
|
|
|
if (!targetWrapper) {
|
|
|
|
if (!targetWrapper) {
|
|
|
|
targetWrapper = imageWrapper;
|
|
|
|
targetWrapper = imageWrapper;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -119,9 +105,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
while (length--) {
|
|
|
|
while (length--) {
|
|
|
|
targetData[length] = imageData[length] < threshold ? 1 : 0;
|
|
|
|
targetData[length] = imageData[length] < threshold ? 1 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.computeHistogram = function(imageWrapper, bitsPerPixel) {
|
|
|
|
CVUtils.computeHistogram = function(imageWrapper, bitsPerPixel) {
|
|
|
|
if (!bitsPerPixel) {
|
|
|
|
if (!bitsPerPixel) {
|
|
|
|
bitsPerPixel = 8;
|
|
|
|
bitsPerPixel = 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -135,9 +121,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
hist[imageData[length] >> bitShift]++;
|
|
|
|
hist[imageData[length] >> bitShift]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return hist;
|
|
|
|
return hist;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.sharpenLine = function(line) {
|
|
|
|
CVUtils.sharpenLine = function(line) {
|
|
|
|
var i,
|
|
|
|
var i,
|
|
|
|
length = line.length,
|
|
|
|
length = line.length,
|
|
|
|
left = line[0],
|
|
|
|
left = line[0],
|
|
|
@ -152,9 +138,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
center = right;
|
|
|
|
center = right;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return line;
|
|
|
|
return line;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.determineOtsuThreshold = function(imageWrapper, bitsPerPixel) {
|
|
|
|
CVUtils.determineOtsuThreshold = function(imageWrapper, bitsPerPixel) {
|
|
|
|
if (!bitsPerPixel) {
|
|
|
|
if (!bitsPerPixel) {
|
|
|
|
bitsPerPixel = 8;
|
|
|
|
bitsPerPixel = 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -202,17 +188,17 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
|
|
|
|
|
|
|
|
threshold = determineThreshold();
|
|
|
|
threshold = determineThreshold();
|
|
|
|
return threshold << bitShift;
|
|
|
|
return threshold << bitShift;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.otsuThreshold = function(imageWrapper, targetWrapper) {
|
|
|
|
CVUtils.otsuThreshold = function(imageWrapper, targetWrapper) {
|
|
|
|
var threshold = CVUtils.determineOtsuThreshold(imageWrapper);
|
|
|
|
var threshold = CVUtils.determineOtsuThreshold(imageWrapper);
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.thresholdImage(imageWrapper, threshold, targetWrapper);
|
|
|
|
CVUtils.thresholdImage(imageWrapper, threshold, targetWrapper);
|
|
|
|
return threshold;
|
|
|
|
return threshold;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// local thresholding
|
|
|
|
// local thresholding
|
|
|
|
CVUtils.computeBinaryImage = function(imageWrapper, integralWrapper, targetWrapper) {
|
|
|
|
CVUtils.computeBinaryImage = function(imageWrapper, integralWrapper, targetWrapper) {
|
|
|
|
CVUtils.computeIntegralImage(imageWrapper, integralWrapper);
|
|
|
|
CVUtils.computeIntegralImage(imageWrapper, integralWrapper);
|
|
|
|
|
|
|
|
|
|
|
|
if (!targetWrapper) {
|
|
|
|
if (!targetWrapper) {
|
|
|
@ -252,9 +238,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
targetData[v * width + u] = imageData[v * width + u] > (avg + 5) ? 0 : 1;
|
|
|
|
targetData[v * width + u] = imageData[v * width + u] > (avg + 5) ? 0 : 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.cluster = function(points, threshold, property) {
|
|
|
|
CVUtils.cluster = function(points, threshold, property) {
|
|
|
|
var i, k, cluster, point, clusters = [];
|
|
|
|
var i, k, cluster, point, clusters = [];
|
|
|
|
|
|
|
|
|
|
|
|
if (!property) {
|
|
|
|
if (!property) {
|
|
|
@ -283,9 +269,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
|
|
|
|
|
|
|
|
return clusters;
|
|
|
|
return clusters;
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.Tracer = {
|
|
|
|
CVUtils.Tracer = {
|
|
|
|
trace : function(points, vec) {
|
|
|
|
trace : function(points, vec) {
|
|
|
|
var iteration, maxIterations = 10, top = [], result = [], centerPos = 0, currentPos = 0;
|
|
|
|
var iteration, maxIterations = 10, top = [], result = [], centerPos = 0, currentPos = 0;
|
|
|
|
|
|
|
|
|
|
|
@ -352,12 +338,12 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.DILATE = 1;
|
|
|
|
CVUtils.DILATE = 1;
|
|
|
|
CVUtils.ERODE = 2;
|
|
|
|
CVUtils.ERODE = 2;
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.dilate = function(inImageWrapper, outImageWrapper) {
|
|
|
|
CVUtils.dilate = function(inImageWrapper, outImageWrapper) {
|
|
|
|
var v, u, inImageData = inImageWrapper.data, outImageData = outImageWrapper.data, height = inImageWrapper.size.y, width = inImageWrapper.size.x, sum, yStart1, yStart2, xStart1, xStart2;
|
|
|
|
var v, u, inImageData = inImageWrapper.data, outImageData = outImageWrapper.data, height = inImageWrapper.size.y, width = inImageWrapper.size.x, sum, yStart1, yStart2, xStart1, xStart2;
|
|
|
|
|
|
|
|
|
|
|
|
for ( v = 1; v < height - 1; v++) {
|
|
|
|
for ( v = 1; v < height - 1; v++) {
|
|
|
@ -373,9 +359,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
outImageData[v * width + u] = sum > 0 ? 1 : 0;
|
|
|
|
outImageData[v * width + u] = sum > 0 ? 1 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.erode = function(inImageWrapper, outImageWrapper) {
|
|
|
|
CVUtils.erode = function(inImageWrapper, outImageWrapper) {
|
|
|
|
var v, u, inImageData = inImageWrapper.data, outImageData = outImageWrapper.data, height = inImageWrapper.size.y, width = inImageWrapper.size.x, sum, yStart1, yStart2, xStart1, xStart2;
|
|
|
|
var v, u, inImageData = inImageWrapper.data, outImageData = outImageWrapper.data, height = inImageWrapper.size.y, width = inImageWrapper.size.x, sum, yStart1, yStart2, xStart1, xStart2;
|
|
|
|
|
|
|
|
|
|
|
|
for ( v = 1; v < height - 1; v++) {
|
|
|
|
for ( v = 1; v < height - 1; v++) {
|
|
|
@ -391,9 +377,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
outImageData[v * width + u] = sum === 5 ? 1 : 0;
|
|
|
|
outImageData[v * width + u] = sum === 5 ? 1 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.subtract = function(aImageWrapper, bImageWrapper, resultImageWrapper) {
|
|
|
|
CVUtils.subtract = function(aImageWrapper, bImageWrapper, resultImageWrapper) {
|
|
|
|
if (!resultImageWrapper) {
|
|
|
|
if (!resultImageWrapper) {
|
|
|
|
resultImageWrapper = aImageWrapper;
|
|
|
|
resultImageWrapper = aImageWrapper;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -402,9 +388,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
while (length--) {
|
|
|
|
while (length--) {
|
|
|
|
cImageData[length] = aImageData[length] - bImageData[length];
|
|
|
|
cImageData[length] = aImageData[length] - bImageData[length];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.bitwiseOr = function(aImageWrapper, bImageWrapper, resultImageWrapper) {
|
|
|
|
CVUtils.bitwiseOr = function(aImageWrapper, bImageWrapper, resultImageWrapper) {
|
|
|
|
if (!resultImageWrapper) {
|
|
|
|
if (!resultImageWrapper) {
|
|
|
|
resultImageWrapper = aImageWrapper;
|
|
|
|
resultImageWrapper = aImageWrapper;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -413,18 +399,18 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
while (length--) {
|
|
|
|
while (length--) {
|
|
|
|
cImageData[length] = aImageData[length] || bImageData[length];
|
|
|
|
cImageData[length] = aImageData[length] || bImageData[length];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.countNonZero = function(imageWrapper) {
|
|
|
|
CVUtils.countNonZero = function(imageWrapper) {
|
|
|
|
var length = imageWrapper.data.length, data = imageWrapper.data, sum = 0;
|
|
|
|
var length = imageWrapper.data.length, data = imageWrapper.data, sum = 0;
|
|
|
|
|
|
|
|
|
|
|
|
while (length--) {
|
|
|
|
while (length--) {
|
|
|
|
sum += data[length];
|
|
|
|
sum += data[length];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sum;
|
|
|
|
return sum;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.topGeneric = function(list, top, scoreFunc) {
|
|
|
|
CVUtils.topGeneric = function(list, top, scoreFunc) {
|
|
|
|
var i, minIdx = 0, min = 0, queue = [], score, hit, pos;
|
|
|
|
var i, minIdx = 0, min = 0, queue = [], score, hit, pos;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < top; i++) {
|
|
|
|
for ( i = 0; i < top; i++) {
|
|
|
@ -451,20 +437,20 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return queue;
|
|
|
|
return queue;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.grayArrayFromImage = function(htmlImage, offsetX, ctx, array) {
|
|
|
|
CVUtils.grayArrayFromImage = function(htmlImage, offsetX, ctx, array) {
|
|
|
|
ctx.drawImage(htmlImage, offsetX, 0, htmlImage.width, htmlImage.height);
|
|
|
|
ctx.drawImage(htmlImage, offsetX, 0, htmlImage.width, htmlImage.height);
|
|
|
|
var ctxData = ctx.getImageData(offsetX, 0, htmlImage.width, htmlImage.height).data;
|
|
|
|
var ctxData = ctx.getImageData(offsetX, 0, htmlImage.width, htmlImage.height).data;
|
|
|
|
CVUtils.computeGray(ctxData, array);
|
|
|
|
CVUtils.computeGray(ctxData, array);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.grayArrayFromContext = function(ctx, size, offset, array) {
|
|
|
|
CVUtils.grayArrayFromContext = function(ctx, size, offset, array) {
|
|
|
|
var ctxData = ctx.getImageData(offset.x, offset.y, size.x, size.y).data;
|
|
|
|
var ctxData = ctx.getImageData(offset.x, offset.y, size.x, size.y).data;
|
|
|
|
CVUtils.computeGray(ctxData, array);
|
|
|
|
CVUtils.computeGray(ctxData, array);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.grayAndHalfSampleFromCanvasData = function(canvasData, size, outArray) {
|
|
|
|
CVUtils.grayAndHalfSampleFromCanvasData = function(canvasData, size, outArray) {
|
|
|
|
var topRowIdx = 0;
|
|
|
|
var topRowIdx = 0;
|
|
|
|
var bottomRowIdx = size.x;
|
|
|
|
var bottomRowIdx = size.x;
|
|
|
|
var endIdx = Math.floor(canvasData.length / 4);
|
|
|
|
var endIdx = Math.floor(canvasData.length / 4);
|
|
|
@ -484,9 +470,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
bottomRowIdx = bottomRowIdx + inWidth;
|
|
|
|
bottomRowIdx = bottomRowIdx + inWidth;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.computeGray = function(imageData, outArray, config) {
|
|
|
|
CVUtils.computeGray = function(imageData, outArray, config) {
|
|
|
|
var l = (imageData.length / 4) | 0,
|
|
|
|
var l = (imageData.length / 4) | 0,
|
|
|
|
i,
|
|
|
|
i,
|
|
|
|
singleChannel = config && config.singleChannel === true;
|
|
|
|
singleChannel = config && config.singleChannel === true;
|
|
|
@ -500,9 +486,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
outArray[i] = Math.floor(0.299 * imageData[i * 4 + 0] + 0.587 * imageData[i * 4 + 1] + 0.114 * imageData[i * 4 + 2]);
|
|
|
|
outArray[i] = Math.floor(0.299 * imageData[i * 4 + 0] + 0.587 * imageData[i * 4 + 1] + 0.114 * imageData[i * 4 + 2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.loadImageArray = function(src, callback, canvas) {
|
|
|
|
CVUtils.loadImageArray = function(src, callback, canvas) {
|
|
|
|
if (!canvas)
|
|
|
|
if (!canvas)
|
|
|
|
canvas = document.createElement('canvas');
|
|
|
|
canvas = document.createElement('canvas');
|
|
|
|
var img = new Image();
|
|
|
|
var img = new Image();
|
|
|
@ -522,13 +508,13 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}, this);
|
|
|
|
}, this);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
img.src = src;
|
|
|
|
img.src = src;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @param inImg {ImageWrapper} input image to be sampled
|
|
|
|
* @param inImg {ImageWrapper} input image to be sampled
|
|
|
|
* @param outImg {ImageWrapper} to be stored in
|
|
|
|
* @param outImg {ImageWrapper} to be stored in
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
CVUtils.halfSample = function(inImgWrapper, outImgWrapper) {
|
|
|
|
CVUtils.halfSample = function(inImgWrapper, outImgWrapper) {
|
|
|
|
var inImg = inImgWrapper.data;
|
|
|
|
var inImg = inImgWrapper.data;
|
|
|
|
var inWidth = inImgWrapper.size.x;
|
|
|
|
var inWidth = inImgWrapper.size.x;
|
|
|
|
var outImg = outImgWrapper.data;
|
|
|
|
var outImg = outImgWrapper.data;
|
|
|
@ -547,9 +533,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
topRowIdx = topRowIdx + inWidth;
|
|
|
|
topRowIdx = topRowIdx + inWidth;
|
|
|
|
bottomRowIdx = bottomRowIdx + inWidth;
|
|
|
|
bottomRowIdx = bottomRowIdx + inWidth;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.hsv2rgb = function(hsv, rgb) {
|
|
|
|
CVUtils.hsv2rgb = function(hsv, rgb) {
|
|
|
|
var h = hsv[0], s = hsv[1], v = hsv[2], c = v * s, x = c * (1 - Math.abs((h / 60) % 2 - 1)), m = v - c, r = 0, g = 0, b = 0;
|
|
|
|
var h = hsv[0], s = hsv[1], v = hsv[2], c = v * s, x = c * (1 - Math.abs((h / 60) % 2 - 1)), m = v - c, r = 0, g = 0, b = 0;
|
|
|
|
rgb = rgb || [0, 0, 0];
|
|
|
|
rgb = rgb || [0, 0, 0];
|
|
|
|
|
|
|
|
|
|
|
@ -576,9 +562,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
rgb[1] = ((g + m) * 255) | 0;
|
|
|
|
rgb[1] = ((g + m) * 255) | 0;
|
|
|
|
rgb[2] = ((b + m) * 255) | 0;
|
|
|
|
rgb[2] = ((b + m) * 255) | 0;
|
|
|
|
return rgb;
|
|
|
|
return rgb;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils._computeDivisors = function(n) {
|
|
|
|
CVUtils._computeDivisors = function(n) {
|
|
|
|
var largeDivisors = [],
|
|
|
|
var largeDivisors = [],
|
|
|
|
divisors = [],
|
|
|
|
divisors = [],
|
|
|
|
i;
|
|
|
|
i;
|
|
|
@ -592,9 +578,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return divisors.concat(largeDivisors);
|
|
|
|
return divisors.concat(largeDivisors);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils._computeIntersection = function(arr1, arr2) {
|
|
|
|
CVUtils._computeIntersection = function(arr1, arr2) {
|
|
|
|
var i = 0,
|
|
|
|
var i = 0,
|
|
|
|
j = 0,
|
|
|
|
j = 0,
|
|
|
|
result = [];
|
|
|
|
result = [];
|
|
|
@ -611,9 +597,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.calculatePatchSize = function(patchSize, imgSize) {
|
|
|
|
CVUtils.calculatePatchSize = function(patchSize, imgSize) {
|
|
|
|
var divisorsX = this._computeDivisors(imgSize.x),
|
|
|
|
var divisorsX = this._computeDivisors(imgSize.x),
|
|
|
|
divisorsY = this._computeDivisors(imgSize.y),
|
|
|
|
divisorsY = this._computeDivisors(imgSize.y),
|
|
|
|
wideSide = Math.max(imgSize.x, imgSize.y),
|
|
|
|
wideSide = Math.max(imgSize.x, imgSize.y),
|
|
|
@ -660,18 +646,18 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return optimalPatchSize;
|
|
|
|
return optimalPatchSize;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils._parseCSSDimensionValues = function(value) {
|
|
|
|
CVUtils._parseCSSDimensionValues = function(value) {
|
|
|
|
var dimension = {
|
|
|
|
var dimension = {
|
|
|
|
value: parseFloat(value),
|
|
|
|
value: parseFloat(value),
|
|
|
|
unit: value.indexOf("%") === value.length-1 ? "%" : "%"
|
|
|
|
unit: value.indexOf("%") === value.length-1 ? "%" : "%"
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return dimension;
|
|
|
|
return dimension;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils._dimensionsConverters = {
|
|
|
|
CVUtils._dimensionsConverters = {
|
|
|
|
top: function(dimension, context) {
|
|
|
|
top: function(dimension, context) {
|
|
|
|
if (dimension.unit === "%") {
|
|
|
|
if (dimension.unit === "%") {
|
|
|
|
return Math.floor(context.height * (dimension.value / 100));
|
|
|
|
return Math.floor(context.height * (dimension.value / 100));
|
|
|
@ -692,9 +678,9 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
return Math.floor(context.width * (dimension.value / 100));
|
|
|
|
return Math.floor(context.width * (dimension.value / 100));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
CVUtils.computeImageArea = function(inputWidth, inputHeight, area) {
|
|
|
|
CVUtils.computeImageArea = function(inputWidth, inputHeight, area) {
|
|
|
|
var context = {width: inputWidth, height: inputHeight};
|
|
|
|
var context = {width: inputWidth, height: inputHeight};
|
|
|
|
|
|
|
|
|
|
|
|
var parsedArea = Object.keys(area).reduce(function(result, key) {
|
|
|
|
var parsedArea = Object.keys(area).reduce(function(result, key) {
|
|
|
@ -712,8 +698,6 @@ define(['cluster', "array_helper", "gl-matrix"], function(Cluster2, ArrayHelper,
|
|
|
|
sw: parsedArea.right - parsedArea.left,
|
|
|
|
sw: parsedArea.right - parsedArea.left,
|
|
|
|
sh: parsedArea.bottom - parsedArea.top
|
|
|
|
sh: parsedArea.bottom - parsedArea.top
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (CVUtils);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default CVUtils;
|
|
|
|