traking.js 指定手機後置相機

老古
各位先進高手大大...小弟目前有一功能需求是使用 tracking.js 做手機相機的顏色辨識,官方的demo是完全可用的,可是手機一開啟預設就是使用前置鏡頭,
小弟研究了1週的時間反覆測試,也google了不少資料,但始終無解 = =

希望在此有高手大大能為小弟解惑....該怎麼改才能順利使用手機的後置相機 QQ
小弟必定感激萬分 QQ

小弟列出參考的一些資料如下:
1.https://blog.allenchou.cc/webrtc-facingmode/
2.https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
3.https://github.com/eduardolundgren/tracking.js/issues/213

並附上js內容如下:

!function(t,r){t.tracking=t.tracking||{},tracking.inherits=function(t,r){function n(){}n.prototype=r.prototype,t.superClass_=r.prototype,t.prototype=new n,t.prototype.constructor=t,t.base=function(t,n){var e=Array.prototype.slice.call(arguments,2);return r.prototype[n].apply(t,e)}},tracking.initUserMedia_=function(r,n){t.navigator.mediaDevices.getUserMedia({video:!0,audio:!(!n||!n.audio)}).then(function(t){r.srcObject=t})["catch"](function(t){throw Error("Cannot capture user camera.")})},tracking.isNode=function(t){return t.nodeType||this.isWindow(t)},tracking.isWindow=function(t){return!!(t&&t.alert&&t.document)},tracking.one=function(t,r){return this.isNode(t)?t:(r||document).querySelector(t)},tracking.track=function(t,r,n){if(t=tracking.one(t),!t)throw new Error("Element not found, try a different element or selector.");if(!r)throw new Error("Tracker not specified, try `tracking.track(element, new tracking.FaceTracker())`.");switch(t.nodeName.toLowerCase()){case"canvas":return this.trackCanvas_(t,r,n);case"img":return this.trackImg_(t,r,n);case"video":return n&&n.camera&&this.initUserMedia_(t,n),this.trackVideo_(t,r,n);default:throw new Error("Element not supported, try in a canvas, img, or video.")}},tracking.trackCanvas_=function(t,r){var n=this,e=new tracking.TrackerTask(r);return e.on("run",function(){n.trackCanvasInternal_(t,r)}),e.run()},tracking.trackCanvasInternal_=function(t,r){var n=t.width,e=t.height,a=t.getContext("2d"),i=a.getImageData(0,0,n,e);r.track(i.data,n,e)},tracking.trackImg_=function(t,r){var n=t.width,e=t.height,a=document.createElement("canvas");a.width=n,a.height=e;var i=new tracking.TrackerTask(r);return i.on("run",function(){tracking.Canvas.loadImage(a,t.src,0,0,n,e,function(){tracking.trackCanvasInternal_(a,r)})}),i.run()},tracking.trackVideo_=function(r,n){var e,a,i=document.createElement("canvas"),o=i.getContext("2d"),c=function(){e=r.offsetWidth,a=r.offsetHeight,i.width=e,i.height=a};c(),r.addEventListener("resize",c);var s,g=function(){s=t.requestAnimationFrame(function(){if(r.readyState===r.HAVE_ENOUGH_DATA){try{o.drawImage(r,0,0,e,a)}catch(t){}tracking.trackCanvasInternal_(i,n)}g()})},h=new tracking.TrackerTask(n);return h.on("stop",function(){t.cancelAnimationFrame(s)}),h.on("run",function(){g()}),h.run()},t.URL||(t.URL=t.URL||t.webkitURL||t.msURL||t.oURL),navigator.getUserMedia||(navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia)}(window),function(){tracking.EventEmitter=function(){},tracking.EventEmitter.prototype.events_=null,tracking.EventEmitter.prototype.addListener=function(t,r){if("function"!=typeof r)throw new TypeError("Listener must be a function");return this.events_||(this.events_={}),this.emit("newListener",t,r),this.events_[t]||(this.events_[t]=[]),this.events_[t].push(r),this},tracking.EventEmitter.prototype.listeners=function(t){return this.events_&&this.events_[t]},tracking.EventEmitter.prototype.emit=function(t){var r=this.listeners(t);if(r){for(var n=Array.prototype.slice.call(arguments,1),e=0;e<r.length;e++)r[e]&&r[e].apply(this,n);return!0}return!1},tracking.EventEmitter.prototype.on=tracking.EventEmitter.prototype.addListener,tracking.EventEmitter.prototype.once=function(t,r){var n=this;n.on(t,function e(){n.removeListener(t,e),r.apply(this,arguments)})},tracking.EventEmitter.prototype.removeAllListeners=function(t){return this.events_?(t?delete this.events_[t]:delete this.events_,this):this},tracking.EventEmitter.prototype.removeListener=function(t,r){if("function"!=typeof r)throw new TypeError("Listener must be a function");if(!this.events_)return this;var n=this.listeners(t);if(Array.isArray(n)){var e=n.indexOf(r);if(e<0)return this;n.splice(e,1)}return this},tracking.EventEmitter.prototype.setMaxListeners=function(){throw new Error("Not implemented")}}(),function(){tracking.Canvas={},tracking.Canvas.loadImage=function(t,r,n,e,a,i,o){var c=this,s=new window.Image;s.crossOrigin="*",s.onload=function(){var r=t.getContext("2d");t.width=a,t.height=i,r.drawImage(s,n,e,a,i),o&&o.call(c),s=null},s.src=r}}(),function(){tracking.DisjointSet=function(t){if(void 0===t)throw new Error("DisjointSet length not specified.");this.length=t,this.parent=new Uint32Array(t);for(var r=0;r<t;r++)this.parent[r]=r},tracking.DisjointSet.prototype.length=null,tracking.DisjointSet.prototype.parent=null,tracking.DisjointSet.prototype.find=function(t){return this.parent[t]===t?t:this.parent[t]=this.find(this.parent[t])},tracking.DisjointSet.prototype.union=function(t,r){var n=this.find(t),e=this.find(r);this.parent[n]=e}}(),function(){tracking.Image={},tracking.Image.blur=function(t,r,n,e){if(e=Math.abs(e),e<=1)throw new Error("Diameter should be greater than 1.");for(var a=e/2,i=Math.ceil(e)+(1-Math.ceil(e)%2),o=new Float32Array(i),c=(a+.5)/3,s=c*c,g=1/Math.sqrt(2*Math.PI*s),h=-1/(2*c*c),k=0,f=Math.floor(i/2),u=0;u<i;u++){var l=u-f,m=g*Math.exp(l*l*h);o[u]=m,k+=m}for(var d=0;d<o.length;d++)o[d]/=k;return this.separableConvolve(t,r,n,o,o,!1)},tracking.Image.computeIntegralImage=function(t,r,n,e,a,i,o){if(arguments.length<4)throw new Error("You should specify at least one output array in the order: sum, square, tilted, sobel.");var c;o&&(c=tracking.Image.sobel(t,r,n));for(var s=0;s<n;s++)for(var g=0;g<r;g++){var h=s*r*4+4*g,k=~~(.299*t[h]+.587*t[h+1]+.114*t[h+2]);if(e&&this.computePixelValueSAT_(e,r,s,g,k),a&&this.computePixelValueSAT_(a,r,s,g,k*k),i){var f=h-4*r,u=~~(.299*t[f]+.587*t[f+1]+.114*t[f+2]);this.computePixelValueRSAT_(i,r,s,g,k,u||0)}o&&this.computePixelValueSAT_(o,r,s,g,c[h])}},tracking.Image.computePixelValueRSAT_=function(t,r,n,e,a,i){var o=n*r+e;t[o]=(t[o-r-1]||0)+(t[o-r+1]||0)-(t[o-r-r]||0)+a+i},tracking.Image.computePixelValueSAT_=function(t,r,n,e,a){var i=n*r+e;t[i]=(t[i-r]||0)+(t[i-1]||0)+a-(t[i-r-1]||0)},tracking.Image.grayscale=function(t,r,n,e){for(var a=new Uint8ClampedArray(e?t.length:t.length>>2),i=0,o=0,c=0;c<n;c++)for(var s=0;s<r;s++){var g=.299*t[o]+.587*t[o+1]+.114*t[o+2];a[i++]=g,e&&(a[i++]=g,a[i++]=g,a[i++]=t[o+3]),o+=4}return a},tracking.Image.horizontalConvolve=function(t,r,n,e,a){for(var i=e.length,o=Math.floor(i/2),c=new Float32Array(r*n*4),s=a?1:0,g=0;g<n;g++)for(var h=0;h<r;h++){for(var k=g,f=h,u=4*(g*r+h),l=0,m=0,d=0,v=0,p=0;p<i;p++){var y=k,w=Math.min(r-1,Math.max(0,f+p-o)),T=4*(y*r+w),x=e[p];l+=t[T]*x,m+=t[T+1]*x,d+=t[T+2]*x,v+=t[T+3]*x}c[u]=l,c[u+1]=m,c[u+2]=d,c[u+3]=v+s*(255-v)}return c},tracking.Image.verticalConvolve=function(t,r,n,e,a){for(var i=e.length,o=Math.floor(i/2),c=new Float32Array(r*n*4),s=a?1:0,g=0;g<n;g++)for(var h=0;h<r;h++){for(var k=g,f=h,u=4*(g*r+h),l=0,m=0,d=0,v=0,p=0;p<i;p++){var y=Math.min(n-1,Math.max(0,k+p-o)),w=f,T=4*(y*r+w),x=e[p];l+=t[T]*x,m+=t[T+1]*x,d+=t[T+2]*x,v+=t[T+3]*x}c[u]=l,c[u+1]=m,c[u+2]=d,c[u+3]=v+s*(255-v)}return c},tracking.Image.separableConvolve=function(t,r,n,e,a,i){var o=this.verticalConvolve(t,r,n,a,i);return this.horizontalConvolve(o,r,n,e,i)},tracking.Image.sobel=function(t,r,n){t=this.grayscale(t,r,n,!0);for(var e=new Float32Array(r*n*4),a=new Float32Array([-1,0,1]),i=new Float32Array([1,2,1]),o=this.separableConvolve(t,r,n,a,i),c=this.separableConvolve(t,r,n,i,a),s=0;s<e.length;s+=4){var g=o[s],h=c[s],k=Math.sqrt(h*h+g*g);e[s]=k,e[s+1]=k,e[s+2]=k,e[s+3]=255}return e},tracking.Image.equalizeHist=function(t,r,n){for(var e=new Uint8ClampedArray(t.length),a=new Array(256),i=0;i<256;i++)a[i]=0;for(var i=0;i<t.length;i++)e[i]=t[i],a[t[i]]++;for(var o=a[0],i=0;i<256;i++)a[i]+=o,o=a[i];for(var c=255/t.length,i=0;i<t.length;i++)e[i]=a[t[i]]*c+.5|0;return e}}(),function(){tracking.ViolaJones={},tracking.ViolaJones.REGIONS_OVERLAP=.5,tracking.ViolaJones.classifiers={},tracking.ViolaJones.detect=function(t,r,n,e,a,i,o,c){var s,g=0,h=[],k=new Int32Array(r*n),f=new Int32Array(r*n),u=new Int32Array(r*n);o>0&&(s=new Int32Array(r*n)),tracking.Image.computeIntegralImage(t,r,n,k,f,u,s);for(var l=c[0],m=c[1],d=e*a,v=d*l|0,p=d*m|0;v<r&&p<n;){for(var y=d*i+.5|0,w=0;w<n-p;w+=y)for(var T=0;T<r-v;T+=y)o>0&&this.isTriviallyExcluded(o,s,w,T,r,v,p)||this.evalStages_(c,k,f,u,w,T,r,v,p,d)&&(h[g++]={width:v,height:p,x:T,y:w});d*=a,v=d*l|0,p=d*m|0}return this.mergeRectangles_(h)},tracking.ViolaJones.isTriviallyExcluded=function(t,r,n,e,a,i,o){var c=n*a+e,s=c+i,g=c+o*a,h=g+i,k=(r[c]-r[s]-r[g]+r[h])/(i*o*255);return k<t},tracking.ViolaJones.evalStages_=function(t,r,n,e,a,i,o,c,s,g){var h=1/(c*s),k=a*o+i,f=k+c,u=k+s*o,l=u+c,m=(r[k]-r[f]-r[u]+r[l])*h,d=(n[k]-n[f]-n[u]+n[l])*h-m*m,v=1;d>0&&(v=Math.sqrt(d));for(var p=t.length,y=2;y<p;){for(var w=0,T=t[y++],x=t[y++];x--;){for(var M=0,_=t[y++],C=t[y++],E=0;E<C;E++){var F,B,L,S,A=i+t[y++]*g+.5|0,I=a+t[y++]*g+.5|0,R=t[y++]*g+.5|0,b=t[y++]*g+.5|0,D=t[y++];_?(F=A-b+R+(I+R+b-1)*o,B=A+(I-1)*o,L=A-b+(I+b-1)*o,S=A+R+(I+R-1)*o,M+=(e[F]+e[B]-e[L]-e[S])*D):(F=I*o+A,B=F+R,L=F+b*o,S=L+R,M+=(r[F]-r[B]-r[L]+r[S])*D)}var O=t[y++],N=t[y++],j=t[y++];w+=M*h<O*v?N:j}if(w<T)return!1}return!0},tracking.ViolaJones.mergeRectangles_=function(t){for(var r=new tracking.DisjointSet(t.length),n=0;n<t.length;n++)for(var e=t[n],a=0;a<t.length;a++){var i=t[a];if(tracking.Math.intersectRect(e.x,e.y,e.x+e.width,e.y+e.height,i.x,i.y,i.x+i.width,i.y+i.height)){var o=Math.max(e.x,i.x),c=Math.max(e.y,i.y),s=Math.min(e.x+e.width,i.x+i.width),g=Math.min(e.y+e.height,i.y+i.height),h=(o-s)*(c-g),k=e.width*e.height,f=i.width*i.height;h/(k*(k/f))>=this.REGIONS_OVERLAP&&h/(f*(k/f))>=this.REGIONS_OVERLAP&&r.union(n,a)}}for(var u={},l=0;l<r.length;l++){var m=r.find(l);u[m]?(u[m].total++,u[m].width+=t[l].width,u[m].height+=t[l].height,u[m].x+=t[l].x,u[m].y+=t[l].y):u[m]={total:1,width:t[l].width,height:t[l].height,x:t[l].x,y:t[l].y}}var d=[];return Object.keys(u).forEach(function(t){var r=u[t];d.push({total:r.total,width:r.width/r.total+.5|0,height:r.height/r.total+.5|0,x:r.x/r.total+.5|0,y:r.y/r.total+.5|0})}),d}}(),function(){tracking.Brief={},tracking.Brief.N=512,tracking.Brief.randomImageOffsets_={},tracking.Brief.randomWindowOffsets_=null,tracking.Brief.getDescriptors=function(t,r,n){for(var e=new Int32Array((n.length>>1)*(this.N>>5)),a=0,i=this.getRandomOffsets_(r),o=0,c=0;c<n.length;c+=2)for(var s=r*n[c+1]+n[c],g=0,h=0,k=this.N;h<k;h++)t[i[g++]+s]<t[i[g++]+s]&&(a|=1<<(31&h)),h+1&31||(e[o++]=a,a=0);return e},tracking.Brief.match=function(t,r,n,e){for(var a=t.length>>1,i=n.length>>1,o=new Array(a),c=0;c<a;c++){for(var s=1/0,g=0,h=0;h<i;h++){for(var k=0,f=0,u=this.N>>5;f<u;f++)k+=tracking.Math.hammingWeight(r[c*u+f]^e[h*u+f]);k<s&&(s=k,g=h)}o[c]={index1:c,index2:g,keypoint1:[t[2*c],t[2*c+1]],keypoint2:[n[2*g],n[2*g+1]],confidence:1-s/this.N}}return o},tracking.Brief.reciprocalMatch=function(t,r,n,e){var a=[];if(0===t.length||0===n.length)return a;for(var i=tracking.Brief.match(t,r,n,e),o=tracking.Brief.match(n,e,t,r),c=0;c<i.length;c++)o[i[c].index2].index2===c&&a.push(i[c]);return a},tracking.Brief.getRandomOffsets_=function(t){if(!this.randomWindowOffsets_){for(var r=0,n=new Int32Array(4*this.N),e=0;e<this.N;e++)n[r++]=Math.round(tracking.Math.uniformRandom(-15,16)),n[r++]=Math.round(tracking.Math.uniformRandom(-15,16)),n[r++]=Math.round(tracking.Math.uniformRandom(-15,16)),n[r++]=Math.round(tracking.Math.uniformRandom(-15,16));this.randomWindowOffsets_=n}if(!this.randomImageOffsets_[t]){for(var a=0,i=new Int32Array(2*this.N),o=0;o<this.N;o++)i[a++]=this.randomWindowOffsets_[4*o]*t+this.randomWindowOffsets_[4*o+1],i[a++]=this.randomWindowOffsets_[4*o+2]*t+this.randomWindowOffsets_[4*o+3];this.randomImageOffsets_[t]=i}return this.randomImageOffsets_[t]}}(),function(){tracking.Fast={},tracking.Fast.THRESHOLD=40,tracking.Fast.circles_={},tracking.Fast.findCorners=function(t,r,n,e){var a=this.getCircleOffsets_(r),i=new Int32Array(16),o=[];void 0===e&&(e=this.THRESHOLD);for(var c=3;c<n-3;c++)for(var s=3;s<r-3;s++){for(var g=c*r+s,h=t[g],k=0;k<16;k++)i[k]=t[g+a[k]];this.isCorner(h,i,e)&&(o.push(s,c),s+=3)}return o},tracking.Fast.isBrighter=function(t,r,n){return t-r>n},tracking.Fast.isCorner=function(t,r,n){if(this.isTriviallyExcluded(r,t,n))return!1;for(var e=0;e<16;e++){for(var a=!0,i=!0,o=0;o<9;o++){var c=r[e+o&15];if(!this.isBrighter(t,c,n)&&(i=!1,a===!1))break;if(!this.isDarker(t,c,n)&&(a=!1,i===!1))break}if(i||a)return!0}return!1},tracking.Fast.isDarker=function(t,r,n){return r-t>n},tracking.Fast.isTriviallyExcluded=function(t,r,n){var e=0,a=t[8],i=t[12],o=t[4],c=t[0];return this.isBrighter(c,r,n)&&e++,this.isBrighter(o,r,n)&&e++,this.isBrighter(a,r,n)&&e++,this.isBrighter(i,r,n)&&e++,e<3&&(e=0,this.isDarker(c,r,n)&&e++,this.isDarker(o,r,n)&&e++,this.isDarker(a,r,n)&&e++,this.isDarker(i,r,n)&&e++,e<3)},tracking.Fast.getCircleOffsets_=function(t){if(this.circles_[t])return this.circles_[t];var r=new Int32Array(16);return r[0]=-t-t-t,r[1]=r[0]+1,r[2]=r[1]+t+1,r[3]=r[2]+t+1,r[4]=r[3]+t,r[5]=r[4]+t,r[6]=r[5]+t-1,r[7]=r[6]+t-1,r[8]=r[7]-1,r[9]=r[8]-1,r[10]=r[9]-t-1,r[11]=r[10]-t-1,r[12]=r[11]-t,r[13]=r[12]-t,r[14]=r[13]-t+1,r[15]=r[14]-t+1,this.circles_[t]=r,r}}(),function(){tracking.Math={},tracking.Math.distance=function(t,r,n,e){var a=n-t,i=e-r;return Math.sqrt(a*a+i*i)},tracking.Math.hammingWeight=function(t){return t-=t>>1&1431655765,t=(858993459&t)+(t>>2&858993459),16843009*(t+(t>>4)&252645135)>>24},tracking.Math.uniformRandom=function(t,r){return t+Math.random()*(r-t)},tracking.Math.intersectRect=function(t,r,n,e,a,i,o,c){return!(a>n||o<t||i>e||c<r)}}(),function(){tracking.Matrix={},tracking.Matrix.forEach=function(t,r,n,e,a){a=a||1;for(var i=0;i<n;i+=a)for(var o=0;o<r;o+=a){var c=i*r*4+4*o;e.call(this,t[c],t[c+1],t[c+2],t[c+3],c,i,o)}},tracking.Matrix.sub=function(t,r){for(var n=tracking.Matrix.clone(t),e=0;e<n.length;e++)for(var a=0;a<n[e].length;a++)n[e][a]-=r[e][a];return n},tracking.Matrix.add=function(t,r){for(var n=tracking.Matrix.clone(t),e=0;e<n.length;e++)for(var a=0;a<n[e].length;a++)n[e][a]+=r[e][a];return n},tracking.Matrix.clone=function(t,r,n){r=r||t[0].length,n=n||t.length;for(var e=new Array(n),a=n;a--;){e[a]=new Array(r);for(var i=r;i--;)e[a][i]=t[a][i]}return e},tracking.Matrix.mulScalar=function(t,r){for(var n=tracking.Matrix.clone(r),e=0;e<r.length;e++)for(var a=0;a<r[e].length;a++)n[e][a]*=t;return n},tracking.Matrix.transpose=function(t){for(var r=new Array(t[0].length),n=0;n<t[0].length;n++){r[n]=new Array(t.length);for(var e=0;e<t.length;e++)r[n][e]=t[e][n]}return r},tracking.Matrix.mul=function(t,r){for(var n=new Array(t.length),e=0;e<t.length;e++){n[e]=new Array(r[0].length);for(var a=0;a<r[0].length;a++){n[e][a]=0;for(var i=0;i<t[0].length;i++)n[e][a]+=t[e][i]*r[i][a]}}return n},tracking.Matrix.norm=function(t){for(var r=0,n=0;n<t.length;n++)for(var e=0;e<t[n].length;e++)r+=t[n][e]*t[n][e];return Math.sqrt(r)},tracking.Matrix.calcCovarMatrix=function(t){for(var r=new Array(t.length),n=0;n<t.length;n++){r[n]=[0];for(var e=0;e<t[n].length;e++)r[n][0]+=t[n][e]/t[n].length}for(var a=tracking.Matrix.clone(r),n=0;n<a.length;n++)for(var e=0;e<t[0].length-1;e++)a[n].push(a[n][0]);var i=tracking.Matrix.sub(t,a),o=tracking.Matrix.transpose(i),c=tracking.Matrix.mul(o,i);return[c,r]}}(),function(){tracking.EPnP={},tracking.EPnP.solve=function(t,r,n){}}(),function(){tracking.Tracker=function(){tracking.Tracker.base(this,"constructor")},tracking.inherits(tracking.Tracker,tracking.EventEmitter),tracking.Tracker.prototype.track=function(){}}(),function(){tracking.TrackerTask=function(t){if(tracking.TrackerTask.base(this,"constructor"),!t)throw new Error("Tracker instance not specified.");this.setTracker(t)},tracking.inherits(tracking.TrackerTask,tracking.EventEmitter),tracking.TrackerTask.prototype.tracker_=null,tracking.TrackerTask.prototype.running_=!1,tracking.TrackerTask.prototype.getTracker=function(){return this.tracker_},tracking.TrackerTask.prototype.inRunning=function(){return this.running_},tracking.TrackerTask.prototype.setRunning=function(t){this.running_=t},tracking.TrackerTask.prototype.setTracker=function(t){this.tracker_=t},tracking.TrackerTask.prototype.run=function(){var t=this;if(!this.inRunning())return this.setRunning(!0),this.reemitTrackEvent_=function(r){t.emit("track",r)},this.tracker_.on("track",this.reemitTrackEvent_),this.emit("run"),this},tracking.TrackerTask.prototype.stop=function(){if(this.inRunning())return this.setRunning(!1),this.emit("stop"),this.tracker_.removeListener("track",this.reemitTrackEvent_),this}}(),function(){tracking.ColorTracker=function(t){tracking.ColorTracker.base(this,"constructor"),"string"==typeof t&&(t=[t]),t&&(t.forEach(function(t){if(!tracking.ColorTracker.getColor(t))throw new Error('Color not valid, try `new tracking.ColorTracker("magenta")`.')}),this.setColors(t))},tracking.inherits(tracking.ColorTracker,tracking.Tracker),tracking.ColorTracker.knownColors_={},tracking.ColorTracker.neighbours_={},tracking.ColorTracker.registerColor=function(t,r){tracking.ColorTracker.knownColors_[t]=r},tracking.ColorTracker.getColor=function(t){return tracking.ColorTracker.knownColors_[t]},tracking.ColorTracker.prototype.colors=["magenta"],tracking.ColorTracker.prototype.minDimension=20,tracking.ColorTracker.prototype.maxDimension=1/0,tracking.ColorTracker.prototype.minGroupSize=30,tracking.ColorTracker.prototype.calculateDimensions_=function(t,r){for(var n=-1,e=-1,a=1/0,i=1/0,o=0;o<r;o+=2){var c=t[o],s=t[o+1];c<a&&(a=c),c>n&&(n=c),s<i&&(i=s),s>e&&(e=s)}return{width:n-a,height:e-i,x:a,y:i}},tracking.ColorTracker.prototype.getColors=function(){return this.colors},tracking.ColorTracker.prototype.getMinDimension=function(){return this.minDimension},tracking.ColorTracker.prototype.getMaxDimension=function(){return this.maxDimension},tracking.ColorTracker.prototype.getMinGroupSize=function(){return this.minGroupSize},tracking.ColorTracker.prototype.getNeighboursForWidth_=function(t){if(tracking.ColorTracker.neighbours_[t])return tracking.ColorTracker.neighbours_[t];var r=new Int32Array(8);return r[0]=4*-t,r[1]=4*-t+4,r[2]=4,r[3]=4*t+4,r[4]=4*t,r[5]=4*t-4,r[6]=-4,r[7]=4*-t-4,tracking.ColorTracker.neighbours_[t]=r,r},tracking.ColorTracker.prototype.mergeRectangles_=function(t){for(var r,n=[],e=this.getMinDimension(),a=this.getMaxDimension(),i=0;i<t.length;i++){var o=t[i];r=!0;for(var c=i+1;c<t.length;c++){var s=t[c];if(tracking.Math.intersectRect(o.x,o.y,o.x+o.width,o.y+o.height,s.x,s.y,s.x+s.width,s.y+s.height)){r=!1;var g=Math.min(o.x,s.x),h=Math.min(o.y,s.y),k=Math.max(o.x+o.width,s.x+s.width),f=Math.max(o.y+o.height,s.y+s.height);s.height=f-h,s.width=k-g,s.x=g,s.y=h;break}}r&&o.width>=e&&o.height>=e&&o.width<=a&&o.height<=a&&n.push(o)}return n},tracking.ColorTracker.prototype.setColors=function(t){this.colors=t},tracking.ColorTracker.prototype.setMinDimension=function(t){this.minDimension=t},tracking.ColorTracker.prototype.setMaxDimension=function(t){this.maxDimension=t},tracking.ColorTracker.prototype.setMinGroupSize=function(t){this.minGroupSize=t},tracking.ColorTracker.prototype.track=function(t,r,n){var e=this,a=this.getColors();if(!a)throw new Error('Colors not specified, try `new tracking.ColorTracker("magenta")`.');var i=[];a.forEach(function(a){i=i.concat(e.trackColor_(t,r,n,a))}),this.emit("track",{data:i})},tracking.ColorTracker.prototype.trackColor_=function(n,e,a,i){var o,c,s,g,h,k=tracking.ColorTracker.knownColors_[i],f=new Int32Array(n.length>>2),u=new Int8Array(n.length),l=this.getMinGroupSize(),m=this.getNeighboursForWidth_(e),d=new Int32Array(n.length),v=[],p=-4;if(!k)return v;for(var y=0;y<a;y++)for(var w=0;w<e;w++)if(p+=4,!u[p]){for(o=0,h=-1,d[++h]=p,d[++h]=y,d[++h]=w,u[p]=1;h>=0;)if(s=d[h--],c=d[h--],g=d[h--],k(n[g],n[g+1],n[g+2],n[g+3],g,c,s)){f[o++]=s,f[o++]=c;for(var T=0;T<m.length;T++){var x=g+m[T],M=c+t[T],_=s+r[T];!u[x]&&M>=0&&M<a&&_>=0&&_<e&&(d[++h]=x,d[++h]=M,d[++h]=_,u[x]=1)}}if(o>=l){var C=this.calculateDimensions_(f,o);C&&(C.color=i,v.push(C))}}return this.mergeRectangles_(v)},tracking.ColorTracker.registerColor("cyan",function(t,r,n){var e=50,a=70,i=t-0,o=r-255,c=n-255;return r-t>=e&&n-t>=a||i*i+o*o+c*c<6400}),tracking.ColorTracker.registerColor("magenta",function(t,r,n){var e=50,a=t-255,i=r-0,o=n-255;return t-r>=e&&n-r>=e||a*a+i*i+o*o<19600}),tracking.ColorTracker.registerColor("yellow",function(t,r,n){var e=50,a=t-255,i=r-255,o=n-0;return t-n>=e&&r-n>=e||a*a+i*i+o*o<1e4});var t=new Int32Array([-1,-1,0,1,1,1,0,-1]),r=new Int32Array([0,1,1,1,0,-1,-1,-1])}(),function(){tracking.ObjectTracker=function(t){tracking.ObjectTracker.base(this,"constructor"),t&&(Array.isArray(t)||(t=[t]),Array.isArray(t)&&t.forEach(function(r,n){if("string"==typeof r&&(t[n]=tracking.ViolaJones.classifiers[r]),!t[n])throw new Error('Object classifier not valid, try `new tracking.ObjectTracker("face")`.')})),this.setClassifiers(t)},tracking.inherits(tracking.ObjectTracker,tracking.Tracker),tracking.ObjectTracker.prototype.edgesDensity=.2,tracking.ObjectTracker.prototype.initialScale=1,tracking.ObjectTracker.prototype.scaleFactor=1.25,tracking.ObjectTracker.prototype.stepSize=1.5,tracking.ObjectTracker.prototype.getClassifiers=function(){return this.classifiers},tracking.ObjectTracker.prototype.getEdgesDensity=function(){return this.edgesDensity},tracking.ObjectTracker.prototype.getInitialScale=function(){return this.initialScale},tracking.ObjectTracker.prototype.getScaleFactor=function(){return this.scaleFactor},tracking.ObjectTracker.prototype.getStepSize=function(){return this.stepSize},tracking.ObjectTracker.prototype.track=function(t,r,n){var e=this,a=this.getClassifiers();if(!a)throw new Error('Object classifier not specified, try `new tracking.ObjectTracker("face")`.');var i=[];a.forEach(function(a){i=i.concat(tracking.ViolaJones.detect(t,r,n,e.getInitialScale(),e.getScaleFactor(),e.getStepSize(),e.getEdgesDensity(),a))}),this.emit("track",{data:i})},tracking.ObjectTracker.prototype.setClassifiers=function(t){this.classifiers=t},tracking.ObjectTracker.prototype.setEdgesDensity=function(t){this.edgesDensity=t},tracking.ObjectTracker.prototype.setInitialScale=function(t){this.initialScale=t},tracking.ObjectTracker.prototype.setScaleFactor=function(t){this.scaleFactor=t},tracking.ObjectTracker.prototype.setStepSize=function(t){this.stepSize=t}}(),function(){tracking.LandmarksTracker=function(){tracking.LandmarksTracker.base(this,"constructor")},tracking.inherits(tracking.LandmarksTracker,tracking.ObjectTracker),tracking.LandmarksTracker.prototype.track=function(t,r,n){var e=tracking.ViolaJones.classifiers.face,a=tracking.ViolaJones.detect(t,r,n,this.getInitialScale(),this.getScaleFactor(),this.getStepSize(),this.getEdgesDensity(),e),i=tracking.LBF.align(t,r,n,a);this.emit("track",{data:{faces:a,landmarks:i}})}}(),function(){tracking.LBF={},tracking.LBF.Regressor=function(t){this.maxNumStages=t,this.rfs=new Array(t),this.models=new Array(t);for(var r=0;r<t;r++)this.rfs[r]=new tracking.LBF.RandomForest(r),this.models[r]=tracking.LBF.RegressorData[r].models;this.meanShape=tracking.LBF.LandmarksData},tracking.LBF.Regressor.prototype.predict=function(t,r,n,e){var a=[],i=[],o=[],c=tracking.Matrix.clone(this.meanShape);a.push({data:t,width:r,height:n}),o.push(e),i.push(tracking.LBF.projectShapeToBoundingBox_(c,e));for(var s=0;s<this.maxNumStages;s++){var g=tracking.LBF.Regressor.deriveBinaryFeat(this.rfs[s],a,i,o,c);this.applyGlobalPrediction(g,this.models[s],i,o)}return i[0]},tracking.LBF.Regressor.prototype.applyGlobalPrediction=function(t,r,n,e){for(var a=2*n[0].length,i=new Array(a/2),o=0;o<a/2;o++)i[o]=[0,0];for(var o=0;o<n.length;o++){for(var c=0;c<a;c++){for(var s=0,g=0,h=0;(h=t[o][g].index)!=-1;g++)h<=r[c].nr_feature&&(s+=r[c].data[h-1]*t[o][g].value);c<a/2?i[c][0]=s:i[c-a/2][1]=s}var k=tracking.LBF.similarityTransform_(tracking.LBF.unprojectShapeToBoundingBox_(n[o],e[o]),this.meanShape),f=(tracking.Matrix.transpose(k[0]),tracking.LBF.unprojectShapeToBoundingBox_(n[o],e[o]));f=tracking.Matrix.add(f,i),n[o]=tracking.LBF.projectShapeToBoundingBox_(f,e[o])}},tracking.LBF.Regressor.deriveBinaryFeat=function(t,r,n,e,a){for(var i=new Array(r.length),o=0;o<r.length;o++){var c=t.maxNumTrees*t.landmarkNum+1;i[o]=new Array(c);for(var s=0;s<c;s++)i[o][s]={}}for(var g=1<<t.maxDepth-1,o=0;o<r.length;o++){for(var h=tracking.LBF.unprojectShapeToBoundingBox_(n[o],e[o]),k=tracking.LBF.similarityTransform_(h,a),s=0;s<t.landmarkNum;s++)for(var f=0;f<t.maxNumTrees;f++){var u=tracking.LBF.Regressor.getCodeFromTree(t.rfs[s][f],r[o],n[o],e[o],k[0],k[1]),l=s*t.maxNumTrees+f;i[o][l].index=g*l+u,i[o][l].value=1}i[o][t.landmarkNum*t.maxNumTrees].index=-1,i[o][t.landmarkNum*t.maxNumTrees].value=-1}return i},tracking.LBF.Regressor.getCodeFromTree=function(t,r,n,e,a,i){for(var o=0,c=0;;){var s=Math.cos(t.nodes[o].feats[0])*t.nodes[o].feats[2]*t.maxRadioRadius*e.width,g=Math.sin(t.nodes[o].feats[0])*t.nodes[o].feats[2]*t.maxRadioRadius*e.height,h=Math.cos(t.nodes[o].feats[1])*t.nodes[o].feats[3]*t.maxRadioRadius*e.width,k=Math.sin(t.nodes[o].feats[1])*t.nodes[o].feats[3]*t.maxRadioRadius*e.height,f=a[0][0]*s+a[0][1]*g,u=a[1][0]*s+a[1][1]*g,l=Math.floor(f+n[t.landmarkID][0]),m=Math.floor(u+n[t.landmarkID][1]);l=Math.max(0,Math.min(l,r.height-1)),m=Math.max(0,Math.min(m,r.width-1));var d=a[0][0]*h+a[0][1]*k,v=a[1][0]*h+a[1][1]*k,p=Math.floor(d+n[t.landmarkID][0]),y=Math.floor(v+n[t.landmarkID][1]);p=Math.max(0,Math.min(p,r.height-1)),y=Math.max(0,Math.min(y,r.width-1));var w=Math.floor(r.data[m*r.width+l])-Math.floor(r.data[y*r.width+p]);if(o=w<t.nodes[o].thresh?t.nodes[o].cnodes[0]:t.nodes[o].cnodes[1],1==t.nodes[o].is_leafnode){c=1;for(var T=0;T<t.leafnodes.length;T++){if(t.leafnodes[T]==o)return c;c++}return c}}return c}}(),function(){tracking.LBF.maxNumStages=4,tracking.LBF.regressor_=null,tracking.LBF.align=function(t,r,n,e){null==tracking.LBF.regressor_&&(tracking.LBF.regressor_=new tracking.LBF.Regressor(tracking.LBF.maxNumStages)),t=tracking.Image.grayscale(t,r,n,!1),t=tracking.Image.equalizeHist(t,r,n);var a=new Array(e.length);for(var i in e){e[i].height=e[i].width;var o={};o.startX=e[i].x,o.startY=e[i].y,o.width=e[i].width,o.height=e[i].height,a[i]=tracking.LBF.regressor_.predict(t,r,n,o)}return a},tracking.LBF.unprojectShapeToBoundingBox_=function(t,r){for(var n=new Array(t.length),e=0;e<t.length;e++)n[e]=[(t[e][0]-r.startX)/r.width,(t[e][1]-r.startY)/r.height];return n},tracking.LBF.projectShapeToBoundingBox_=function(t,r){for(var n=new Array(t.length),e=0;e<t.length;e++)n[e]=[t[e][0]*r.width+r.startX,t[e][1]*r.height+r.startY];return n},tracking.LBF.similarityTransform_=function(t,r){for(var n=[0,0],e=[0,0],a=0;a<t.length;a++)n[0]+=t[a][0],n[1]+=t[a][1],e[0]+=r[a][0],e[1]+=r[a][1];n[0]/=t.length,n[1]/=t.length,e[0]/=r.length,e[1]/=r.length;for(var i=tracking.Matrix.clone(t),o=tracking.Matrix.clone(r),a=0;a<t.length;a++)i[a][0]-=n[0],i[a][1]-=n[1],o[a][0]-=e[0],o[a][1]-=e[1];var c,s,g,h,k=tracking.Matrix.calcCovarMatrix(i);c=k[0],g=k[1],k=tracking.Matrix.calcCovarMatrix(o),s=k[0],h=k[1];var f=Math.sqrt(tracking.Matrix.norm(c)),u=Math.sqrt(tracking.Matrix.norm(s)),l=f/u;i=tracking.Matrix.mulScalar(1/f,i),o=tracking.Matrix.mulScalar(1/u,o);for(var m=0,d=0,a=0;a<t.length;a++)m=m+i[a][1]*o[a][0]-i[a][0]*o[a][1],d=d+i[a][0]*o[a][0]+i[a][1]*o[a][1];var v=Math.sqrt(m*m+d*d),p=m/v,y=d/v,w=[[y,-p],[p,y]];return[w,l]},tracking.LBF.RandomForest=function(t){this.maxNumTrees=tracking.LBF.RegressorData[t].max_numtrees,this.landmarkNum=tracking.LBF.RegressorData[t].num_landmark,this.maxDepth=tracking.LBF.RegressorData[t].max_depth,this.stages=tracking.LBF.RegressorData[t].stages,this.rfs=new Array(this.landmarkNum);for(var r=0;r<this.landmarkNum;r++){this.rfs[r]=new Array(this.maxNumTrees);for(var n=0;n<this.maxNumTrees;n++)this.rfs[r][n]=new tracking.LBF.Tree(t,r,n)}},tracking.LBF.Tree=function(t,r,n){var e=tracking.LBF.RegressorData[t].landmarks[r][n];this.maxDepth=e.max_depth,this.maxNumNodes=e.max_numnodes,this.nodes=e.nodes,this.landmarkID=e.landmark_id,this.numLeafnodes=e.num_leafnodes,this.numNodes=e.num_nodes,this.maxNumFeats=e.max_numfeats,this.maxRadioRadius=e.max_radio_radius,this.leafnodes=e.id_leafnodes}}();

最有價值解答

浩瀚星空
其實你第一個參考資料就已經告訴你怎麼調用後置鏡頭了。

只是我不太明白你做了什麼努力就是了。

你貼的這段js也不過只是 tracking.js 辨識用的處理。
理論上你想了解它的程式碼,也得先解除一下他的壓縮排列法才容易看懂的的程式碼來改吧。
這部份我就不處理了。只給你提示對應。
老古
感激星空大的指點,不過小弟研究了一下 @@ (小弟對JQUERY 很不熟 QQ....努力學習中 = =....有問到笨問題請大大包含 QQ)
我這樣改不知道對不對......因為這樣改還是只會開啟前鏡頭 = =Q
不知道能否再指點我一下 QQ....超感恩 QQ


以下是我改的,從第9行到第23行
! function(t, r) {
    t.tracking = t.tracking || {}, tracking.inherits = function(t, r) {
        function n() {}
        n.prototype = r.prototype, t.superClass_ = r.prototype, t.prototype = new n, t.prototype.constructor = t, t.base = function(t, n) {
            var e = Array.prototype.slice.call(arguments, 2);
            return r.prototype[n].apply(t, e)
        }
    }, tracking.initUserMedia_ = function(r, n) {
    navigator.mediaDevices.enumerateDevices().then(function(devices) {
    devices = devices.filter(function(devices) { return devices.kind === 'videoinput'; });
    var videoinput_id = '';
    devices.forEach(function(device) {
        if(device.label.toLowerCase().search("back") &gt;-1){
             videoinput_id = device.deviceId;
        }
    });
    if(videoinput_id != ''){
        navigator.mediaDevices.getUserMedia({ video: { deviceId: {'exact':videoinput_id}, facingMode: 'environment' }}).then(successCallback);
    }else{
        navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' }}).then(successCallback);
    }

});
    }, tracking.isNode = function(t) {
        return t.nodeType || this.isWindow(t)
    }, tracking.isWindow = function(t) {
        return !!(t && t.alert && t.document)
    }, tracking.one = function(t, r) {
        return this.isNode(t) ? t : (r || document).querySelector(t)
    }, tracking.track = function(t, r, n) {
        if (t = tracking.one(t), !t) throw new Error("Element not found, try a different element or selector.");
        if (!r) throw new Error("Tracker not specified, try `tracking.track(element, new tracking.FaceTracker())`.");
        switch (t.nodeName.toLowerCase()) {
            case "canvas":
                return this.trackCanvas_(t, r, n);
            case "img":
                return this.trackImg_(t, r, n);
            case "video":
                return n && n.camera && this.initUserMedia_(t, n), this.trackVideo_(t, r, n);
            default:
                throw new Error("Element not supported, try in a canvas, img, or video.")
        }
    }, tracking.trackCanvas_ = function(t, r) {
        var n = this,
            e = new tracking.TrackerTask(r);
        return e.on("run", function() {
            n.trackCanvasInternal_(t, r)
        }), e.run()
    }, tracking.trackCanvasInternal_ = function(t, r) {
        var n = t.width,
            e = t.height,
            a = t.getContext("2d"),
            i = a.getImageData(0, 0, n, e);
        r.track(i.data, n, e)
    }, tracking.trackImg_ = function(t, r) {
        var n = t.width,
            e = t.height,
            a = document.createElement("canvas");
        a.width = n, a.height = e;
        var i = new tracking.TrackerTask(r);
        return i.on("run", function() {
            tracking.Canvas.loadImage(a, t.src, 0, 0, n, e, function() {
                tracking.trackCanvasInternal_(a, r)
            })
        }), i.run()
    }, tracking.trackVideo_ = function(r, n) {
        var e, a, i = document.createElement("canvas"),
            o = i.getContext("2d"),
            c = function() {
                e = r.offsetWidth, a = r.offsetHeight, i.width = e, i.height = a
            };
        c(), r.addEventListener("resize", c);
        var s, g = function() {
                s = t.requestAnimationFrame(function() {
                    if (r.readyState === r.HAVE_ENOUGH_DATA) {
                        try {
                            o.drawImage(r, 0, 0, e, a)
                        } catch (t) {}
                        tracking.trackCanvasInternal_(i, n)
                    }
                    g()
                })
            },
            h = new tracking.TrackerTask(n);
        return h.on("stop", function() {
            t.cancelAnimationFrame(s)
        }), h.on("run", function() {
            g()
        }), h.run()
    }, t.URL || (t.URL = t.URL || t.webkitURL || t.msURL || t.oURL), navigator.getUserMedia || (navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia)
}(window),
function() {
    tracking.EventEmitter = function() {}, tracking.EventEmitter.prototype.events_ = null, tracking.EventEmitter.prototype.addListener = function(t, r) {
        if ("function" != typeof r) throw new TypeError("Listener must be a function");
        return this.events_ || (this.events_ = {}), this.emit("newListener", t, r), this.events_[t] || (this.events_[t] = []), this.events_[t].push(r), this
    }, tracking.EventEmitter.prototype.listeners = function(t) {
        return this.events_ && this.events_[t]
    }, tracking.EventEmitter.prototype.emit = function(t) {
        var r = this.listeners(t);
        if (r) {
            for (var n = Array.prototype.slice.call(arguments, 1), e = 0; e < r.length; e++) r[e] && r[e].apply(this, n);
            return !0
        }
        return !1
    }, tracking.EventEmitter.prototype.on = tracking.EventEmitter.prototype.addListener, tracking.EventEmitter.prototype.once = function(t, r) {
        var n = this;
        n.on(t, function e() {
            n.removeListener(t, e), r.apply(this, arguments)
        })
    }, tracking.EventEmitter.prototype.removeAllListeners = function(t) {
        return this.events_ ? (t ? delete this.events_[t] : delete this.events_, this) : this
    }, tracking.EventEmitter.prototype.removeListener = function(t, r) {
        if ("function" != typeof r) throw new TypeError("Listener must be a function");
        if (!this.events_) return this;
        var n = this.listeners(t);
        if (Array.isArray(n)) {
            var e = n.indexOf(r);
            if (e < 0) return this;
            n.splice(e, 1)
        }
        return this
    }, tracking.EventEmitter.prototype.setMaxListeners = function() {
        throw new Error("Not implemented")
    }
}(),
function() {
    tracking.Canvas = {}, tracking.Canvas.loadImage = function(t, r, n, e, a, i, o) {
        var c = this,
            s = new window.Image;
        s.crossOrigin = "*", s.onload = function() {
            var r = t.getContext("2d");
            t.width = a, t.height = i, r.drawImage(s, n, e, a, i), o && o.call(c), s = null
        }, s.src = r
    }
}(),
function() {
    tracking.DisjointSet = function(t) {
        if (void 0 === t) throw new Error("DisjointSet length not specified.");
        this.length = t, this.parent = new Uint32Array(t);
        for (var r = 0; r < t; r++) this.parent[r] = r
    }, tracking.DisjointSet.prototype.length = null, tracking.DisjointSet.prototype.parent = null, tracking.DisjointSet.prototype.find = function(t) {
        return this.parent[t] === t ? t : this.parent[t] = this.find(this.parent[t])
    }, tracking.DisjointSet.prototype.union = function(t, r) {
        var n = this.find(t),
            e = this.find(r);
        this.parent[n] = e
    }
}(),
function() {
    tracking.Image = {}, tracking.Image.blur = function(t, r, n, e) {
        if (e = Math.abs(e), e <= 1) throw new Error("Diameter should be greater than 1.");
        for (var a = e / 2, i = Math.ceil(e) + (1 - Math.ceil(e) % 2), o = new Float32Array(i), c = (a + .5) / 3, s = c * c, g = 1 / Math.sqrt(2 * Math.PI * s), h = -1 / (2 * c * c), k = 0, f = Math.floor(i / 2), u = 0; u < i; u++) {
            var l = u - f,
                m = g * Math.exp(l * l * h);
            o[u] = m, k += m
        }
        for (var d = 0; d < o.length; d++) o[d] /= k;
        return this.separableConvolve(t, r, n, o, o, !1)
    }, tracking.Image.computeIntegralImage = function(t, r, n, e, a, i, o) {
        if (arguments.length < 4) throw new Error("You should specify at least one output array in the order: sum, square, tilted, sobel.");
        var c;
        o && (c = tracking.Image.sobel(t, r, n));
        for (var s = 0; s < n; s++)
            for (var g = 0; g < r; g++) {
                var h = s * r * 4 + 4 * g,
                    k = ~~(.299 * t[h] + .587 * t[h + 1] + .114 * t[h + 2]);
                if (e && this.computePixelValueSAT_(e, r, s, g, k), a && this.computePixelValueSAT_(a, r, s, g, k * k), i) {
                    var f = h - 4 * r,
                        u = ~~(.299 * t[f] + .587 * t[f + 1] + .114 * t[f + 2]);
                    this.computePixelValueRSAT_(i, r, s, g, k, u || 0)
                }
                o && this.computePixelValueSAT_(o, r, s, g, c[h])
            }
    }, tracking.Image.computePixelValueRSAT_ = function(t, r, n, e, a, i) {
        var o = n * r + e;
        t[o] = (t[o - r - 1] || 0) + (t[o - r + 1] || 0) - (t[o - r - r] || 0) + a + i
    }, tracking.Image.computePixelValueSAT_ = function(t, r, n, e, a) {
        var i = n * r + e;
        t[i] = (t[i - r] || 0) + (t[i - 1] || 0) + a - (t[i - r - 1] || 0)
    }, tracking.Image.grayscale = function(t, r, n, e) {
        for (var a = new Uint8ClampedArray(e ? t.length : t.length >> 2), i = 0, o = 0, c = 0; c < n; c++)
            for (var s = 0; s < r; s++) {
                var g = .299 * t[o] + .587 * t[o + 1] + .114 * t[o + 2];
                a[i++] = g, e && (a[i++] = g, a[i++] = g, a[i++] = t[o + 3]), o += 4
            }
        return a
    }, tracking.Image.horizontalConvolve = function(t, r, n, e, a) {
        for (var i = e.length, o = Math.floor(i / 2), c = new Float32Array(r * n * 4), s = a ? 1 : 0, g = 0; g < n; g++)
            for (var h = 0; h < r; h++) {
                for (var k = g, f = h, u = 4 * (g * r + h), l = 0, m = 0, d = 0, v = 0, p = 0; p < i; p++) {
                    var y = k,
                        w = Math.min(r - 1, Math.max(0, f + p - o)),
                        T = 4 * (y * r + w),
                        x = e[p];
                    l += t[T] * x, m += t[T + 1] * x, d += t[T + 2] * x, v += t[T + 3] * x
                }
                c[u] = l, c[u + 1] = m, c[u + 2] = d, c[u + 3] = v + s * (255 - v)
            }
        return c
    }, tracking.Image.verticalConvolve = function(t, r, n, e, a) {
        for (var i = e.length, o = Math.floor(i / 2), c = new Float32Array(r * n * 4), s = a ? 1 : 0, g = 0; g < n; g++)
            for (var h = 0; h < r; h++) {
                for (var k = g, f = h, u = 4 * (g * r + h), l = 0, m = 0, d = 0, v = 0, p = 0; p < i; p++) {
                    var y = Math.min(n - 1, Math.max(0, k + p - o)),
                        w = f,
                        T = 4 * (y * r + w),
                        x = e[p];
                    l += t[T] * x, m += t[T + 1] * x, d += t[T + 2] * x, v += t[T + 3] * x
                }
                c[u] = l, c[u + 1] = m, c[u + 2] = d, c[u + 3] = v + s * (255 - v)
            }
        return c
    }, tracking.Image.separableConvolve = function(t, r, n, e, a, i) {
        var o = this.verticalConvolve(t, r, n, a, i);
        return this.horizontalConvolve(o, r, n, e, i)
    }, tracking.Image.sobel = function(t, r, n) {
        t = this.grayscale(t, r, n, !0);
        for (var e = new Float32Array(r * n * 4), a = new Float32Array([-1, 0, 1]), i = new Float32Array([1, 2, 1]), o = this.separableConvolve(t, r, n, a, i), c = this.separableConvolve(t, r, n, i, a), s = 0; s < e.length; s += 4) {
            var g = o[s],
                h = c[s],
                k = Math.sqrt(h * h + g * g);
            e[s] = k, e[s + 1] = k, e[s + 2] = k, e[s + 3] = 255
        }
        return e
    }, tracking.Image.equalizeHist = function(t, r, n) {
        for (var e = new Uint8ClampedArray(t.length), a = new Array(256), i = 0; i < 256; i++) a[i] = 0;
        for (var i = 0; i < t.length; i++) e[i] = t[i], a[t[i]]++;
        for (var o = a[0], i = 0; i < 256; i++) a[i] += o, o = a[i];
        for (var c = 255 / t.length, i = 0; i < t.length; i++) e[i] = a[t[i]] * c + .5 | 0;
        return e
    }
}(),
function() {
    tracking.ViolaJones = {}, tracking.ViolaJones.REGIONS_OVERLAP = .5, tracking.ViolaJones.classifiers = {}, tracking.ViolaJones.detect = function(t, r, n, e, a, i, o, c) {
        var s, g = 0,
            h = [],
            k = new Int32Array(r * n),
            f = new Int32Array(r * n),
            u = new Int32Array(r * n);
        o > 0 && (s = new Int32Array(r * n)), tracking.Image.computeIntegralImage(t, r, n, k, f, u, s);
        for (var l = c[0], m = c[1], d = e * a, v = d * l | 0, p = d * m | 0; v < r && p < n;) {
            for (var y = d * i + .5 | 0, w = 0; w < n - p; w += y)
                for (var T = 0; T < r - v; T += y) o > 0 && this.isTriviallyExcluded(o, s, w, T, r, v, p) || this.evalStages_(c, k, f, u, w, T, r, v, p, d) && (h[g++] = {
                    width: v,
                    height: p,
                    x: T,
                    y: w
                });
            d *= a, v = d * l | 0, p = d * m | 0
        }
        return this.mergeRectangles_(h)
    }, tracking.ViolaJones.isTriviallyExcluded = function(t, r, n, e, a, i, o) {
        var c = n * a + e,
            s = c + i,
            g = c + o * a,
            h = g + i,
            k = (r[c] - r[s] - r[g] + r[h]) / (i * o * 255);
        return k < t
    }, tracking.ViolaJones.evalStages_ = function(t, r, n, e, a, i, o, c, s, g) {
        var h = 1 / (c * s),
            k = a * o + i,
            f = k + c,
            u = k + s * o,
            l = u + c,
            m = (r[k] - r[f] - r[u] + r[l]) * h,
            d = (n[k] - n[f] - n[u] + n[l]) * h - m * m,
            v = 1;
        d > 0 && (v = Math.sqrt(d));
        for (var p = t.length, y = 2; y < p;) {
            for (var w = 0, T = t[y++], x = t[y++]; x--;) {
                for (var M = 0, _ = t[y++], C = t[y++], E = 0; E < C; E++) {
                    var F, B, L, S, A = i + t[y++] * g + .5 | 0,
                        I = a + t[y++] * g + .5 | 0,
                        R = t[y++] * g + .5 | 0,
                        b = t[y++] * g + .5 | 0,
                        D = t[y++];
                    _ ? (F = A - b + R + (I + R + b - 1) * o, B = A + (I - 1) * o, L = A - b + (I + b - 1) * o, S = A + R + (I + R - 1) * o, M += (e[F] + e[B] - e[L] - e[S]) * D) : (F = I * o + A, B = F + R, L = F + b * o, S = L + R, M += (r[F] - r[B] - r[L] + r[S]) * D)
                }
                var O = t[y++],
                    N = t[y++],
                    j = t[y++];
                w += M * h < O * v ? N : j
            }
            if (w < T) return !1
        }
        return !0
    }, tracking.ViolaJones.mergeRectangles_ = function(t) {
        for (var r = new tracking.DisjointSet(t.length), n = 0; n < t.length; n++)
            for (var e = t[n], a = 0; a < t.length; a++) {
                var i = t[a];
                if (tracking.Math.intersectRect(e.x, e.y, e.x + e.width, e.y + e.height, i.x, i.y, i.x + i.width, i.y + i.height)) {
                    var o = Math.max(e.x, i.x),
                        c = Math.max(e.y, i.y),
                        s = Math.min(e.x + e.width, i.x + i.width),
                        g = Math.min(e.y + e.height, i.y + i.height),
                        h = (o - s) * (c - g),
                        k = e.width * e.height,
                        f = i.width * i.height;
                    h / (k * (k / f)) >= this.REGIONS_OVERLAP && h / (f * (k / f)) >= this.REGIONS_OVERLAP && r.union(n, a)
                }
            }
        for (var u = {}, l = 0; l < r.length; l++) {
            var m = r.find(l);
            u[m] ? (u[m].total++, u[m].width += t[l].width, u[m].height += t[l].height, u[m].x += t[l].x, u[m].y += t[l].y) : u[m] = {
                total: 1,
                width: t[l].width,
                height: t[l].height,
                x: t[l].x,
                y: t[l].y
            }
        }
        var d = [];
        return Object.keys(u).forEach(function(t) {
            var r = u[t];
            d.push({
                total: r.total,
                width: r.width / r.total + .5 | 0,
                height: r.height / r.total + .5 | 0,
                x: r.x / r.total + .5 | 0,
                y: r.y / r.total + .5 | 0
            })
        }), d
    }
}(),
function() {
    tracking.Brief = {}, tracking.Brief.N = 512, tracking.Brief.randomImageOffsets_ = {}, tracking.Brief.randomWindowOffsets_ = null, tracking.Brief.getDescriptors = function(t, r, n) {
        for (var e = new Int32Array((n.length >> 1) * (this.N >> 5)), a = 0, i = this.getRandomOffsets_(r), o = 0, c = 0; c < n.length; c += 2)
            for (var s = r * n[c + 1] + n[c], g = 0, h = 0, k = this.N; h < k; h++) t[i[g++] + s] < t[i[g++] + s] && (a |= 1 << (31 & h)), h + 1 & 31 || (e[o++] = a, a = 0);
        return e
    }, tracking.Brief.match = function(t, r, n, e) {
        for (var a = t.length >> 1, i = n.length >> 1, o = new Array(a), c = 0; c < a; c++) {
            for (var s = 1 / 0, g = 0, h = 0; h < i; h++) {
                for (var k = 0, f = 0, u = this.N >> 5; f < u; f++) k += tracking.Math.hammingWeight(r[c * u + f] ^ e[h * u + f]);
                k < s && (s = k, g = h)
            }
            o[c] = {
                index1: c,
                index2: g,
                keypoint1: [t[2 * c], t[2 * c + 1]],
                keypoint2: [n[2 * g], n[2 * g + 1]],
                confidence: 1 - s / this.N
            }
        }
        return o
    }, tracking.Brief.reciprocalMatch = function(t, r, n, e) {
        var a = [];
        if (0 === t.length || 0 === n.length) return a;
        for (var i = tracking.Brief.match(t, r, n, e), o = tracking.Brief.match(n, e, t, r), c = 0; c < i.length; c++) o[i[c].index2].index2 === c && a.push(i[c]);
        return a
    }, tracking.Brief.getRandomOffsets_ = function(t) {
        if (!this.randomWindowOffsets_) {
            for (var r = 0, n = new Int32Array(4 * this.N), e = 0; e < this.N; e++) n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16));
            this.randomWindowOffsets_ = n
        }
        if (!this.randomImageOffsets_[t]) {
            for (var a = 0, i = new Int32Array(2 * this.N), o = 0; o < this.N; o++) i[a++] = this.randomWindowOffsets_[4 * o] * t + this.randomWindowOffsets_[4 * o + 1], i[a++] = this.randomWindowOffsets_[4 * o + 2] * t + this.randomWindowOffsets_[4 * o + 3];
            this.randomImageOffsets_[t] = i
        }
        return this.randomImageOffsets_[t]
    }
}(),
function() {
    tracking.Fast = {}, tracking.Fast.THRESHOLD = 40, tracking.Fast.circles_ = {}, tracking.Fast.findCorners = function(t, r, n, e) {
        var a = this.getCircleOffsets_(r),
            i = new Int32Array(16),
            o = [];
        void 0 === e && (e = this.THRESHOLD);
        for (var c = 3; c < n - 3; c++)
            for (var s = 3; s < r - 3; s++) {
                for (var g = c * r + s, h = t[g], k = 0; k < 16; k++) i[k] = t[g + a[k]];
                this.isCorner(h, i, e) && (o.push(s, c), s += 3)
            }
        return o
    }, tracking.Fast.isBrighter = function(t, r, n) {
        return t - r > n
    }, tracking.Fast.isCorner = function(t, r, n) {
        if (this.isTriviallyExcluded(r, t, n)) return !1;
        for (var e = 0; e < 16; e++) {
            for (var a = !0, i = !0, o = 0; o < 9; o++) {
                var c = r[e + o & 15];
                if (!this.isBrighter(t, c, n) && (i = !1, a === !1)) break;
                if (!this.isDarker(t, c, n) && (a = !1, i === !1)) break
            }
            if (i || a) return !0
        }
        return !1
    }, tracking.Fast.isDarker = function(t, r, n) {
        return r - t > n
    }, tracking.Fast.isTriviallyExcluded = function(t, r, n) {
        var e = 0,
            a = t[8],
            i = t[12],
            o = t[4],
            c = t[0];
        return this.isBrighter(c, r, n) && e++, this.isBrighter(o, r, n) && e++, this.isBrighter(a, r, n) && e++, this.isBrighter(i, r, n) && e++, e < 3 && (e = 0, this.isDarker(c, r, n) && e++, this.isDarker(o, r, n) && e++, this.isDarker(a, r, n) && e++, this.isDarker(i, r, n) && e++, e < 3)
    }, tracking.Fast.getCircleOffsets_ = function(t) {
        if (this.circles_[t]) return this.circles_[t];
        var r = new Int32Array(16);
        return r[0] = -t - t - t, r[1] = r[0] + 1, r[2] = r[1] + t + 1, r[3] = r[2] + t + 1, r[4] = r[3] + t, r[5] = r[4] + t, r[6] = r[5] + t - 1, r[7] = r[6] + t - 1, r[8] = r[7] - 1, r[9] = r[8] - 1, r[10] = r[9] - t - 1, r[11] = r[10] - t - 1, r[12] = r[11] - t, r[13] = r[12] - t, r[14] = r[13] - t + 1, r[15] = r[14] - t + 1, this.circles_[t] = r, r
    }
}(),
function() {
    tracking.Math = {}, tracking.Math.distance = function(t, r, n, e) {
        var a = n - t,
            i = e - r;
        return Math.sqrt(a * a + i * i)
    }, tracking.Math.hammingWeight = function(t) {
        return t -= t >> 1 & 1431655765, t = (858993459 & t) + (t >> 2 & 858993459), 16843009 * (t + (t >> 4) & 252645135) >> 24
    }, tracking.Math.uniformRandom = function(t, r) {
        return t + Math.random() * (r - t)
    }, tracking.Math.intersectRect = function(t, r, n, e, a, i, o, c) {
        return !(a > n || o < t || i > e || c < r)
    }
}(),
function() {
    tracking.Matrix = {}, tracking.Matrix.forEach = function(t, r, n, e, a) {
        a = a || 1;
        for (var i = 0; i < n; i += a)
            for (var o = 0; o < r; o += a) {
                var c = i * r * 4 + 4 * o;
                e.call(this, t[c], t[c + 1], t[c + 2], t[c + 3], c, i, o)
            }
    }, tracking.Matrix.sub = function(t, r) {
        for (var n = tracking.Matrix.clone(t), e = 0; e < n.length; e++)
            for (var a = 0; a < n[e].length; a++) n[e][a] -= r[e][a];
        return n
    }, tracking.Matrix.add = function(t, r) {
        for (var n = tracking.Matrix.clone(t), e = 0; e < n.length; e++)
            for (var a = 0; a < n[e].length; a++) n[e][a] += r[e][a];
        return n
    }, tracking.Matrix.clone = function(t, r, n) {
        r = r || t[0].length, n = n || t.length;
        for (var e = new Array(n), a = n; a--;) {
            e[a] = new Array(r);
            for (var i = r; i--;) e[a][i] = t[a][i]
        }
        return e
    }, tracking.Matrix.mulScalar = function(t, r) {
        for (var n = tracking.Matrix.clone(r), e = 0; e < r.length; e++)
            for (var a = 0; a < r[e].length; a++) n[e][a] *= t;
        return n
    }, tracking.Matrix.transpose = function(t) {
        for (var r = new Array(t[0].length), n = 0; n < t[0].length; n++) {
            r[n] = new Array(t.length);
            for (var e = 0; e < t.length; e++) r[n][e] = t[e][n]
        }
        return r
    }, tracking.Matrix.mul = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) {
            n[e] = new Array(r[0].length);
            for (var a = 0; a < r[0].length; a++) {
                n[e][a] = 0;
                for (var i = 0; i < t[0].length; i++) n[e][a] += t[e][i] * r[i][a]
            }
        }
        return n
    }, tracking.Matrix.norm = function(t) {
        for (var r = 0, n = 0; n < t.length; n++)
            for (var e = 0; e < t[n].length; e++) r += t[n][e] * t[n][e];
        return Math.sqrt(r)
    }, tracking.Matrix.calcCovarMatrix = function(t) {
        for (var r = new Array(t.length), n = 0; n < t.length; n++) {
            r[n] = [0];
            for (var e = 0; e < t[n].length; e++) r[n][0] += t[n][e] / t[n].length
        }
        for (var a = tracking.Matrix.clone(r), n = 0; n < a.length; n++)
            for (var e = 0; e < t[0].length - 1; e++) a[n].push(a[n][0]);
        var i = tracking.Matrix.sub(t, a),
            o = tracking.Matrix.transpose(i),
            c = tracking.Matrix.mul(o, i);
        return [c, r]
    }
}(),
function() {
    tracking.EPnP = {}, tracking.EPnP.solve = function(t, r, n) {}
}(),
function() {
    tracking.Tracker = function() {
        tracking.Tracker.base(this, "constructor")
    }, tracking.inherits(tracking.Tracker, tracking.EventEmitter), tracking.Tracker.prototype.track = function() {}
}(),
function() {
    tracking.TrackerTask = function(t) {
        if (tracking.TrackerTask.base(this, "constructor"), !t) throw new Error("Tracker instance not specified.");
        this.setTracker(t)
    }, tracking.inherits(tracking.TrackerTask, tracking.EventEmitter), tracking.TrackerTask.prototype.tracker_ = null, tracking.TrackerTask.prototype.running_ = !1, tracking.TrackerTask.prototype.getTracker = function() {
        return this.tracker_
    }, tracking.TrackerTask.prototype.inRunning = function() {
        return this.running_
    }, tracking.TrackerTask.prototype.setRunning = function(t) {
        this.running_ = t
    }, tracking.TrackerTask.prototype.setTracker = function(t) {
        this.tracker_ = t
    }, tracking.TrackerTask.prototype.run = function() {
        var t = this;
        if (!this.inRunning()) return this.setRunning(!0), this.reemitTrackEvent_ = function(r) {
            t.emit("track", r)
        }, this.tracker_.on("track", this.reemitTrackEvent_), this.emit("run"), this
    }, tracking.TrackerTask.prototype.stop = function() {
        if (this.inRunning()) return this.setRunning(!1), this.emit("stop"), this.tracker_.removeListener("track", this.reemitTrackEvent_), this
    }
}(),
function() {
    tracking.ColorTracker = function(t) {
        tracking.ColorTracker.base(this, "constructor"), "string" == typeof t && (t = [t]), t && (t.forEach(function(t) {
            if (!tracking.ColorTracker.getColor(t)) throw new Error('Color not valid, try `new tracking.ColorTracker("magenta")`.')
        }), this.setColors(t))
    }, tracking.inherits(tracking.ColorTracker, tracking.Tracker), tracking.ColorTracker.knownColors_ = {}, tracking.ColorTracker.neighbours_ = {}, tracking.ColorTracker.registerColor = function(t, r) {
        tracking.ColorTracker.knownColors_[t] = r
    }, tracking.ColorTracker.getColor = function(t) {
        return tracking.ColorTracker.knownColors_[t]
    }, tracking.ColorTracker.prototype.colors = ["magenta"], tracking.ColorTracker.prototype.minDimension = 20, tracking.ColorTracker.prototype.maxDimension = 1 / 0, tracking.ColorTracker.prototype.minGroupSize = 30, tracking.ColorTracker.prototype.calculateDimensions_ = function(t, r) {
        for (var n = -1, e = -1, a = 1 / 0, i = 1 / 0, o = 0; o < r; o += 2) {
            var c = t[o],
                s = t[o + 1];
            c < a && (a = c), c > n && (n = c), s < i && (i = s), s > e && (e = s)
        }
        return {
            width: n - a,
            height: e - i,
            x: a,
            y: i
        }
    }, tracking.ColorTracker.prototype.getColors = function() {
        return this.colors
    }, tracking.ColorTracker.prototype.getMinDimension = function() {
        return this.minDimension
    }, tracking.ColorTracker.prototype.getMaxDimension = function() {
        return this.maxDimension
    }, tracking.ColorTracker.prototype.getMinGroupSize = function() {
        return this.minGroupSize
    }, tracking.ColorTracker.prototype.getNeighboursForWidth_ = function(t) {
        if (tracking.ColorTracker.neighbours_[t]) return tracking.ColorTracker.neighbours_[t];
        var r = new Int32Array(8);
        return r[0] = 4 * -t, r[1] = 4 * -t + 4, r[2] = 4, r[3] = 4 * t + 4, r[4] = 4 * t, r[5] = 4 * t - 4, r[6] = -4, r[7] = 4 * -t - 4, tracking.ColorTracker.neighbours_[t] = r, r
    }, tracking.ColorTracker.prototype.mergeRectangles_ = function(t) {
        for (var r, n = [], e = this.getMinDimension(), a = this.getMaxDimension(), i = 0; i < t.length; i++) {
            var o = t[i];
            r = !0;
            for (var c = i + 1; c < t.length; c++) {
                var s = t[c];
                if (tracking.Math.intersectRect(o.x, o.y, o.x + o.width, o.y + o.height, s.x, s.y, s.x + s.width, s.y + s.height)) {
                    r = !1;
                    var g = Math.min(o.x, s.x),
                        h = Math.min(o.y, s.y),
                        k = Math.max(o.x + o.width, s.x + s.width),
                        f = Math.max(o.y + o.height, s.y + s.height);
                    s.height = f - h, s.width = k - g, s.x = g, s.y = h;
                    break
                }
            }
            r && o.width >= e && o.height >= e && o.width <= a && o.height <= a && n.push(o)
        }
        return n
    }, tracking.ColorTracker.prototype.setColors = function(t) {
        this.colors = t
    }, tracking.ColorTracker.prototype.setMinDimension = function(t) {
        this.minDimension = t
    }, tracking.ColorTracker.prototype.setMaxDimension = function(t) {
        this.maxDimension = t
    }, tracking.ColorTracker.prototype.setMinGroupSize = function(t) {
        this.minGroupSize = t
    }, tracking.ColorTracker.prototype.track = function(t, r, n) {
        var e = this,
            a = this.getColors();
        if (!a) throw new Error('Colors not specified, try `new tracking.ColorTracker("magenta")`.');
        var i = [];
        a.forEach(function(a) {
            i = i.concat(e.trackColor_(t, r, n, a))
        }), this.emit("track", {
            data: i
        })
    }, tracking.ColorTracker.prototype.trackColor_ = function(n, e, a, i) {
        var o, c, s, g, h, k = tracking.ColorTracker.knownColors_[i],
            f = new Int32Array(n.length >> 2),
            u = new Int8Array(n.length),
            l = this.getMinGroupSize(),
            m = this.getNeighboursForWidth_(e),
            d = new Int32Array(n.length),
            v = [],
            p = -4;
        if (!k) return v;
        for (var y = 0; y < a; y++)
            for (var w = 0; w < e; w++)
                if (p += 4, !u[p]) {
                    for (o = 0, h = -1, d[++h] = p, d[++h] = y, d[++h] = w, u[p] = 1; h >= 0;)
                        if (s = d[h--], c = d[h--], g = d[h--], k(n[g], n[g + 1], n[g + 2], n[g + 3], g, c, s)) {
                            f[o++] = s, f[o++] = c;
                            for (var T = 0; T < m.length; T++) {
                                var x = g + m[T],
                                    M = c + t[T],
                                    _ = s + r[T];
                                !u[x] && M >= 0 && M < a && _ >= 0 && _ < e && (d[++h] = x, d[++h] = M, d[++h] = _, u[x] = 1)
                            }
                        } if (o >= l) {
                        var C = this.calculateDimensions_(f, o);
                        C && (C.color = i, v.push(C))
                    }
                } return this.mergeRectangles_(v)
    }, tracking.ColorTracker.registerColor("cyan", function(t, r, n) {
        var e = 50,
            a = 70,
            i = t - 0,
            o = r - 255,
            c = n - 255;
        return r - t >= e && n - t >= a || i * i + o * o + c * c < 6400
    }), tracking.ColorTracker.registerColor("magenta", function(t, r, n) {
        var e = 50,
            a = t - 255,
            i = r - 0,
            o = n - 255;
        return t - r >= e && n - r >= e || a * a + i * i + o * o < 19600
    }), tracking.ColorTracker.registerColor("yellow", function(t, r, n) {
        var e = 50,
            a = t - 255,
            i = r - 255,
            o = n - 0;
        return t - n >= e && r - n >= e || a * a + i * i + o * o < 1e4
    });
    var t = new Int32Array([-1, -1, 0, 1, 1, 1, 0, -1]),
        r = new Int32Array([0, 1, 1, 1, 0, -1, -1, -1])
}(),
function() {
    tracking.ObjectTracker = function(t) {
        tracking.ObjectTracker.base(this, "constructor"), t && (Array.isArray(t) || (t = [t]), Array.isArray(t) && t.forEach(function(r, n) {
            if ("string" == typeof r && (t[n] = tracking.ViolaJones.classifiers[r]), !t[n]) throw new Error('Object classifier not valid, try `new tracking.ObjectTracker("face")`.')
        })), this.setClassifiers(t)
    }, tracking.inherits(tracking.ObjectTracker, tracking.Tracker), tracking.ObjectTracker.prototype.edgesDensity = .2, tracking.ObjectTracker.prototype.initialScale = 1, tracking.ObjectTracker.prototype.scaleFactor = 1.25, tracking.ObjectTracker.prototype.stepSize = 1.5, tracking.ObjectTracker.prototype.getClassifiers = function() {
        return this.classifiers
    }, tracking.ObjectTracker.prototype.getEdgesDensity = function() {
        return this.edgesDensity
    }, tracking.ObjectTracker.prototype.getInitialScale = function() {
        return this.initialScale
    }, tracking.ObjectTracker.prototype.getScaleFactor = function() {
        return this.scaleFactor
    }, tracking.ObjectTracker.prototype.getStepSize = function() {
        return this.stepSize
    }, tracking.ObjectTracker.prototype.track = function(t, r, n) {
        var e = this,
            a = this.getClassifiers();
        if (!a) throw new Error('Object classifier not specified, try `new tracking.ObjectTracker("face")`.');
        var i = [];
        a.forEach(function(a) {
            i = i.concat(tracking.ViolaJones.detect(t, r, n, e.getInitialScale(), e.getScaleFactor(), e.getStepSize(), e.getEdgesDensity(), a))
        }), this.emit("track", {
            data: i
        })
    }, tracking.ObjectTracker.prototype.setClassifiers = function(t) {
        this.classifiers = t
    }, tracking.ObjectTracker.prototype.setEdgesDensity = function(t) {
        this.edgesDensity = t
    }, tracking.ObjectTracker.prototype.setInitialScale = function(t) {
        this.initialScale = t
    }, tracking.ObjectTracker.prototype.setScaleFactor = function(t) {
        this.scaleFactor = t
    }, tracking.ObjectTracker.prototype.setStepSize = function(t) {
        this.stepSize = t
    }
}(),
function() {
    tracking.LandmarksTracker = function() {
        tracking.LandmarksTracker.base(this, "constructor")
    }, tracking.inherits(tracking.LandmarksTracker, tracking.ObjectTracker), tracking.LandmarksTracker.prototype.track = function(t, r, n) {
        var e = tracking.ViolaJones.classifiers.face,
            a = tracking.ViolaJones.detect(t, r, n, this.getInitialScale(), this.getScaleFactor(), this.getStepSize(), this.getEdgesDensity(), e),
            i = tracking.LBF.align(t, r, n, a);
        this.emit("track", {
            data: {
                faces: a,
                landmarks: i
            }
        })
    }
}(),
function() {
    tracking.LBF = {}, tracking.LBF.Regressor = function(t) {
        this.maxNumStages = t, this.rfs = new Array(t), this.models = new Array(t);
        for (var r = 0; r < t; r++) this.rfs[r] = new tracking.LBF.RandomForest(r), this.models[r] = tracking.LBF.RegressorData[r].models;
        this.meanShape = tracking.LBF.LandmarksData
    }, tracking.LBF.Regressor.prototype.predict = function(t, r, n, e) {
        var a = [],
            i = [],
            o = [],
            c = tracking.Matrix.clone(this.meanShape);
        a.push({
            data: t,
            width: r,
            height: n
        }), o.push(e), i.push(tracking.LBF.projectShapeToBoundingBox_(c, e));
        for (var s = 0; s < this.maxNumStages; s++) {
            var g = tracking.LBF.Regressor.deriveBinaryFeat(this.rfs[s], a, i, o, c);
            this.applyGlobalPrediction(g, this.models[s], i, o)
        }
        return i[0]
    }, tracking.LBF.Regressor.prototype.applyGlobalPrediction = function(t, r, n, e) {
        for (var a = 2 * n[0].length, i = new Array(a / 2), o = 0; o < a / 2; o++) i[o] = [0, 0];
        for (var o = 0; o < n.length; o++) {
            for (var c = 0; c < a; c++) {
                for (var s = 0, g = 0, h = 0;
                    (h = t[o][g].index) != -1; g++) h <= r[c].nr_feature && (s += r[c].data[h - 1] * t[o][g].value);
                c < a / 2 ? i[c][0] = s : i[c - a / 2][1] = s
            }
            var k = tracking.LBF.similarityTransform_(tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]), this.meanShape),
                f = (tracking.Matrix.transpose(k[0]), tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]));
            f = tracking.Matrix.add(f, i), n[o] = tracking.LBF.projectShapeToBoundingBox_(f, e[o])
        }
    }, tracking.LBF.Regressor.deriveBinaryFeat = function(t, r, n, e, a) {
        for (var i = new Array(r.length), o = 0; o < r.length; o++) {
            var c = t.maxNumTrees * t.landmarkNum + 1;
            i[o] = new Array(c);
            for (var s = 0; s < c; s++) i[o][s] = {}
        }
        for (var g = 1 << t.maxDepth - 1, o = 0; o < r.length; o++) {
            for (var h = tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]), k = tracking.LBF.similarityTransform_(h, a), s = 0; s < t.landmarkNum; s++)
                for (var f = 0; f < t.maxNumTrees; f++) {
                    var u = tracking.LBF.Regressor.getCodeFromTree(t.rfs[s][f], r[o], n[o], e[o], k[0], k[1]),
                        l = s * t.maxNumTrees + f;
                    i[o][l].index = g * l + u, i[o][l].value = 1
                }
            i[o][t.landmarkNum * t.maxNumTrees].index = -1, i[o][t.landmarkNum * t.maxNumTrees].value = -1
        }
        return i
    }, tracking.LBF.Regressor.getCodeFromTree = function(t, r, n, e, a, i) {
        for (var o = 0, c = 0;;) {
            var s = Math.cos(t.nodes[o].feats[0]) * t.nodes[o].feats[2] * t.maxRadioRadius * e.width,
                g = Math.sin(t.nodes[o].feats[0]) * t.nodes[o].feats[2] * t.maxRadioRadius * e.height,
                h = Math.cos(t.nodes[o].feats[1]) * t.nodes[o].feats[3] * t.maxRadioRadius * e.width,
                k = Math.sin(t.nodes[o].feats[1]) * t.nodes[o].feats[3] * t.maxRadioRadius * e.height,
                f = a[0][0] * s + a[0][1] * g,
                u = a[1][0] * s + a[1][1] * g,
                l = Math.floor(f + n[t.landmarkID][0]),
                m = Math.floor(u + n[t.landmarkID][1]);
            l = Math.max(0, Math.min(l, r.height - 1)), m = Math.max(0, Math.min(m, r.width - 1));
            var d = a[0][0] * h + a[0][1] * k,
                v = a[1][0] * h + a[1][1] * k,
                p = Math.floor(d + n[t.landmarkID][0]),
                y = Math.floor(v + n[t.landmarkID][1]);
            p = Math.max(0, Math.min(p, r.height - 1)), y = Math.max(0, Math.min(y, r.width - 1));
            var w = Math.floor(r.data[m * r.width + l]) - Math.floor(r.data[y * r.width + p]);
            if (o = w < t.nodes[o].thresh ? t.nodes[o].cnodes[0] : t.nodes[o].cnodes[1], 1 == t.nodes[o].is_leafnode) {
                c = 1;
                for (var T = 0; T < t.leafnodes.length; T++) {
                    if (t.leafnodes[T] == o) return c;
                    c++
                }
                return c
            }
        }
        return c
    }
}(),
function() {
    tracking.LBF.maxNumStages = 4, tracking.LBF.regressor_ = null, tracking.LBF.align = function(t, r, n, e) {
        null == tracking.LBF.regressor_ && (tracking.LBF.regressor_ = new tracking.LBF.Regressor(tracking.LBF.maxNumStages)), t = tracking.Image.grayscale(t, r, n, !1), t = tracking.Image.equalizeHist(t, r, n);
        var a = new Array(e.length);
        for (var i in e) {
            e[i].height = e[i].width;
            var o = {};
            o.startX = e[i].x, o.startY = e[i].y, o.width = e[i].width, o.height = e[i].height, a[i] = tracking.LBF.regressor_.predict(t, r, n, o)
        }
        return a
    }, tracking.LBF.unprojectShapeToBoundingBox_ = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) n[e] = [(t[e][0] - r.startX) / r.width, (t[e][1] - r.startY) / r.height];
        return n
    }, tracking.LBF.projectShapeToBoundingBox_ = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) n[e] = [t[e][0] * r.width + r.startX, t[e][1] * r.height + r.startY];
        return n
    }, tracking.LBF.similarityTransform_ = function(t, r) {
        for (var n = [0, 0], e = [0, 0], a = 0; a < t.length; a++) n[0] += t[a][0], n[1] += t[a][1], e[0] += r[a][0], e[1] += r[a][1];
        n[0] /= t.length, n[1] /= t.length, e[0] /= r.length, e[1] /= r.length;
        for (var i = tracking.Matrix.clone(t), o = tracking.Matrix.clone(r), a = 0; a < t.length; a++) i[a][0] -= n[0], i[a][1] -= n[1], o[a][0] -= e[0], o[a][1] -= e[1];
        var c, s, g, h, k = tracking.Matrix.calcCovarMatrix(i);
        c = k[0], g = k[1], k = tracking.Matrix.calcCovarMatrix(o), s = k[0], h = k[1];
        var f = Math.sqrt(tracking.Matrix.norm(c)),
            u = Math.sqrt(tracking.Matrix.norm(s)),
            l = f / u;
        i = tracking.Matrix.mulScalar(1 / f, i), o = tracking.Matrix.mulScalar(1 / u, o);
        for (var m = 0, d = 0, a = 0; a < t.length; a++) m = m + i[a][1] * o[a][0] - i[a][0] * o[a][1], d = d + i[a][0] * o[a][0] + i[a][1] * o[a][1];
        var v = Math.sqrt(m * m + d * d),
            p = m / v,
            y = d / v,
            w = [
                [y, -p],
                [p, y]
            ];
        return [w, l]
    }, tracking.LBF.RandomForest = function(t) {
        this.maxNumTrees = tracking.LBF.RegressorData[t].max_numtrees, this.landmarkNum = tracking.LBF.RegressorData[t].num_landmark, this.maxDepth = tracking.LBF.RegressorData[t].max_depth, this.stages = tracking.LBF.RegressorData[t].stages, this.rfs = new Array(this.landmarkNum);
        for (var r = 0; r < this.landmarkNum; r++) {
            this.rfs[r] = new Array(this.maxNumTrees);
            for (var n = 0; n < this.maxNumTrees; n++) this.rfs[r][n] = new tracking.LBF.Tree(t, r, n)
        }
    }, tracking.LBF.Tree = function(t, r, n) {
        var e = tracking.LBF.RegressorData[t].landmarks[r][n];
        this.maxDepth = e.max_depth, this.maxNumNodes = e.max_numnodes, this.nodes = e.nodes, this.landmarkID = e.landmark_id, this.numLeafnodes = e.num_leafnodes, this.numNodes = e.num_nodes, this.maxNumFeats = e.max_numfeats, this.maxRadioRadius = e.max_radio_radius, this.leafnodes = e.id_leafnodes
    }
}();



以下是原始的JS (請問第9到第16行是不是就是開啟鏡頭的CODE呢0.0)


! function(t, r) {
    t.tracking = t.tracking || {}, tracking.inherits = function(t, r) {
        function n() {}
        n.prototype = r.prototype, t.superClass_ = r.prototype, t.prototype = new n, t.prototype.constructor = t, t.base = function(t, n) {
            var e = Array.prototype.slice.call(arguments, 2);
            return r.prototype[n].apply(t, e)
        }
    }, tracking.initUserMedia_ = function(r, n) {
        t.navigator.mediaDevices.getUserMedia({
            video: !0,
            audio: !(!n || !n.audio)
        }).then(function(t) {
            r.srcObject = t
        })["catch"](function(t) {
            throw Error("Cannot capture user camera.")
        })
    }, tracking.isNode = function(t) {
        return t.nodeType || this.isWindow(t)
    }, tracking.isWindow = function(t) {
        return !!(t && t.alert && t.document)
    }, tracking.one = function(t, r) {
        return this.isNode(t) ? t : (r || document).querySelector(t)
    }, tracking.track = function(t, r, n) {
        if (t = tracking.one(t), !t) throw new Error("Element not found, try a different element or selector.");
        if (!r) throw new Error("Tracker not specified, try `tracking.track(element, new tracking.FaceTracker())`.");
        switch (t.nodeName.toLowerCase()) {
            case "canvas":
                return this.trackCanvas_(t, r, n);
            case "img":
                return this.trackImg_(t, r, n);
            case "video":
                return n && n.camera && this.initUserMedia_(t, n), this.trackVideo_(t, r, n);
            default:
                throw new Error("Element not supported, try in a canvas, img, or video.")
        }
    }, tracking.trackCanvas_ = function(t, r) {
        var n = this,
            e = new tracking.TrackerTask(r);
        return e.on("run", function() {
            n.trackCanvasInternal_(t, r)
        }), e.run()
    }, tracking.trackCanvasInternal_ = function(t, r) {
        var n = t.width,
            e = t.height,
            a = t.getContext("2d"),
            i = a.getImageData(0, 0, n, e);
        r.track(i.data, n, e)
    }, tracking.trackImg_ = function(t, r) {
        var n = t.width,
            e = t.height,
            a = document.createElement("canvas");
        a.width = n, a.height = e;
        var i = new tracking.TrackerTask(r);
        return i.on("run", function() {
            tracking.Canvas.loadImage(a, t.src, 0, 0, n, e, function() {
                tracking.trackCanvasInternal_(a, r)
            })
        }), i.run()
    }, tracking.trackVideo_ = function(r, n) {
        var e, a, i = document.createElement("canvas"),
            o = i.getContext("2d"),
            c = function() {
                e = r.offsetWidth, a = r.offsetHeight, i.width = e, i.height = a
            };
        c(), r.addEventListener("resize", c);
        var s, g = function() {
                s = t.requestAnimationFrame(function() {
                    if (r.readyState === r.HAVE_ENOUGH_DATA) {
                        try {
                            o.drawImage(r, 0, 0, e, a)
                        } catch (t) {}
                        tracking.trackCanvasInternal_(i, n)
                    }
                    g()
                })
            },
            h = new tracking.TrackerTask(n);
        return h.on("stop", function() {
            t.cancelAnimationFrame(s)
        }), h.on("run", function() {
            g()
        }), h.run()
    }, t.URL || (t.URL = t.URL || t.webkitURL || t.msURL || t.oURL), navigator.getUserMedia || (navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia)
}(window),
function() {
    tracking.EventEmitter = function() {}, tracking.EventEmitter.prototype.events_ = null, tracking.EventEmitter.prototype.addListener = function(t, r) {
        if ("function" != typeof r) throw new TypeError("Listener must be a function");
        return this.events_ || (this.events_ = {}), this.emit("newListener", t, r), this.events_[t] || (this.events_[t] = []), this.events_[t].push(r), this
    }, tracking.EventEmitter.prototype.listeners = function(t) {
        return this.events_ && this.events_[t]
    }, tracking.EventEmitter.prototype.emit = function(t) {
        var r = this.listeners(t);
        if (r) {
            for (var n = Array.prototype.slice.call(arguments, 1), e = 0; e < r.length; e++) r[e] && r[e].apply(this, n);
            return !0
        }
        return !1
    }, tracking.EventEmitter.prototype.on = tracking.EventEmitter.prototype.addListener, tracking.EventEmitter.prototype.once = function(t, r) {
        var n = this;
        n.on(t, function e() {
            n.removeListener(t, e), r.apply(this, arguments)
        })
    }, tracking.EventEmitter.prototype.removeAllListeners = function(t) {
        return this.events_ ? (t ? delete this.events_[t] : delete this.events_, this) : this
    }, tracking.EventEmitter.prototype.removeListener = function(t, r) {
        if ("function" != typeof r) throw new TypeError("Listener must be a function");
        if (!this.events_) return this;
        var n = this.listeners(t);
        if (Array.isArray(n)) {
            var e = n.indexOf(r);
            if (e < 0) return this;
            n.splice(e, 1)
        }
        return this
    }, tracking.EventEmitter.prototype.setMaxListeners = function() {
        throw new Error("Not implemented")
    }
}(),
function() {
    tracking.Canvas = {}, tracking.Canvas.loadImage = function(t, r, n, e, a, i, o) {
        var c = this,
            s = new window.Image;
        s.crossOrigin = "*", s.onload = function() {
            var r = t.getContext("2d");
            t.width = a, t.height = i, r.drawImage(s, n, e, a, i), o && o.call(c), s = null
        }, s.src = r
    }
}(),
function() {
    tracking.DisjointSet = function(t) {
        if (void 0 === t) throw new Error("DisjointSet length not specified.");
        this.length = t, this.parent = new Uint32Array(t);
        for (var r = 0; r < t; r++) this.parent[r] = r
    }, tracking.DisjointSet.prototype.length = null, tracking.DisjointSet.prototype.parent = null, tracking.DisjointSet.prototype.find = function(t) {
        return this.parent[t] === t ? t : this.parent[t] = this.find(this.parent[t])
    }, tracking.DisjointSet.prototype.union = function(t, r) {
        var n = this.find(t),
            e = this.find(r);
        this.parent[n] = e
    }
}(),
function() {
    tracking.Image = {}, tracking.Image.blur = function(t, r, n, e) {
        if (e = Math.abs(e), e <= 1) throw new Error("Diameter should be greater than 1.");
        for (var a = e / 2, i = Math.ceil(e) + (1 - Math.ceil(e) % 2), o = new Float32Array(i), c = (a + .5) / 3, s = c * c, g = 1 / Math.sqrt(2 * Math.PI * s), h = -1 / (2 * c * c), k = 0, f = Math.floor(i / 2), u = 0; u < i; u++) {
            var l = u - f,
                m = g * Math.exp(l * l * h);
            o[u] = m, k += m
        }
        for (var d = 0; d < o.length; d++) o[d] /= k;
        return this.separableConvolve(t, r, n, o, o, !1)
    }, tracking.Image.computeIntegralImage = function(t, r, n, e, a, i, o) {
        if (arguments.length < 4) throw new Error("You should specify at least one output array in the order: sum, square, tilted, sobel.");
        var c;
        o && (c = tracking.Image.sobel(t, r, n));
        for (var s = 0; s < n; s++)
            for (var g = 0; g < r; g++) {
                var h = s * r * 4 + 4 * g,
                    k = ~~(.299 * t[h] + .587 * t[h + 1] + .114 * t[h + 2]);
                if (e && this.computePixelValueSAT_(e, r, s, g, k), a && this.computePixelValueSAT_(a, r, s, g, k * k), i) {
                    var f = h - 4 * r,
                        u = ~~(.299 * t[f] + .587 * t[f + 1] + .114 * t[f + 2]);
                    this.computePixelValueRSAT_(i, r, s, g, k, u || 0)
                }
                o && this.computePixelValueSAT_(o, r, s, g, c[h])
            }
    }, tracking.Image.computePixelValueRSAT_ = function(t, r, n, e, a, i) {
        var o = n * r + e;
        t[o] = (t[o - r - 1] || 0) + (t[o - r + 1] || 0) - (t[o - r - r] || 0) + a + i
    }, tracking.Image.computePixelValueSAT_ = function(t, r, n, e, a) {
        var i = n * r + e;
        t[i] = (t[i - r] || 0) + (t[i - 1] || 0) + a - (t[i - r - 1] || 0)
    }, tracking.Image.grayscale = function(t, r, n, e) {
        for (var a = new Uint8ClampedArray(e ? t.length : t.length >> 2), i = 0, o = 0, c = 0; c < n; c++)
            for (var s = 0; s < r; s++) {
                var g = .299 * t[o] + .587 * t[o + 1] + .114 * t[o + 2];
                a[i++] = g, e && (a[i++] = g, a[i++] = g, a[i++] = t[o + 3]), o += 4
            }
        return a
    }, tracking.Image.horizontalConvolve = function(t, r, n, e, a) {
        for (var i = e.length, o = Math.floor(i / 2), c = new Float32Array(r * n * 4), s = a ? 1 : 0, g = 0; g < n; g++)
            for (var h = 0; h < r; h++) {
                for (var k = g, f = h, u = 4 * (g * r + h), l = 0, m = 0, d = 0, v = 0, p = 0; p < i; p++) {
                    var y = k,
                        w = Math.min(r - 1, Math.max(0, f + p - o)),
                        T = 4 * (y * r + w),
                        x = e[p];
                    l += t[T] * x, m += t[T + 1] * x, d += t[T + 2] * x, v += t[T + 3] * x
                }
                c[u] = l, c[u + 1] = m, c[u + 2] = d, c[u + 3] = v + s * (255 - v)
            }
        return c
    }, tracking.Image.verticalConvolve = function(t, r, n, e, a) {
        for (var i = e.length, o = Math.floor(i / 2), c = new Float32Array(r * n * 4), s = a ? 1 : 0, g = 0; g < n; g++)
            for (var h = 0; h < r; h++) {
                for (var k = g, f = h, u = 4 * (g * r + h), l = 0, m = 0, d = 0, v = 0, p = 0; p < i; p++) {
                    var y = Math.min(n - 1, Math.max(0, k + p - o)),
                        w = f,
                        T = 4 * (y * r + w),
                        x = e[p];
                    l += t[T] * x, m += t[T + 1] * x, d += t[T + 2] * x, v += t[T + 3] * x
                }
                c[u] = l, c[u + 1] = m, c[u + 2] = d, c[u + 3] = v + s * (255 - v)
            }
        return c
    }, tracking.Image.separableConvolve = function(t, r, n, e, a, i) {
        var o = this.verticalConvolve(t, r, n, a, i);
        return this.horizontalConvolve(o, r, n, e, i)
    }, tracking.Image.sobel = function(t, r, n) {
        t = this.grayscale(t, r, n, !0);
        for (var e = new Float32Array(r * n * 4), a = new Float32Array([-1, 0, 1]), i = new Float32Array([1, 2, 1]), o = this.separableConvolve(t, r, n, a, i), c = this.separableConvolve(t, r, n, i, a), s = 0; s < e.length; s += 4) {
            var g = o[s],
                h = c[s],
                k = Math.sqrt(h * h + g * g);
            e[s] = k, e[s + 1] = k, e[s + 2] = k, e[s + 3] = 255
        }
        return e
    }, tracking.Image.equalizeHist = function(t, r, n) {
        for (var e = new Uint8ClampedArray(t.length), a = new Array(256), i = 0; i < 256; i++) a[i] = 0;
        for (var i = 0; i < t.length; i++) e[i] = t[i], a[t[i]]++;
        for (var o = a[0], i = 0; i < 256; i++) a[i] += o, o = a[i];
        for (var c = 255 / t.length, i = 0; i < t.length; i++) e[i] = a[t[i]] * c + .5 | 0;
        return e
    }
}(),
function() {
    tracking.ViolaJones = {}, tracking.ViolaJones.REGIONS_OVERLAP = .5, tracking.ViolaJones.classifiers = {}, tracking.ViolaJones.detect = function(t, r, n, e, a, i, o, c) {
        var s, g = 0,
            h = [],
            k = new Int32Array(r * n),
            f = new Int32Array(r * n),
            u = new Int32Array(r * n);
        o > 0 && (s = new Int32Array(r * n)), tracking.Image.computeIntegralImage(t, r, n, k, f, u, s);
        for (var l = c[0], m = c[1], d = e * a, v = d * l | 0, p = d * m | 0; v < r && p < n;) {
            for (var y = d * i + .5 | 0, w = 0; w < n - p; w += y)
                for (var T = 0; T < r - v; T += y) o > 0 && this.isTriviallyExcluded(o, s, w, T, r, v, p) || this.evalStages_(c, k, f, u, w, T, r, v, p, d) && (h[g++] = {
                    width: v,
                    height: p,
                    x: T,
                    y: w
                });
            d *= a, v = d * l | 0, p = d * m | 0
        }
        return this.mergeRectangles_(h)
    }, tracking.ViolaJones.isTriviallyExcluded = function(t, r, n, e, a, i, o) {
        var c = n * a + e,
            s = c + i,
            g = c + o * a,
            h = g + i,
            k = (r[c] - r[s] - r[g] + r[h]) / (i * o * 255);
        return k < t
    }, tracking.ViolaJones.evalStages_ = function(t, r, n, e, a, i, o, c, s, g) {
        var h = 1 / (c * s),
            k = a * o + i,
            f = k + c,
            u = k + s * o,
            l = u + c,
            m = (r[k] - r[f] - r[u] + r[l]) * h,
            d = (n[k] - n[f] - n[u] + n[l]) * h - m * m,
            v = 1;
        d > 0 && (v = Math.sqrt(d));
        for (var p = t.length, y = 2; y < p;) {
            for (var w = 0, T = t[y++], x = t[y++]; x--;) {
                for (var M = 0, _ = t[y++], C = t[y++], E = 0; E < C; E++) {
                    var F, B, L, S, A = i + t[y++] * g + .5 | 0,
                        I = a + t[y++] * g + .5 | 0,
                        R = t[y++] * g + .5 | 0,
                        b = t[y++] * g + .5 | 0,
                        D = t[y++];
                    _ ? (F = A - b + R + (I + R + b - 1) * o, B = A + (I - 1) * o, L = A - b + (I + b - 1) * o, S = A + R + (I + R - 1) * o, M += (e[F] + e[B] - e[L] - e[S]) * D) : (F = I * o + A, B = F + R, L = F + b * o, S = L + R, M += (r[F] - r[B] - r[L] + r[S]) * D)
                }
                var O = t[y++],
                    N = t[y++],
                    j = t[y++];
                w += M * h < O * v ? N : j
            }
            if (w < T) return !1
        }
        return !0
    }, tracking.ViolaJones.mergeRectangles_ = function(t) {
        for (var r = new tracking.DisjointSet(t.length), n = 0; n < t.length; n++)
            for (var e = t[n], a = 0; a < t.length; a++) {
                var i = t[a];
                if (tracking.Math.intersectRect(e.x, e.y, e.x + e.width, e.y + e.height, i.x, i.y, i.x + i.width, i.y + i.height)) {
                    var o = Math.max(e.x, i.x),
                        c = Math.max(e.y, i.y),
                        s = Math.min(e.x + e.width, i.x + i.width),
                        g = Math.min(e.y + e.height, i.y + i.height),
                        h = (o - s) * (c - g),
                        k = e.width * e.height,
                        f = i.width * i.height;
                    h / (k * (k / f)) >= this.REGIONS_OVERLAP && h / (f * (k / f)) >= this.REGIONS_OVERLAP && r.union(n, a)
                }
            }
        for (var u = {}, l = 0; l < r.length; l++) {
            var m = r.find(l);
            u[m] ? (u[m].total++, u[m].width += t[l].width, u[m].height += t[l].height, u[m].x += t[l].x, u[m].y += t[l].y) : u[m] = {
                total: 1,
                width: t[l].width,
                height: t[l].height,
                x: t[l].x,
                y: t[l].y
            }
        }
        var d = [];
        return Object.keys(u).forEach(function(t) {
            var r = u[t];
            d.push({
                total: r.total,
                width: r.width / r.total + .5 | 0,
                height: r.height / r.total + .5 | 0,
                x: r.x / r.total + .5 | 0,
                y: r.y / r.total + .5 | 0
            })
        }), d
    }
}(),
function() {
    tracking.Brief = {}, tracking.Brief.N = 512, tracking.Brief.randomImageOffsets_ = {}, tracking.Brief.randomWindowOffsets_ = null, tracking.Brief.getDescriptors = function(t, r, n) {
        for (var e = new Int32Array((n.length >> 1) * (this.N >> 5)), a = 0, i = this.getRandomOffsets_(r), o = 0, c = 0; c < n.length; c += 2)
            for (var s = r * n[c + 1] + n[c], g = 0, h = 0, k = this.N; h < k; h++) t[i[g++] + s] < t[i[g++] + s] && (a |= 1 << (31 & h)), h + 1 & 31 || (e[o++] = a, a = 0);
        return e
    }, tracking.Brief.match = function(t, r, n, e) {
        for (var a = t.length >> 1, i = n.length >> 1, o = new Array(a), c = 0; c < a; c++) {
            for (var s = 1 / 0, g = 0, h = 0; h < i; h++) {
                for (var k = 0, f = 0, u = this.N >> 5; f < u; f++) k += tracking.Math.hammingWeight(r[c * u + f] ^ e[h * u + f]);
                k < s && (s = k, g = h)
            }
            o[c] = {
                index1: c,
                index2: g,
                keypoint1: [t[2 * c], t[2 * c + 1]],
                keypoint2: [n[2 * g], n[2 * g + 1]],
                confidence: 1 - s / this.N
            }
        }
        return o
    }, tracking.Brief.reciprocalMatch = function(t, r, n, e) {
        var a = [];
        if (0 === t.length || 0 === n.length) return a;
        for (var i = tracking.Brief.match(t, r, n, e), o = tracking.Brief.match(n, e, t, r), c = 0; c < i.length; c++) o[i[c].index2].index2 === c && a.push(i[c]);
        return a
    }, tracking.Brief.getRandomOffsets_ = function(t) {
        if (!this.randomWindowOffsets_) {
            for (var r = 0, n = new Int32Array(4 * this.N), e = 0; e < this.N; e++) n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)), n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16));
            this.randomWindowOffsets_ = n
        }
        if (!this.randomImageOffsets_[t]) {
            for (var a = 0, i = new Int32Array(2 * this.N), o = 0; o < this.N; o++) i[a++] = this.randomWindowOffsets_[4 * o] * t + this.randomWindowOffsets_[4 * o + 1], i[a++] = this.randomWindowOffsets_[4 * o + 2] * t + this.randomWindowOffsets_[4 * o + 3];
            this.randomImageOffsets_[t] = i
        }
        return this.randomImageOffsets_[t]
    }
}(),
function() {
    tracking.Fast = {}, tracking.Fast.THRESHOLD = 40, tracking.Fast.circles_ = {}, tracking.Fast.findCorners = function(t, r, n, e) {
        var a = this.getCircleOffsets_(r),
            i = new Int32Array(16),
            o = [];
        void 0 === e && (e = this.THRESHOLD);
        for (var c = 3; c < n - 3; c++)
            for (var s = 3; s < r - 3; s++) {
                for (var g = c * r + s, h = t[g], k = 0; k < 16; k++) i[k] = t[g + a[k]];
                this.isCorner(h, i, e) && (o.push(s, c), s += 3)
            }
        return o
    }, tracking.Fast.isBrighter = function(t, r, n) {
        return t - r > n
    }, tracking.Fast.isCorner = function(t, r, n) {
        if (this.isTriviallyExcluded(r, t, n)) return !1;
        for (var e = 0; e < 16; e++) {
            for (var a = !0, i = !0, o = 0; o < 9; o++) {
                var c = r[e + o & 15];
                if (!this.isBrighter(t, c, n) && (i = !1, a === !1)) break;
                if (!this.isDarker(t, c, n) && (a = !1, i === !1)) break
            }
            if (i || a) return !0
        }
        return !1
    }, tracking.Fast.isDarker = function(t, r, n) {
        return r - t > n
    }, tracking.Fast.isTriviallyExcluded = function(t, r, n) {
        var e = 0,
            a = t[8],
            i = t[12],
            o = t[4],
            c = t[0];
        return this.isBrighter(c, r, n) && e++, this.isBrighter(o, r, n) && e++, this.isBrighter(a, r, n) && e++, this.isBrighter(i, r, n) && e++, e < 3 && (e = 0, this.isDarker(c, r, n) && e++, this.isDarker(o, r, n) && e++, this.isDarker(a, r, n) && e++, this.isDarker(i, r, n) && e++, e < 3)
    }, tracking.Fast.getCircleOffsets_ = function(t) {
        if (this.circles_[t]) return this.circles_[t];
        var r = new Int32Array(16);
        return r[0] = -t - t - t, r[1] = r[0] + 1, r[2] = r[1] + t + 1, r[3] = r[2] + t + 1, r[4] = r[3] + t, r[5] = r[4] + t, r[6] = r[5] + t - 1, r[7] = r[6] + t - 1, r[8] = r[7] - 1, r[9] = r[8] - 1, r[10] = r[9] - t - 1, r[11] = r[10] - t - 1, r[12] = r[11] - t, r[13] = r[12] - t, r[14] = r[13] - t + 1, r[15] = r[14] - t + 1, this.circles_[t] = r, r
    }
}(),
function() {
    tracking.Math = {}, tracking.Math.distance = function(t, r, n, e) {
        var a = n - t,
            i = e - r;
        return Math.sqrt(a * a + i * i)
    }, tracking.Math.hammingWeight = function(t) {
        return t -= t >> 1 & 1431655765, t = (858993459 & t) + (t >> 2 & 858993459), 16843009 * (t + (t >> 4) & 252645135) >> 24
    }, tracking.Math.uniformRandom = function(t, r) {
        return t + Math.random() * (r - t)
    }, tracking.Math.intersectRect = function(t, r, n, e, a, i, o, c) {
        return !(a > n || o < t || i > e || c < r)
    }
}(),
function() {
    tracking.Matrix = {}, tracking.Matrix.forEach = function(t, r, n, e, a) {
        a = a || 1;
        for (var i = 0; i < n; i += a)
            for (var o = 0; o < r; o += a) {
                var c = i * r * 4 + 4 * o;
                e.call(this, t[c], t[c + 1], t[c + 2], t[c + 3], c, i, o)
            }
    }, tracking.Matrix.sub = function(t, r) {
        for (var n = tracking.Matrix.clone(t), e = 0; e < n.length; e++)
            for (var a = 0; a < n[e].length; a++) n[e][a] -= r[e][a];
        return n
    }, tracking.Matrix.add = function(t, r) {
        for (var n = tracking.Matrix.clone(t), e = 0; e < n.length; e++)
            for (var a = 0; a < n[e].length; a++) n[e][a] += r[e][a];
        return n
    }, tracking.Matrix.clone = function(t, r, n) {
        r = r || t[0].length, n = n || t.length;
        for (var e = new Array(n), a = n; a--;) {
            e[a] = new Array(r);
            for (var i = r; i--;) e[a][i] = t[a][i]
        }
        return e
    }, tracking.Matrix.mulScalar = function(t, r) {
        for (var n = tracking.Matrix.clone(r), e = 0; e < r.length; e++)
            for (var a = 0; a < r[e].length; a++) n[e][a] *= t;
        return n
    }, tracking.Matrix.transpose = function(t) {
        for (var r = new Array(t[0].length), n = 0; n < t[0].length; n++) {
            r[n] = new Array(t.length);
            for (var e = 0; e < t.length; e++) r[n][e] = t[e][n]
        }
        return r
    }, tracking.Matrix.mul = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) {
            n[e] = new Array(r[0].length);
            for (var a = 0; a < r[0].length; a++) {
                n[e][a] = 0;
                for (var i = 0; i < t[0].length; i++) n[e][a] += t[e][i] * r[i][a]
            }
        }
        return n
    }, tracking.Matrix.norm = function(t) {
        for (var r = 0, n = 0; n < t.length; n++)
            for (var e = 0; e < t[n].length; e++) r += t[n][e] * t[n][e];
        return Math.sqrt(r)
    }, tracking.Matrix.calcCovarMatrix = function(t) {
        for (var r = new Array(t.length), n = 0; n < t.length; n++) {
            r[n] = [0];
            for (var e = 0; e < t[n].length; e++) r[n][0] += t[n][e] / t[n].length
        }
        for (var a = tracking.Matrix.clone(r), n = 0; n < a.length; n++)
            for (var e = 0; e < t[0].length - 1; e++) a[n].push(a[n][0]);
        var i = tracking.Matrix.sub(t, a),
            o = tracking.Matrix.transpose(i),
            c = tracking.Matrix.mul(o, i);
        return [c, r]
    }
}(),
function() {
    tracking.EPnP = {}, tracking.EPnP.solve = function(t, r, n) {}
}(),
function() {
    tracking.Tracker = function() {
        tracking.Tracker.base(this, "constructor")
    }, tracking.inherits(tracking.Tracker, tracking.EventEmitter), tracking.Tracker.prototype.track = function() {}
}(),
function() {
    tracking.TrackerTask = function(t) {
        if (tracking.TrackerTask.base(this, "constructor"), !t) throw new Error("Tracker instance not specified.");
        this.setTracker(t)
    }, tracking.inherits(tracking.TrackerTask, tracking.EventEmitter), tracking.TrackerTask.prototype.tracker_ = null, tracking.TrackerTask.prototype.running_ = !1, tracking.TrackerTask.prototype.getTracker = function() {
        return this.tracker_
    }, tracking.TrackerTask.prototype.inRunning = function() {
        return this.running_
    }, tracking.TrackerTask.prototype.setRunning = function(t) {
        this.running_ = t
    }, tracking.TrackerTask.prototype.setTracker = function(t) {
        this.tracker_ = t
    }, tracking.TrackerTask.prototype.run = function() {
        var t = this;
        if (!this.inRunning()) return this.setRunning(!0), this.reemitTrackEvent_ = function(r) {
            t.emit("track", r)
        }, this.tracker_.on("track", this.reemitTrackEvent_), this.emit("run"), this
    }, tracking.TrackerTask.prototype.stop = function() {
        if (this.inRunning()) return this.setRunning(!1), this.emit("stop"), this.tracker_.removeListener("track", this.reemitTrackEvent_), this
    }
}(),
function() {
    tracking.ColorTracker = function(t) {
        tracking.ColorTracker.base(this, "constructor"), "string" == typeof t && (t = [t]), t && (t.forEach(function(t) {
            if (!tracking.ColorTracker.getColor(t)) throw new Error('Color not valid, try `new tracking.ColorTracker("magenta")`.')
        }), this.setColors(t))
    }, tracking.inherits(tracking.ColorTracker, tracking.Tracker), tracking.ColorTracker.knownColors_ = {}, tracking.ColorTracker.neighbours_ = {}, tracking.ColorTracker.registerColor = function(t, r) {
        tracking.ColorTracker.knownColors_[t] = r
    }, tracking.ColorTracker.getColor = function(t) {
        return tracking.ColorTracker.knownColors_[t]
    }, tracking.ColorTracker.prototype.colors = ["magenta"], tracking.ColorTracker.prototype.minDimension = 20, tracking.ColorTracker.prototype.maxDimension = 1 / 0, tracking.ColorTracker.prototype.minGroupSize = 30, tracking.ColorTracker.prototype.calculateDimensions_ = function(t, r) {
        for (var n = -1, e = -1, a = 1 / 0, i = 1 / 0, o = 0; o < r; o += 2) {
            var c = t[o],
                s = t[o + 1];
            c < a && (a = c), c > n && (n = c), s < i && (i = s), s > e && (e = s)
        }
        return {
            width: n - a,
            height: e - i,
            x: a,
            y: i
        }
    }, tracking.ColorTracker.prototype.getColors = function() {
        return this.colors
    }, tracking.ColorTracker.prototype.getMinDimension = function() {
        return this.minDimension
    }, tracking.ColorTracker.prototype.getMaxDimension = function() {
        return this.maxDimension
    }, tracking.ColorTracker.prototype.getMinGroupSize = function() {
        return this.minGroupSize
    }, tracking.ColorTracker.prototype.getNeighboursForWidth_ = function(t) {
        if (tracking.ColorTracker.neighbours_[t]) return tracking.ColorTracker.neighbours_[t];
        var r = new Int32Array(8);
        return r[0] = 4 * -t, r[1] = 4 * -t + 4, r[2] = 4, r[3] = 4 * t + 4, r[4] = 4 * t, r[5] = 4 * t - 4, r[6] = -4, r[7] = 4 * -t - 4, tracking.ColorTracker.neighbours_[t] = r, r
    }, tracking.ColorTracker.prototype.mergeRectangles_ = function(t) {
        for (var r, n = [], e = this.getMinDimension(), a = this.getMaxDimension(), i = 0; i < t.length; i++) {
            var o = t[i];
            r = !0;
            for (var c = i + 1; c < t.length; c++) {
                var s = t[c];
                if (tracking.Math.intersectRect(o.x, o.y, o.x + o.width, o.y + o.height, s.x, s.y, s.x + s.width, s.y + s.height)) {
                    r = !1;
                    var g = Math.min(o.x, s.x),
                        h = Math.min(o.y, s.y),
                        k = Math.max(o.x + o.width, s.x + s.width),
                        f = Math.max(o.y + o.height, s.y + s.height);
                    s.height = f - h, s.width = k - g, s.x = g, s.y = h;
                    break
                }
            }
            r && o.width >= e && o.height >= e && o.width <= a && o.height <= a && n.push(o)
        }
        return n
    }, tracking.ColorTracker.prototype.setColors = function(t) {
        this.colors = t
    }, tracking.ColorTracker.prototype.setMinDimension = function(t) {
        this.minDimension = t
    }, tracking.ColorTracker.prototype.setMaxDimension = function(t) {
        this.maxDimension = t
    }, tracking.ColorTracker.prototype.setMinGroupSize = function(t) {
        this.minGroupSize = t
    }, tracking.ColorTracker.prototype.track = function(t, r, n) {
        var e = this,
            a = this.getColors();
        if (!a) throw new Error('Colors not specified, try `new tracking.ColorTracker("magenta")`.');
        var i = [];
        a.forEach(function(a) {
            i = i.concat(e.trackColor_(t, r, n, a))
        }), this.emit("track", {
            data: i
        })
    }, tracking.ColorTracker.prototype.trackColor_ = function(n, e, a, i) {
        var o, c, s, g, h, k = tracking.ColorTracker.knownColors_[i],
            f = new Int32Array(n.length >> 2),
            u = new Int8Array(n.length),
            l = this.getMinGroupSize(),
            m = this.getNeighboursForWidth_(e),
            d = new Int32Array(n.length),
            v = [],
            p = -4;
        if (!k) return v;
        for (var y = 0; y < a; y++)
            for (var w = 0; w < e; w++)
                if (p += 4, !u[p]) {
                    for (o = 0, h = -1, d[++h] = p, d[++h] = y, d[++h] = w, u[p] = 1; h >= 0;)
                        if (s = d[h--], c = d[h--], g = d[h--], k(n[g], n[g + 1], n[g + 2], n[g + 3], g, c, s)) {
                            f[o++] = s, f[o++] = c;
                            for (var T = 0; T < m.length; T++) {
                                var x = g + m[T],
                                    M = c + t[T],
                                    _ = s + r[T];
                                !u[x] && M >= 0 && M < a && _ >= 0 && _ < e && (d[++h] = x, d[++h] = M, d[++h] = _, u[x] = 1)
                            }
                        } if (o >= l) {
                        var C = this.calculateDimensions_(f, o);
                        C && (C.color = i, v.push(C))
                    }
                } return this.mergeRectangles_(v)
    }, tracking.ColorTracker.registerColor("cyan", function(t, r, n) {
        var e = 50,
            a = 70,
            i = t - 0,
            o = r - 255,
            c = n - 255;
        return r - t >= e && n - t >= a || i * i + o * o + c * c < 6400
    }), tracking.ColorTracker.registerColor("magenta", function(t, r, n) {
        var e = 50,
            a = t - 255,
            i = r - 0,
            o = n - 255;
        return t - r >= e && n - r >= e || a * a + i * i + o * o < 19600
    }), tracking.ColorTracker.registerColor("yellow", function(t, r, n) {
        var e = 50,
            a = t - 255,
            i = r - 255,
            o = n - 0;
        return t - n >= e && r - n >= e || a * a + i * i + o * o < 1e4
    });
    var t = new Int32Array([-1, -1, 0, 1, 1, 1, 0, -1]),
        r = new Int32Array([0, 1, 1, 1, 0, -1, -1, -1])
}(),
function() {
    tracking.ObjectTracker = function(t) {
        tracking.ObjectTracker.base(this, "constructor"), t && (Array.isArray(t) || (t = [t]), Array.isArray(t) && t.forEach(function(r, n) {
            if ("string" == typeof r && (t[n] = tracking.ViolaJones.classifiers[r]), !t[n]) throw new Error('Object classifier not valid, try `new tracking.ObjectTracker("face")`.')
        })), this.setClassifiers(t)
    }, tracking.inherits(tracking.ObjectTracker, tracking.Tracker), tracking.ObjectTracker.prototype.edgesDensity = .2, tracking.ObjectTracker.prototype.initialScale = 1, tracking.ObjectTracker.prototype.scaleFactor = 1.25, tracking.ObjectTracker.prototype.stepSize = 1.5, tracking.ObjectTracker.prototype.getClassifiers = function() {
        return this.classifiers
    }, tracking.ObjectTracker.prototype.getEdgesDensity = function() {
        return this.edgesDensity
    }, tracking.ObjectTracker.prototype.getInitialScale = function() {
        return this.initialScale
    }, tracking.ObjectTracker.prototype.getScaleFactor = function() {
        return this.scaleFactor
    }, tracking.ObjectTracker.prototype.getStepSize = function() {
        return this.stepSize
    }, tracking.ObjectTracker.prototype.track = function(t, r, n) {
        var e = this,
            a = this.getClassifiers();
        if (!a) throw new Error('Object classifier not specified, try `new tracking.ObjectTracker("face")`.');
        var i = [];
        a.forEach(function(a) {
            i = i.concat(tracking.ViolaJones.detect(t, r, n, e.getInitialScale(), e.getScaleFactor(), e.getStepSize(), e.getEdgesDensity(), a))
        }), this.emit("track", {
            data: i
        })
    }, tracking.ObjectTracker.prototype.setClassifiers = function(t) {
        this.classifiers = t
    }, tracking.ObjectTracker.prototype.setEdgesDensity = function(t) {
        this.edgesDensity = t
    }, tracking.ObjectTracker.prototype.setInitialScale = function(t) {
        this.initialScale = t
    }, tracking.ObjectTracker.prototype.setScaleFactor = function(t) {
        this.scaleFactor = t
    }, tracking.ObjectTracker.prototype.setStepSize = function(t) {
        this.stepSize = t
    }
}(),
function() {
    tracking.LandmarksTracker = function() {
        tracking.LandmarksTracker.base(this, "constructor")
    }, tracking.inherits(tracking.LandmarksTracker, tracking.ObjectTracker), tracking.LandmarksTracker.prototype.track = function(t, r, n) {
        var e = tracking.ViolaJones.classifiers.face,
            a = tracking.ViolaJones.detect(t, r, n, this.getInitialScale(), this.getScaleFactor(), this.getStepSize(), this.getEdgesDensity(), e),
            i = tracking.LBF.align(t, r, n, a);
        this.emit("track", {
            data: {
                faces: a,
                landmarks: i
            }
        })
    }
}(),
function() {
    tracking.LBF = {}, tracking.LBF.Regressor = function(t) {
        this.maxNumStages = t, this.rfs = new Array(t), this.models = new Array(t);
        for (var r = 0; r < t; r++) this.rfs[r] = new tracking.LBF.RandomForest(r), this.models[r] = tracking.LBF.RegressorData[r].models;
        this.meanShape = tracking.LBF.LandmarksData
    }, tracking.LBF.Regressor.prototype.predict = function(t, r, n, e) {
        var a = [],
            i = [],
            o = [],
            c = tracking.Matrix.clone(this.meanShape);
        a.push({
            data: t,
            width: r,
            height: n
        }), o.push(e), i.push(tracking.LBF.projectShapeToBoundingBox_(c, e));
        for (var s = 0; s < this.maxNumStages; s++) {
            var g = tracking.LBF.Regressor.deriveBinaryFeat(this.rfs[s], a, i, o, c);
            this.applyGlobalPrediction(g, this.models[s], i, o)
        }
        return i[0]
    }, tracking.LBF.Regressor.prototype.applyGlobalPrediction = function(t, r, n, e) {
        for (var a = 2 * n[0].length, i = new Array(a / 2), o = 0; o < a / 2; o++) i[o] = [0, 0];
        for (var o = 0; o < n.length; o++) {
            for (var c = 0; c < a; c++) {
                for (var s = 0, g = 0, h = 0;
                    (h = t[o][g].index) != -1; g++) h <= r[c].nr_feature && (s += r[c].data[h - 1] * t[o][g].value);
                c < a / 2 ? i[c][0] = s : i[c - a / 2][1] = s
            }
            var k = tracking.LBF.similarityTransform_(tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]), this.meanShape),
                f = (tracking.Matrix.transpose(k[0]), tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]));
            f = tracking.Matrix.add(f, i), n[o] = tracking.LBF.projectShapeToBoundingBox_(f, e[o])
        }
    }, tracking.LBF.Regressor.deriveBinaryFeat = function(t, r, n, e, a) {
        for (var i = new Array(r.length), o = 0; o < r.length; o++) {
            var c = t.maxNumTrees * t.landmarkNum + 1;
            i[o] = new Array(c);
            for (var s = 0; s < c; s++) i[o][s] = {}
        }
        for (var g = 1 << t.maxDepth - 1, o = 0; o < r.length; o++) {
            for (var h = tracking.LBF.unprojectShapeToBoundingBox_(n[o], e[o]), k = tracking.LBF.similarityTransform_(h, a), s = 0; s < t.landmarkNum; s++)
                for (var f = 0; f < t.maxNumTrees; f++) {
                    var u = tracking.LBF.Regressor.getCodeFromTree(t.rfs[s][f], r[o], n[o], e[o], k[0], k[1]),
                        l = s * t.maxNumTrees + f;
                    i[o][l].index = g * l + u, i[o][l].value = 1
                }
            i[o][t.landmarkNum * t.maxNumTrees].index = -1, i[o][t.landmarkNum * t.maxNumTrees].value = -1
        }
        return i
    }, tracking.LBF.Regressor.getCodeFromTree = function(t, r, n, e, a, i) {
        for (var o = 0, c = 0;;) {
            var s = Math.cos(t.nodes[o].feats[0]) * t.nodes[o].feats[2] * t.maxRadioRadius * e.width,
                g = Math.sin(t.nodes[o].feats[0]) * t.nodes[o].feats[2] * t.maxRadioRadius * e.height,
                h = Math.cos(t.nodes[o].feats[1]) * t.nodes[o].feats[3] * t.maxRadioRadius * e.width,
                k = Math.sin(t.nodes[o].feats[1]) * t.nodes[o].feats[3] * t.maxRadioRadius * e.height,
                f = a[0][0] * s + a[0][1] * g,
                u = a[1][0] * s + a[1][1] * g,
                l = Math.floor(f + n[t.landmarkID][0]),
                m = Math.floor(u + n[t.landmarkID][1]);
            l = Math.max(0, Math.min(l, r.height - 1)), m = Math.max(0, Math.min(m, r.width - 1));
            var d = a[0][0] * h + a[0][1] * k,
                v = a[1][0] * h + a[1][1] * k,
                p = Math.floor(d + n[t.landmarkID][0]),
                y = Math.floor(v + n[t.landmarkID][1]);
            p = Math.max(0, Math.min(p, r.height - 1)), y = Math.max(0, Math.min(y, r.width - 1));
            var w = Math.floor(r.data[m * r.width + l]) - Math.floor(r.data[y * r.width + p]);
            if (o = w < t.nodes[o].thresh ? t.nodes[o].cnodes[0] : t.nodes[o].cnodes[1], 1 == t.nodes[o].is_leafnode) {
                c = 1;
                for (var T = 0; T < t.leafnodes.length; T++) {
                    if (t.leafnodes[T] == o) return c;
                    c++
                }
                return c
            }
        }
        return c
    }
}(),
function() {
    tracking.LBF.maxNumStages = 4, tracking.LBF.regressor_ = null, tracking.LBF.align = function(t, r, n, e) {
        null == tracking.LBF.regressor_ && (tracking.LBF.regressor_ = new tracking.LBF.Regressor(tracking.LBF.maxNumStages)), t = tracking.Image.grayscale(t, r, n, !1), t = tracking.Image.equalizeHist(t, r, n);
        var a = new Array(e.length);
        for (var i in e) {
            e[i].height = e[i].width;
            var o = {};
            o.startX = e[i].x, o.startY = e[i].y, o.width = e[i].width, o.height = e[i].height, a[i] = tracking.LBF.regressor_.predict(t, r, n, o)
        }
        return a
    }, tracking.LBF.unprojectShapeToBoundingBox_ = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) n[e] = [(t[e][0] - r.startX) / r.width, (t[e][1] - r.startY) / r.height];
        return n
    }, tracking.LBF.projectShapeToBoundingBox_ = function(t, r) {
        for (var n = new Array(t.length), e = 0; e < t.length; e++) n[e] = [t[e][0] * r.width + r.startX, t[e][1] * r.height + r.startY];
        return n
    }, tracking.LBF.similarityTransform_ = function(t, r) {
        for (var n = [0, 0], e = [0, 0], a = 0; a < t.length; a++) n[0] += t[a][0], n[1] += t[a][1], e[0] += r[a][0], e[1] += r[a][1];
        n[0] /= t.length, n[1] /= t.length, e[0] /= r.length, e[1] /= r.length;
        for (var i = tracking.Matrix.clone(t), o = tracking.Matrix.clone(r), a = 0; a < t.length; a++) i[a][0] -= n[0], i[a][1] -= n[1], o[a][0] -= e[0], o[a][1] -= e[1];
        var c, s, g, h, k = tracking.Matrix.calcCovarMatrix(i);
        c = k[0], g = k[1], k = tracking.Matrix.calcCovarMatrix(o), s = k[0], h = k[1];
        var f = Math.sqrt(tracking.Matrix.norm(c)),
            u = Math.sqrt(tracking.Matrix.norm(s)),
            l = f / u;
        i = tracking.Matrix.mulScalar(1 / f, i), o = tracking.Matrix.mulScalar(1 / u, o);
        for (var m = 0, d = 0, a = 0; a < t.length; a++) m = m + i[a][1] * o[a][0] - i[a][0] * o[a][1], d = d + i[a][0] * o[a][0] + i[a][1] * o[a][1];
        var v = Math.sqrt(m * m + d * d),
            p = m / v,
            y = d / v,
            w = [
                [y, -p],
                [p, y]
            ];
        return [w, l]
    }, tracking.LBF.RandomForest = function(t) {
        this.maxNumTrees = tracking.LBF.RegressorData[t].max_numtrees, this.landmarkNum = tracking.LBF.RegressorData[t].num_landmark, this.maxDepth = tracking.LBF.RegressorData[t].max_depth, this.stages = tracking.LBF.RegressorData[t].stages, this.rfs = new Array(this.landmarkNum);
        for (var r = 0; r < this.landmarkNum; r++) {
            this.rfs[r] = new Array(this.maxNumTrees);
            for (var n = 0; n < this.maxNumTrees; n++) this.rfs[r][n] = new tracking.LBF.Tree(t, r, n)
        }
    }, tracking.LBF.Tree = function(t, r, n) {
        var e = tracking.LBF.RegressorData[t].landmarks[r][n];
        this.maxDepth = e.max_depth, this.maxNumNodes = e.max_numnodes, this.nodes = e.nodes, this.landmarkID = e.landmark_id, this.numLeafnodes = e.num_leafnodes, this.numNodes = e.num_nodes, this.maxNumFeats = e.max_numfeats, this.maxRadioRadius = e.max_radio_radius, this.leafnodes = e.id_leafnodes
    }
}();

回到頂部