(function() { /** * ObjectTracker utility. * @constructor * @param {string|Array.>} opt_classifiers Optional * object classifiers to track. * @extends {tracking.Tracker} */ tracking.ObjectTracker = function(opt_classifiers) { tracking.ObjectTracker.base(this, 'constructor'); if (opt_classifiers) { if (!Array.isArray(opt_classifiers)) { opt_classifiers = [opt_classifiers]; } if (Array.isArray(opt_classifiers)) { opt_classifiers.forEach(function(classifier, i) { if (typeof classifier === 'string') { opt_classifiers[i] = tracking.ViolaJones.classifiers[classifier]; } if (!opt_classifiers[i]) { throw new Error('Object classifier not valid, try `new tracking.ObjectTracker("face")`.'); } }); } } this.setClassifiers(opt_classifiers); }; tracking.inherits(tracking.ObjectTracker, tracking.Tracker); /** * Specifies the edges density of a block in order to decide whether to skip * it or not. * @default 0.2 * @type {number} */ tracking.ObjectTracker.prototype.edgesDensity = 0.2; /** * Specifies the initial scale to start the feature block scaling. * @default 1.0 * @type {number} */ tracking.ObjectTracker.prototype.initialScale = 1.0; /** * Specifies the scale factor to scale the feature block. * @default 1.25 * @type {number} */ tracking.ObjectTracker.prototype.scaleFactor = 1.25; /** * Specifies the block step size. * @default 1.5 * @type {number} */ tracking.ObjectTracker.prototype.stepSize = 1.5; /** * Gets the tracker HAAR classifiers. * @return {TypedArray.} */ tracking.ObjectTracker.prototype.getClassifiers = function() { return this.classifiers; }; /** * Gets the edges density value. * @return {number} */ tracking.ObjectTracker.prototype.getEdgesDensity = function() { return this.edgesDensity; }; /** * Gets the initial scale to start the feature block scaling. * @return {number} */ tracking.ObjectTracker.prototype.getInitialScale = function() { return this.initialScale; }; /** * Gets the scale factor to scale the feature block. * @return {number} */ tracking.ObjectTracker.prototype.getScaleFactor = function() { return this.scaleFactor; }; /** * Gets the block step size. * @return {number} */ tracking.ObjectTracker.prototype.getStepSize = function() { return this.stepSize; }; /** * Tracks the `Video` frames. This method is called for each video frame in * order to emit `track` event. * @param {Uint8ClampedArray} pixels The pixels data to track. * @param {number} width The pixels canvas width. * @param {number} height The pixels canvas height. */ tracking.ObjectTracker.prototype.track = function(pixels, width, height) { var self = this; var classifiers = this.getClassifiers(); if (!classifiers) { throw new Error('Object classifier not specified, try `new tracking.ObjectTracker("face")`.'); } var results = []; classifiers.forEach(function(classifier) { results = results.concat(tracking.ViolaJones.detect(pixels, width, height, self.getInitialScale(), self.getScaleFactor(), self.getStepSize(), self.getEdgesDensity(), classifier)); }); this.emit('track', { data: results }); }; /** * Sets the tracker HAAR classifiers. * @param {TypedArray.} classifiers */ tracking.ObjectTracker.prototype.setClassifiers = function(classifiers) { this.classifiers = classifiers; }; /** * Sets the edges density. * @param {number} edgesDensity */ tracking.ObjectTracker.prototype.setEdgesDensity = function(edgesDensity) { this.edgesDensity = edgesDensity; }; /** * Sets the initial scale to start the block scaling. * @param {number} initialScale */ tracking.ObjectTracker.prototype.setInitialScale = function(initialScale) { this.initialScale = initialScale; }; /** * Sets the scale factor to scale the feature block. * @param {number} scaleFactor */ tracking.ObjectTracker.prototype.setScaleFactor = function(scaleFactor) { this.scaleFactor = scaleFactor; }; /** * Sets the block step size. * @param {number} stepSize */ tracking.ObjectTracker.prototype.setStepSize = function(stepSize) { this.stepSize = stepSize; }; }());