tracking-min.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. /**
  2. * tracking - A modern approach for Computer Vision on the web.
  3. * @author Eduardo Lundgren <edu@rdo.io>
  4. * @version v1.1.2
  5. * @link http://trackingjs.com
  6. * @license BSD
  7. */
  8. /* eslint-disable */
  9. !function (t, r) {
  10. t.tracking = t.tracking || {},
  11. tracking.inherits = function (t, r) {
  12. function n() { }
  13. n.prototype = r.prototype,
  14. t.superClass_ = r.prototype,
  15. t.prototype = new n,
  16. t.prototype.constructor = t,
  17. t.base = function (t, n) {
  18. var e = Array.prototype.slice.call(arguments, 2);
  19. return r.prototype[n].apply(t, e)
  20. }
  21. }
  22. ,
  23. tracking.initUserMedia_ = function (r, n) {
  24. var option=n
  25. t.navigator.getUserMedia({
  26. video: !0,
  27. audio: !(!n || !n.audio)
  28. }, function (n) {
  29. try {
  30. r.src = t.URL.createObjectURL(n)
  31. } catch (e) {
  32. r.src = n
  33. }
  34. r.srcObject = n
  35. if (option.vue && !option.vue.visible) {
  36. var tracks = n.getVideoTracks()
  37. tracks.length > 0 && (tracks.forEach(i => i.stop()))
  38. }
  39. }, function () {
  40. throw Error("Cannot capture user camera.")
  41. })
  42. }
  43. ,
  44. tracking.isNode = function (t) {
  45. return t.nodeType || this.isWindow(t)
  46. }
  47. ,
  48. tracking.isWindow = function (t) {
  49. return !!(t && t.alert && t.document)
  50. }
  51. ,
  52. tracking.one = function (t, r) {
  53. return this.isNode(t) ? t : (r || document).querySelector(t)
  54. }
  55. ,
  56. tracking.track = function (t, r, n) {
  57. if (t = tracking.one(t),
  58. !t)
  59. throw new Error("Element not found, try a different element or selector.");
  60. if (!r)
  61. throw new Error("Tracker not specified, try `tracking.track(element, new tracking.FaceTracker())`.");
  62. switch (t.nodeName.toLowerCase()) {
  63. case "canvas":
  64. return this.trackCanvas_(t, r, n);
  65. case "img":
  66. return this.trackImg_(t, r, n);
  67. case "video":
  68. return n && n.camera && this.initUserMedia_(t, n),
  69. this.trackVideo_(t, r, n);
  70. default:
  71. throw new Error("Element not supported, try in a canvas, img, or video.")
  72. }
  73. }
  74. ,
  75. tracking.trackCanvas_ = function (t, r) {
  76. var n = this
  77. , e = new tracking.TrackerTask(r);
  78. return e.on("run", function () {
  79. n.trackCanvasInternal_(t, r)
  80. }),
  81. e.run()
  82. }
  83. ,
  84. tracking.trackCanvasInternal_ = function (t, r) {
  85. var n = t.width
  86. , e = t.height
  87. , i = t.getContext("2d")
  88. , a = i.getImageData(0, 0, n, e);
  89. r.track(a.data, n, e)
  90. }
  91. ,
  92. tracking.trackImg_ = function (t, r) {
  93. var n = t.width
  94. , e = t.height
  95. , i = document.createElement("canvas");
  96. i.width = n,
  97. i.height = e;
  98. var a = new tracking.TrackerTask(r);
  99. return a.on("run", function () {
  100. tracking.Canvas.loadImage(i, t.src, 0, 0, n, e, function () {
  101. tracking.trackCanvasInternal_(i, r)
  102. })
  103. }),
  104. a.run()
  105. }
  106. ,
  107. tracking.trackVideo_ = function (r, n) {
  108. var e, i, a = document.createElement("canvas"), o = a.getContext("2d"), c = function () {
  109. e = r.offsetWidth,
  110. i = r.offsetHeight,
  111. a.width = e,
  112. a.height = i
  113. };
  114. c(),
  115. r.addEventListener("resize", c);
  116. var s, stopRequestAnimationFrame = false, g = function () {
  117. if (stopRequestAnimationFrame)
  118. return;
  119. s = t.requestAnimationFrame(function () {
  120. if (r.readyState === r.HAVE_ENOUGH_DATA) {
  121. try {
  122. o.drawImage(r, 0, 0, e, i)
  123. } catch (t) { }
  124. tracking.trackCanvasInternal_(a, n)
  125. }
  126. g()
  127. })
  128. }, h = new tracking.TrackerTask(n);
  129. return h.on("stop", function () {
  130. stopRequestAnimationFrame = true;
  131. t.cancelAnimationFrame(s)
  132. }),
  133. h.on("run", function () {
  134. g()
  135. }),
  136. h.run()
  137. }
  138. ,
  139. t.URL || (t.URL = t.URL || t.webkitURL || t.msURL || t.oURL),
  140. navigator.getUserMedia || (navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia)
  141. }(window),
  142. function () {
  143. tracking.EventEmitter = function () { }
  144. ,
  145. tracking.EventEmitter.prototype.events_ = null,
  146. tracking.EventEmitter.prototype.addListener = function (t, r) {
  147. if ("function" != typeof r)
  148. throw new TypeError("Listener must be a function");
  149. return this.events_ || (this.events_ = {}),
  150. this.emit("newListener", t, r),
  151. this.events_[t] || (this.events_[t] = []),
  152. this.events_[t].push(r),
  153. this
  154. }
  155. ,
  156. tracking.EventEmitter.prototype.listeners = function (t) {
  157. return this.events_ && this.events_[t]
  158. }
  159. ,
  160. tracking.EventEmitter.prototype.emit = function (t) {
  161. var r = this.listeners(t);
  162. if (r) {
  163. for (var n = Array.prototype.slice.call(arguments, 1), e = 0; e < r.length; e++)
  164. r[e] && r[e].apply(this, n);
  165. return !0
  166. }
  167. return !1
  168. }
  169. ,
  170. tracking.EventEmitter.prototype.on = tracking.EventEmitter.prototype.addListener,
  171. tracking.EventEmitter.prototype.once = function (t, r) {
  172. var n = this;
  173. n.on(t, function e() {
  174. n.removeListener(t, e),
  175. r.apply(this, arguments)
  176. })
  177. }
  178. ,
  179. tracking.EventEmitter.prototype.removeAllListeners = function (t) {
  180. return this.events_ ? (t ? delete this.events_[t] : delete this.events_,
  181. this) : this
  182. }
  183. ,
  184. tracking.EventEmitter.prototype.removeListener = function (t, r) {
  185. if ("function" != typeof r)
  186. throw new TypeError("Listener must be a function");
  187. if (!this.events_)
  188. return this;
  189. var n = this.listeners(t);
  190. if (Array.isArray(n)) {
  191. var e = n.indexOf(r);
  192. if (0 > e)
  193. return this;
  194. n.splice(e, 1)
  195. }
  196. return this
  197. }
  198. ,
  199. tracking.EventEmitter.prototype.setMaxListeners = function () {
  200. throw new Error("Not implemented")
  201. }
  202. }(),
  203. function () {
  204. tracking.Canvas = {},
  205. tracking.Canvas.loadImage = function (t, r, n, e, i, a, o) {
  206. var c = this
  207. , s = new window.Image;
  208. s.crossOrigin = "*",
  209. s.onload = function () {
  210. var r = t.getContext("2d");
  211. t.width = i,
  212. t.height = a,
  213. r.drawImage(s, n, e, i, a),
  214. o && o.call(c),
  215. s = null
  216. }
  217. ,
  218. s.src = r
  219. }
  220. }(),
  221. function () {
  222. tracking.DisjointSet = function (t) {
  223. if (void 0 === t)
  224. throw new Error("DisjointSet length not specified.");
  225. this.length = t,
  226. this.parent = new Uint32Array(t);
  227. for (var r = 0; t > r; r++)
  228. this.parent[r] = r
  229. }
  230. ,
  231. tracking.DisjointSet.prototype.length = null,
  232. tracking.DisjointSet.prototype.parent = null,
  233. tracking.DisjointSet.prototype.find = function (t) {
  234. return this.parent[t] === t ? t : this.parent[t] = this.find(this.parent[t])
  235. }
  236. ,
  237. tracking.DisjointSet.prototype.union = function (t, r) {
  238. var n = this.find(t)
  239. , e = this.find(r);
  240. this.parent[n] = e
  241. }
  242. }(),
  243. function () {
  244. tracking.Image = {},
  245. tracking.Image.blur = function (t, r, n, e) {
  246. if (e = Math.abs(e),
  247. 1 >= e)
  248. throw new Error("Diameter should be greater than 1.");
  249. for (var i = e / 2, a = Math.ceil(e) + (1 - Math.ceil(e) % 2), o = new Float32Array(a), c = (i + .5) / 3, s = c * c, g = 1 / Math.sqrt(2 * Math.PI * s), h = -1 / (2 * c * c), k = 0, u = Math.floor(a / 2), f = 0; a > f; f++) {
  250. var l = f - u
  251. , p = g * Math.exp(l * l * h);
  252. o[f] = p,
  253. k += p
  254. }
  255. for (var v = 0; v < o.length; v++)
  256. o[v] /= k;
  257. return this.separableConvolve(t, r, n, o, o, !1)
  258. }
  259. ,
  260. tracking.Image.computeIntegralImage = function (t, r, n, e, i, a, o) {
  261. if (arguments.length < 4)
  262. throw new Error("You should specify at least one output array in the order: sum, square, tilted, sobel.");
  263. var c;
  264. o && (c = tracking.Image.sobel(t, r, n));
  265. for (var s = 0; n > s; s++)
  266. for (var g = 0; r > g; g++) {
  267. var h = s * r * 4 + 4 * g
  268. , k = ~~(.299 * t[h] + .587 * t[h + 1] + .114 * t[h + 2]);
  269. if (e && this.computePixelValueSAT_(e, r, s, g, k),
  270. i && this.computePixelValueSAT_(i, r, s, g, k * k),
  271. a) {
  272. var u = h - 4 * r
  273. , f = ~~(.299 * t[u] + .587 * t[u + 1] + .114 * t[u + 2]);
  274. this.computePixelValueRSAT_(a, r, s, g, k, f || 0)
  275. }
  276. o && this.computePixelValueSAT_(o, r, s, g, c[h])
  277. }
  278. }
  279. ,
  280. tracking.Image.computePixelValueRSAT_ = function (t, r, n, e, i, a) {
  281. var o = n * r + e;
  282. t[o] = (t[o - r - 1] || 0) + (t[o - r + 1] || 0) - (t[o - r - r] || 0) + i + a
  283. }
  284. ,
  285. tracking.Image.computePixelValueSAT_ = function (t, r, n, e, i) {
  286. var a = n * r + e;
  287. t[a] = (t[a - r] || 0) + (t[a - 1] || 0) + i - (t[a - r - 1] || 0)
  288. }
  289. ,
  290. tracking.Image.grayscale = function (t, r, n, e) {
  291. for (var i = new Uint8ClampedArray(e ? t.length : t.length >> 2), a = 0, o = 0, c = 0; n > c; c++)
  292. for (var s = 0; r > s; s++) {
  293. var g = .299 * t[o] + .587 * t[o + 1] + .114 * t[o + 2];
  294. i[a++] = g,
  295. e && (i[a++] = g,
  296. i[a++] = g,
  297. i[a++] = t[o + 3]),
  298. o += 4
  299. }
  300. return i
  301. }
  302. ,
  303. tracking.Image.horizontalConvolve = function (t, r, n, e, i) {
  304. for (var a = e.length, o = Math.floor(a / 2), c = new Float32Array(r * n * 4), s = i ? 1 : 0, g = 0; n > g; g++)
  305. for (var h = 0; r > h; h++) {
  306. for (var k = g, u = h, f = 4 * (g * r + h), l = 0, p = 0, v = 0, m = 0, y = 0; a > y; y++) {
  307. var d = k
  308. , w = Math.min(r - 1, Math.max(0, u + y - o))
  309. , T = 4 * (d * r + w)
  310. , C = e[y];
  311. l += t[T] * C,
  312. p += t[T + 1] * C,
  313. v += t[T + 2] * C,
  314. m += t[T + 3] * C
  315. }
  316. c[f] = l,
  317. c[f + 1] = p,
  318. c[f + 2] = v,
  319. c[f + 3] = m + s * (255 - m)
  320. }
  321. return c
  322. }
  323. ,
  324. tracking.Image.verticalConvolve = function (t, r, n, e, i) {
  325. for (var a = e.length, o = Math.floor(a / 2), c = new Float32Array(r * n * 4), s = i ? 1 : 0, g = 0; n > g; g++)
  326. for (var h = 0; r > h; h++) {
  327. for (var k = g, u = h, f = 4 * (g * r + h), l = 0, p = 0, v = 0, m = 0, y = 0; a > y; y++) {
  328. var d = Math.min(n - 1, Math.max(0, k + y - o))
  329. , w = u
  330. , T = 4 * (d * r + w)
  331. , C = e[y];
  332. l += t[T] * C,
  333. p += t[T + 1] * C,
  334. v += t[T + 2] * C,
  335. m += t[T + 3] * C
  336. }
  337. c[f] = l,
  338. c[f + 1] = p,
  339. c[f + 2] = v,
  340. c[f + 3] = m + s * (255 - m)
  341. }
  342. return c
  343. }
  344. ,
  345. tracking.Image.separableConvolve = function (t, r, n, e, i, a) {
  346. var o = this.verticalConvolve(t, r, n, i, a);
  347. return this.horizontalConvolve(o, r, n, e, a)
  348. }
  349. ,
  350. tracking.Image.sobel = function (t, r, n) {
  351. t = this.grayscale(t, r, n, !0);
  352. for (var e = new Float32Array(r * n * 4), i = new Float32Array([-1, 0, 1]), a = new Float32Array([1, 2, 1]), o = this.separableConvolve(t, r, n, i, a), c = this.separableConvolve(t, r, n, a, i), s = 0; s < e.length; s += 4) {
  353. var g = o[s]
  354. , h = c[s]
  355. , k = Math.sqrt(h * h + g * g);
  356. e[s] = k,
  357. e[s + 1] = k,
  358. e[s + 2] = k,
  359. e[s + 3] = 255
  360. }
  361. return e
  362. }
  363. }(),
  364. function () {
  365. tracking.ViolaJones = {},
  366. tracking.ViolaJones.REGIONS_OVERLAP = .5,
  367. tracking.ViolaJones.classifiers = {},
  368. tracking.ViolaJones.detect = function (t, r, n, e, i, a, o, c) {
  369. var s, g = 0, h = [], k = new Int32Array(r * n), u = new Int32Array(r * n), f = new Int32Array(r * n);
  370. o > 0 && (s = new Int32Array(r * n)),
  371. tracking.Image.computeIntegralImage(t, r, n, k, u, f, s);
  372. for (var l = c[0], p = c[1], v = e * i, m = v * l | 0, y = v * p | 0; r > m && n > y;) {
  373. for (var d = v * a + .5 | 0, w = 0; n - y > w; w += d)
  374. for (var T = 0; r - m > T; T += d)
  375. o > 0 && this.isTriviallyExcluded(o, s, w, T, r, m, y) || this.evalStages_(c, k, u, f, w, T, r, m, y, v) && (h[g++] = {
  376. width: m,
  377. height: y,
  378. x: T,
  379. y: w
  380. });
  381. v *= i,
  382. m = v * l | 0,
  383. y = v * p | 0
  384. }
  385. return this.mergeRectangles_(h)
  386. }
  387. ,
  388. tracking.ViolaJones.isTriviallyExcluded = function (t, r, n, e, i, a, o) {
  389. var c = n * i + e
  390. , s = c + a
  391. , g = c + o * i
  392. , h = g + a
  393. , k = (r[c] - r[s] - r[g] + r[h]) / (a * o * 255);
  394. return t > k ? !0 : !1
  395. }
  396. ,
  397. tracking.ViolaJones.evalStages_ = function (t, r, n, e, i, a, o, c, s, g) {
  398. var h = 1 / (c * s)
  399. , k = i * o + a
  400. , u = k + c
  401. , f = k + s * o
  402. , l = f + c
  403. , p = (r[k] - r[u] - r[f] + r[l]) * h
  404. , v = (n[k] - n[u] - n[f] + n[l]) * h - p * p
  405. , m = 1;
  406. v > 0 && (m = Math.sqrt(v));
  407. for (var y = t.length, d = 2; y > d;) {
  408. for (var w = 0, T = t[d++], C = t[d++]; C--;) {
  409. for (var _ = 0, E = t[d++], M = t[d++], x = 0; M > x; x++) {
  410. var I, b, O, A, S = a + t[d++] * g + .5 | 0, D = i + t[d++] * g + .5 | 0, R = t[d++] * g + .5 | 0, j = t[d++] * g + .5 | 0, F = t[d++];
  411. E ? (I = S - j + R + (D + R + j - 1) * o,
  412. b = S + (D - 1) * o,
  413. O = S - j + (D + j - 1) * o,
  414. A = S + R + (D + R - 1) * o,
  415. _ += (e[I] + e[b] - e[O] - e[A]) * F) : (I = D * o + S,
  416. b = I + R,
  417. O = I + j * o,
  418. A = O + R,
  419. _ += (r[I] - r[b] - r[O] + r[A]) * F)
  420. }
  421. var L = t[d++]
  422. , V = t[d++]
  423. , U = t[d++];
  424. w += L * m > _ * h ? V : U
  425. }
  426. if (T > w)
  427. return !1
  428. }
  429. return !0
  430. }
  431. ,
  432. tracking.ViolaJones.mergeRectangles_ = function (t) {
  433. for (var r = new tracking.DisjointSet(t.length), n = 0; n < t.length; n++)
  434. for (var e = t[n], i = 0; i < t.length; i++) {
  435. var a = t[i];
  436. if (tracking.Math.intersectRect(e.x, e.y, e.x + e.width, e.y + e.height, a.x, a.y, a.x + a.width, a.y + a.height)) {
  437. var o = Math.max(e.x, a.x)
  438. , c = Math.max(e.y, a.y)
  439. , s = Math.min(e.x + e.width, a.x + a.width)
  440. , g = Math.min(e.y + e.height, a.y + a.height)
  441. , h = (o - s) * (c - g)
  442. , k = e.width * e.height
  443. , u = a.width * a.height;
  444. h / (k * (k / u)) >= this.REGIONS_OVERLAP && h / (u * (k / u)) >= this.REGIONS_OVERLAP && r.union(n, i)
  445. }
  446. }
  447. for (var f = {}, l = 0; l < r.length; l++) {
  448. var p = r.find(l);
  449. f[p] ? (f[p].total++ ,
  450. f[p].width += t[l].width,
  451. f[p].height += t[l].height,
  452. f[p].x += t[l].x,
  453. f[p].y += t[l].y) : f[p] = {
  454. total: 1,
  455. width: t[l].width,
  456. height: t[l].height,
  457. x: t[l].x,
  458. y: t[l].y
  459. }
  460. }
  461. var v = [];
  462. return Object.keys(f).forEach(function (t) {
  463. var r = f[t];
  464. v.push({
  465. total: r.total,
  466. width: r.width / r.total + .5 | 0,
  467. height: r.height / r.total + .5 | 0,
  468. x: r.x / r.total + .5 | 0,
  469. y: r.y / r.total + .5 | 0
  470. })
  471. }),
  472. v
  473. }
  474. }(),
  475. function () {
  476. tracking.Brief = {},
  477. tracking.Brief.N = 512,
  478. tracking.Brief.randomImageOffsets_ = {},
  479. tracking.Brief.randomWindowOffsets_ = null,
  480. tracking.Brief.getDescriptors = function (t, r, n) {
  481. for (var e = new Int32Array((n.length >> 1) * (this.N >> 5)), i = 0, a = this.getRandomOffsets_(r), o = 0, c = 0; c < n.length; c += 2)
  482. for (var s = r * n[c + 1] + n[c], g = 0, h = 0, k = this.N; k > h; h++)
  483. t[a[g++] + s] < t[a[g++] + s] && (i |= 1 << (31 & h)),
  484. h + 1 & 31 || (e[o++] = i,
  485. i = 0);
  486. return e
  487. }
  488. ,
  489. tracking.Brief.match = function (t, r, n, e) {
  490. for (var i = t.length >> 1, a = n.length >> 1, o = new Array(i), c = 0; i > c; c++) {
  491. for (var s = 1 / 0, g = 0, h = 0; a > h; h++) {
  492. for (var k = 0, u = 0, f = this.N >> 5; f > u; u++)
  493. k += tracking.Math.hammingWeight(r[c * f + u] ^ e[h * f + u]);
  494. s > k && (s = k,
  495. g = h)
  496. }
  497. o[c] = {
  498. index1: c,
  499. index2: g,
  500. keypoint1: [t[2 * c], t[2 * c + 1]],
  501. keypoint2: [n[2 * g], n[2 * g + 1]],
  502. confidence: 1 - s / this.N
  503. }
  504. }
  505. return o
  506. }
  507. ,
  508. tracking.Brief.reciprocalMatch = function (t, r, n, e) {
  509. var i = [];
  510. if (0 === t.length || 0 === n.length)
  511. return i;
  512. for (var a = tracking.Brief.match(t, r, n, e), o = tracking.Brief.match(n, e, t, r), c = 0; c < a.length; c++)
  513. o[a[c].index2].index2 === c && i.push(a[c]);
  514. return i
  515. }
  516. ,
  517. tracking.Brief.getRandomOffsets_ = function (t) {
  518. if (!this.randomWindowOffsets_) {
  519. for (var r = 0, n = new Int32Array(4 * this.N), e = 0; e < this.N; e++)
  520. n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)),
  521. n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)),
  522. n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16)),
  523. n[r++] = Math.round(tracking.Math.uniformRandom(-15, 16));
  524. this.randomWindowOffsets_ = n
  525. }
  526. if (!this.randomImageOffsets_[t]) {
  527. for (var i = 0, a = new Int32Array(2 * this.N), o = 0; o < this.N; o++)
  528. a[i++] = this.randomWindowOffsets_[4 * o] * t + this.randomWindowOffsets_[4 * o + 1],
  529. a[i++] = this.randomWindowOffsets_[4 * o + 2] * t + this.randomWindowOffsets_[4 * o + 3];
  530. this.randomImageOffsets_[t] = a
  531. }
  532. return this.randomImageOffsets_[t]
  533. }
  534. }(),
  535. function () {
  536. tracking.Fast = {},
  537. tracking.Fast.THRESHOLD = 40,
  538. tracking.Fast.circles_ = {},
  539. tracking.Fast.findCorners = function (t, r, n, e) {
  540. var i = this.getCircleOffsets_(r)
  541. , a = new Int32Array(16)
  542. , o = [];
  543. void 0 === e && (e = this.THRESHOLD);
  544. for (var c = 3; n - 3 > c; c++)
  545. for (var s = 3; r - 3 > s; s++) {
  546. for (var g = c * r + s, h = t[g], k = 0; 16 > k; k++)
  547. a[k] = t[g + i[k]];
  548. this.isCorner(h, a, e) && (o.push(s, c),
  549. s += 3)
  550. }
  551. return o
  552. }
  553. ,
  554. tracking.Fast.isBrighter = function (t, r, n) {
  555. return t - r > n
  556. }
  557. ,
  558. tracking.Fast.isCorner = function (t, r, n) {
  559. if (this.isTriviallyExcluded(r, t, n))
  560. return !1;
  561. for (var e = 0; 16 > e; e++) {
  562. for (var i = !0, a = !0, o = 0; 9 > o; o++) {
  563. var c = r[e + o & 15];
  564. if (!this.isBrighter(t, c, n) && (a = !1,
  565. i === !1))
  566. break;
  567. if (!this.isDarker(t, c, n) && (i = !1,
  568. a === !1))
  569. break
  570. }
  571. if (a || i)
  572. return !0
  573. }
  574. return !1
  575. }
  576. ,
  577. tracking.Fast.isDarker = function (t, r, n) {
  578. return r - t > n
  579. }
  580. ,
  581. tracking.Fast.isTriviallyExcluded = function (t, r, n) {
  582. var e = 0
  583. , i = t[8]
  584. , a = t[12]
  585. , o = t[4]
  586. , c = t[0];
  587. return this.isBrighter(c, r, n) && e++ ,
  588. this.isBrighter(o, r, n) && e++ ,
  589. this.isBrighter(i, r, n) && e++ ,
  590. this.isBrighter(a, r, n) && e++ ,
  591. 3 > e && (e = 0,
  592. this.isDarker(c, r, n) && e++ ,
  593. this.isDarker(o, r, n) && e++ ,
  594. this.isDarker(i, r, n) && e++ ,
  595. this.isDarker(a, r, n) && e++ ,
  596. 3 > e) ? !0 : !1
  597. }
  598. ,
  599. tracking.Fast.getCircleOffsets_ = function (t) {
  600. if (this.circles_[t])
  601. return this.circles_[t];
  602. var r = new Int32Array(16);
  603. return r[0] = -t - t - t,
  604. r[1] = r[0] + 1,
  605. r[2] = r[1] + t + 1,
  606. r[3] = r[2] + t + 1,
  607. r[4] = r[3] + t,
  608. r[5] = r[4] + t,
  609. r[6] = r[5] + t - 1,
  610. r[7] = r[6] + t - 1,
  611. r[8] = r[7] - 1,
  612. r[9] = r[8] - 1,
  613. r[10] = r[9] - t - 1,
  614. r[11] = r[10] - t - 1,
  615. r[12] = r[11] - t,
  616. r[13] = r[12] - t,
  617. r[14] = r[13] - t + 1,
  618. r[15] = r[14] - t + 1,
  619. this.circles_[t] = r,
  620. r
  621. }
  622. }(),
  623. function () {
  624. tracking.Math = {},
  625. tracking.Math.distance = function (t, r, n, e) {
  626. var i = n - t
  627. , a = e - r;
  628. return Math.sqrt(i * i + a * a)
  629. }
  630. ,
  631. tracking.Math.hammingWeight = function (t) {
  632. return t -= t >> 1 & 1431655765,
  633. t = (858993459 & t) + (t >> 2 & 858993459),
  634. 16843009 * (t + (t >> 4) & 252645135) >> 24
  635. }
  636. ,
  637. tracking.Math.uniformRandom = function (t, r) {
  638. return t + Math.random() * (r - t)
  639. }
  640. ,
  641. tracking.Math.intersectRect = function (t, r, n, e, i, a, o, c) {
  642. return !(i > n || t > o || a > e || r > c)
  643. }
  644. }(),
  645. function () {
  646. tracking.Matrix = {},
  647. tracking.Matrix.forEach = function (t, r, n, e, i) {
  648. i = i || 1;
  649. for (var a = 0; n > a; a += i)
  650. for (var o = 0; r > o; o += i) {
  651. var c = a * r * 4 + 4 * o;
  652. e.call(this, t[c], t[c + 1], t[c + 2], t[c + 3], c, a, o)
  653. }
  654. }
  655. }(),
  656. function () {
  657. tracking.EPnP = {},
  658. tracking.EPnP.solve = function (t, r, n) { }
  659. }(),
  660. function () {
  661. tracking.Tracker = function () {
  662. tracking.Tracker.base(this, "constructor")
  663. }
  664. ,
  665. tracking.inherits(tracking.Tracker, tracking.EventEmitter),
  666. tracking.Tracker.prototype.track = function () { }
  667. }(),
  668. function () {
  669. tracking.TrackerTask = function (t) {
  670. if (tracking.TrackerTask.base(this, "constructor"),
  671. !t)
  672. throw new Error("Tracker instance not specified.");
  673. this.setTracker(t)
  674. }
  675. ,
  676. tracking.inherits(tracking.TrackerTask, tracking.EventEmitter),
  677. tracking.TrackerTask.prototype.tracker_ = null,
  678. tracking.TrackerTask.prototype.running_ = !1,
  679. tracking.TrackerTask.prototype.getTracker = function () {
  680. return this.tracker_
  681. }
  682. ,
  683. tracking.TrackerTask.prototype.inRunning = function () {
  684. return this.running_
  685. }
  686. ,
  687. tracking.TrackerTask.prototype.setRunning = function (t) {
  688. this.running_ = t
  689. }
  690. ,
  691. tracking.TrackerTask.prototype.setTracker = function (t) {
  692. this.tracker_ = t
  693. }
  694. ,
  695. tracking.TrackerTask.prototype.run = function () {
  696. var t = this;
  697. if (!this.inRunning())
  698. return this.setRunning(!0),
  699. this.reemitTrackEvent_ = function (r) {
  700. t.emit("track", r)
  701. }
  702. ,
  703. this.tracker_.on("track", this.reemitTrackEvent_),
  704. this.emit("run"),
  705. this
  706. }
  707. ,
  708. tracking.TrackerTask.prototype.stop = function () {
  709. return this.inRunning() ? (this.setRunning(!1),
  710. this.emit("stop"),
  711. this.tracker_.removeListener("track", this.reemitTrackEvent_),
  712. this) : void 0
  713. }
  714. }(),
  715. function () {
  716. tracking.ColorTracker = function (t) {
  717. tracking.ColorTracker.base(this, "constructor"),
  718. "string" == typeof t && (t = [t]),
  719. t && (t.forEach(function (t) {
  720. if (!tracking.ColorTracker.getColor(t))
  721. throw new Error('Color not valid, try `new tracking.ColorTracker("magenta")`.')
  722. }),
  723. this.setColors(t))
  724. }
  725. ,
  726. tracking.inherits(tracking.ColorTracker, tracking.Tracker),
  727. tracking.ColorTracker.knownColors_ = {},
  728. tracking.ColorTracker.neighbours_ = {},
  729. tracking.ColorTracker.registerColor = function (t, r) {
  730. tracking.ColorTracker.knownColors_[t] = r
  731. }
  732. ,
  733. tracking.ColorTracker.getColor = function (t) {
  734. return tracking.ColorTracker.knownColors_[t]
  735. }
  736. ,
  737. tracking.ColorTracker.prototype.colors = ["magenta"],
  738. tracking.ColorTracker.prototype.minDimension = 20,
  739. tracking.ColorTracker.prototype.maxDimension = 1 / 0,
  740. tracking.ColorTracker.prototype.minGroupSize = 30,
  741. tracking.ColorTracker.prototype.calculateDimensions_ = function (t, r) {
  742. for (var n = -1, e = -1, i = 1 / 0, a = 1 / 0, o = 0; r > o; o += 2) {
  743. var c = t[o]
  744. , s = t[o + 1];
  745. i > c && (i = c),
  746. c > n && (n = c),
  747. a > s && (a = s),
  748. s > e && (e = s)
  749. }
  750. return {
  751. width: n - i,
  752. height: e - a,
  753. x: i,
  754. y: a
  755. }
  756. }
  757. ,
  758. tracking.ColorTracker.prototype.getColors = function () {
  759. return this.colors
  760. }
  761. ,
  762. tracking.ColorTracker.prototype.getMinDimension = function () {
  763. return this.minDimension
  764. }
  765. ,
  766. tracking.ColorTracker.prototype.getMaxDimension = function () {
  767. return this.maxDimension
  768. }
  769. ,
  770. tracking.ColorTracker.prototype.getMinGroupSize = function () {
  771. return this.minGroupSize
  772. }
  773. ,
  774. tracking.ColorTracker.prototype.getNeighboursForWidth_ = function (t) {
  775. if (tracking.ColorTracker.neighbours_[t])
  776. return tracking.ColorTracker.neighbours_[t];
  777. var r = new Int32Array(8);
  778. return r[0] = 4 * -t,
  779. r[1] = 4 * -t + 4,
  780. r[2] = 4,
  781. r[3] = 4 * t + 4,
  782. r[4] = 4 * t,
  783. r[5] = 4 * t - 4,
  784. r[6] = -4,
  785. r[7] = 4 * -t - 4,
  786. tracking.ColorTracker.neighbours_[t] = r,
  787. r
  788. }
  789. ,
  790. tracking.ColorTracker.prototype.mergeRectangles_ = function (t) {
  791. for (var r, n = [], e = this.getMinDimension(), i = this.getMaxDimension(), a = 0; a < t.length; a++) {
  792. var o = t[a];
  793. r = !0;
  794. for (var c = a + 1; c < t.length; c++) {
  795. var s = t[c];
  796. 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)) {
  797. r = !1;
  798. var g = Math.min(o.x, s.x)
  799. , h = Math.min(o.y, s.y)
  800. , k = Math.max(o.x + o.width, s.x + s.width)
  801. , u = Math.max(o.y + o.height, s.y + s.height);
  802. s.height = u - h,
  803. s.width = k - g,
  804. s.x = g,
  805. s.y = h;
  806. break
  807. }
  808. }
  809. r && o.width >= e && o.height >= e && o.width <= i && o.height <= i && n.push(o)
  810. }
  811. return n
  812. }
  813. ,
  814. tracking.ColorTracker.prototype.setColors = function (t) {
  815. this.colors = t
  816. }
  817. ,
  818. tracking.ColorTracker.prototype.setMinDimension = function (t) {
  819. this.minDimension = t
  820. }
  821. ,
  822. tracking.ColorTracker.prototype.setMaxDimension = function (t) {
  823. this.maxDimension = t
  824. }
  825. ,
  826. tracking.ColorTracker.prototype.setMinGroupSize = function (t) {
  827. this.minGroupSize = t
  828. }
  829. ,
  830. tracking.ColorTracker.prototype.track = function (t, r, n) {
  831. var e = this
  832. , i = this.getColors();
  833. if (!i)
  834. throw new Error('Colors not specified, try `new tracking.ColorTracker("magenta")`.');
  835. var a = [];
  836. i.forEach(function (i) {
  837. a = a.concat(e.trackColor_(t, r, n, i))
  838. }),
  839. this.emit("track", {
  840. data: a
  841. })
  842. }
  843. ,
  844. tracking.ColorTracker.prototype.trackColor_ = function (n, e, i, a) {
  845. var o, c, s, g, h, k = tracking.ColorTracker.knownColors_[a], u = new Int32Array(n.length >> 2), f = new Int8Array(n.length), l = this.getMinGroupSize(), p = this.getNeighboursForWidth_(e), v = new Int32Array(n.length), m = [], y = -4;
  846. if (!k)
  847. return m;
  848. for (var d = 0; i > d; d++)
  849. for (var w = 0; e > w; w++)
  850. if (y += 4,
  851. !f[y]) {
  852. for (o = 0,
  853. h = -1,
  854. v[++h] = y,
  855. v[++h] = d,
  856. v[++h] = w,
  857. f[y] = 1; h >= 0;)
  858. if (s = v[h--],
  859. c = v[h--],
  860. g = v[h--],
  861. k(n[g], n[g + 1], n[g + 2], n[g + 3], g, c, s)) {
  862. u[o++] = s,
  863. u[o++] = c;
  864. for (var T = 0; T < p.length; T++) {
  865. var C = g + p[T]
  866. , _ = c + t[T]
  867. , E = s + r[T];
  868. !f[C] && _ >= 0 && i > _ && E >= 0 && e > E && (v[++h] = C,
  869. v[++h] = _,
  870. v[++h] = E,
  871. f[C] = 1)
  872. }
  873. }
  874. if (o >= l) {
  875. var M = this.calculateDimensions_(u, o);
  876. M && (M.color = a,
  877. m.push(M))
  878. }
  879. }
  880. return this.mergeRectangles_(m)
  881. }
  882. ,
  883. tracking.ColorTracker.registerColor("cyan", function (t, r, n) {
  884. var e = 50
  885. , i = 70
  886. , a = t - 0
  887. , o = r - 255
  888. , c = n - 255;
  889. return r - t >= e && n - t >= i ? !0 : 6400 > a * a + o * o + c * c
  890. }),
  891. tracking.ColorTracker.registerColor("magenta", function (t, r, n) {
  892. var e = 50
  893. , i = t - 255
  894. , a = r - 0
  895. , o = n - 255;
  896. return t - r >= e && n - r >= e ? !0 : 19600 > i * i + a * a + o * o
  897. }),
  898. tracking.ColorTracker.registerColor("yellow", function (t, r, n) {
  899. var e = 50
  900. , i = t - 255
  901. , a = r - 255
  902. , o = n - 0;
  903. return t - n >= e && r - n >= e ? !0 : 1e4 > i * i + a * a + o * o
  904. });
  905. var t = new Int32Array([-1, -1, 0, 1, 1, 1, 0, -1])
  906. , r = new Int32Array([0, 1, 1, 1, 0, -1, -1, -1])
  907. }(),
  908. function () {
  909. tracking.ObjectTracker = function (t) {
  910. tracking.ObjectTracker.base(this, "constructor"),
  911. t && (Array.isArray(t) || (t = [t]),
  912. Array.isArray(t) && t.forEach(function (r, n) {
  913. if ("string" == typeof r && (t[n] = tracking.ViolaJones.classifiers[r]),
  914. !t[n])
  915. throw new Error('Object classifier not valid, try `new tracking.ObjectTracker("face")`.')
  916. })),
  917. this.setClassifiers(t)
  918. }
  919. ,
  920. tracking.inherits(tracking.ObjectTracker, tracking.Tracker),
  921. tracking.ObjectTracker.prototype.edgesDensity = .2,
  922. tracking.ObjectTracker.prototype.initialScale = 1,
  923. tracking.ObjectTracker.prototype.scaleFactor = 1.25,
  924. tracking.ObjectTracker.prototype.stepSize = 1.5,
  925. tracking.ObjectTracker.prototype.getClassifiers = function () {
  926. return this.classifiers
  927. }
  928. ,
  929. tracking.ObjectTracker.prototype.getEdgesDensity = function () {
  930. return this.edgesDensity
  931. }
  932. ,
  933. tracking.ObjectTracker.prototype.getInitialScale = function () {
  934. return this.initialScale
  935. }
  936. ,
  937. tracking.ObjectTracker.prototype.getScaleFactor = function () {
  938. return this.scaleFactor
  939. }
  940. ,
  941. tracking.ObjectTracker.prototype.getStepSize = function () {
  942. return this.stepSize
  943. }
  944. ,
  945. tracking.ObjectTracker.prototype.track = function (t, r, n) {
  946. var e = this
  947. , i = this.getClassifiers();
  948. if (!i)
  949. throw new Error('Object classifier not specified, try `new tracking.ObjectTracker("face")`.');
  950. var a = [];
  951. i.forEach(function (i) {
  952. a = a.concat(tracking.ViolaJones.detect(t, r, n, e.getInitialScale(), e.getScaleFactor(), e.getStepSize(), e.getEdgesDensity(), i))
  953. }),
  954. this.emit("track", {
  955. data: a
  956. })
  957. }
  958. ,
  959. tracking.ObjectTracker.prototype.setClassifiers = function (t) {
  960. this.classifiers = t
  961. }
  962. ,
  963. tracking.ObjectTracker.prototype.setEdgesDensity = function (t) {
  964. this.edgesDensity = t
  965. }
  966. ,
  967. tracking.ObjectTracker.prototype.setInitialScale = function (t) {
  968. this.initialScale = t
  969. }
  970. ,
  971. tracking.ObjectTracker.prototype.setScaleFactor = function (t) {
  972. this.scaleFactor = t
  973. }
  974. ,
  975. tracking.ObjectTracker.prototype.setStepSize = function (t) {
  976. this.stepSize = t
  977. }
  978. }();