|
2 | 2 |
|
3 | 3 | <html> |
4 | 4 | <head> |
5 | | - <title>tracking.js - brief algorithm</title> |
6 | | - |
7 | 5 | <meta charset="utf-8"> |
| 6 | + <title>tracking.js - feature matching</title> |
| 7 | + <link rel="stylesheet" href="assets/demo.css"> |
| 8 | + |
| 9 | + <script src="../build/tracking-min.js"></script> |
| 10 | + <script src="../../dat-gui/build/dat.gui.min.js"></script> |
8 | 11 |
|
9 | | - <script src="../build/tracking.js"></script> |
| 12 | + <style> |
| 13 | + .demo-container { |
| 14 | + background-color: black; |
| 15 | + } |
| 16 | + #image1, #image2 { |
| 17 | + position: absolute; |
| 18 | + left: -1000px; |
| 19 | + top: -1000px; |
| 20 | + } |
| 21 | + #canvas { |
| 22 | + position: absolute; |
| 23 | + left: 50%; |
| 24 | + top: 50%; |
| 25 | + margin-left: -393px; |
| 26 | + margin-top: -147px; |
| 27 | + } |
| 28 | + </style> |
10 | 29 | </head> |
11 | 30 | <body> |
12 | | - <canvas id="canvas1"></canvas> |
13 | | - <canvas id="canvas2"></canvas> |
| 31 | + <div class="demo-title"> |
| 32 | + <p><a href="http://trackingjs.com">tracking.js</a> - match similar feature points in two images</p> |
| 33 | + </div> |
| 34 | + |
| 35 | + <div class="demo-frame"> |
| 36 | + <div class="demo-container"> |
| 37 | + <img id="image1" src="assets/brief1.png" /> |
| 38 | + <img id="image2" src="assets/brief2.png" /> |
| 39 | + <canvas id="canvas" width="786" height="295"></canvas> |
| 40 | + </div> |
| 41 | + </div> |
| 42 | + |
14 | 43 | <script> |
15 | | - var width = 256; |
16 | | - var height = 192; |
17 | | - var canvas1 = document.getElementById('canvas1'); |
18 | | - var canvas2 = document.getElementById('canvas2'); |
19 | | - var context1 = canvas1.getContext('2d'); |
20 | | - var context2 = canvas2.getContext('2d'); |
| 44 | + window.onload = function() { |
| 45 | + var width = 393; |
| 46 | + var height = 295; |
| 47 | + var canvas = document.getElementById('canvas'); |
| 48 | + var context = canvas.getContext('2d'); |
21 | 49 |
|
22 | | - tracking.Canvas.loadImage(canvas1, 'assets/box1.png', 0, 0, width, height, function() { |
23 | | - tracking.Canvas.loadImage(canvas2, 'assets/box2.png', 0, 0, width, height, function() { |
| 50 | + var image1 = document.getElementById('image1'); |
| 51 | + var image2 = document.getElementById('image2'); |
24 | 52 |
|
25 | | - var imageData1 = context1.getImageData(0, 0, width, height); |
26 | | - var imageData2 = context2.getImageData(0, 0, width, height); |
| 53 | + window.descriptorLength = 256; |
| 54 | + window.matchesShown = 30; |
| 55 | + window.blurRadius = 3; |
27 | 56 |
|
28 | | - var gray1 = tracking.Image.grayscale(tracking.Image.blur(imageData1.data, width, height, 3), width, height); |
29 | | - var gray2 = tracking.Image.grayscale(tracking.Image.blur(imageData2.data, width, height, 3), width, height); |
| 57 | + var doMatch = function() { |
| 58 | + tracking.Brief.N = window.descriptorLength; |
30 | 59 |
|
31 | | - var corners1 = tracking.Fast.findCorners(gray1, width, height); |
32 | | - var corners2 = tracking.Fast.findCorners(gray2, width, height); |
| 60 | + context.drawImage(image1, 0, 0, width, height); |
| 61 | + context.drawImage(image2, width, 0, width, height); |
| 62 | + |
| 63 | + var imageData1 = context.getImageData(0, 0, width, height); |
| 64 | + var imageData2 = context.getImageData(width, 0, width, height); |
| 65 | + |
| 66 | + var gray1 = tracking.Image.grayscale(tracking.Image.blur(imageData1.data, width, height, blurRadius), width, height); |
| 67 | + var gray2 = tracking.Image.grayscale(tracking.Image.blur(imageData2.data, width, height, blurRadius), width, height); |
| 68 | + |
| 69 | + var corners1 = tracking.Fast.findCorners(gray1, width, height); |
| 70 | + var corners2 = tracking.Fast.findCorners(gray2, width, height); |
| 71 | + |
| 72 | + var descriptors1 = tracking.Brief.getDescriptors(gray1, width, corners1); |
| 73 | + var descriptors2 = tracking.Brief.getDescriptors(gray2, width, corners2); |
| 74 | + |
| 75 | + var matches = tracking.Brief.reciprocalMatch(corners1, descriptors1, corners2, descriptors2); |
33 | 76 |
|
34 | | - var descriptors1 = tracking.Brief.getDescriptors(gray1, width, corners1); |
35 | | - var descriptors2 = tracking.Brief.getDescriptors(gray2, width, corners2); |
| 77 | + matches.sort(function(a, b) { |
| 78 | + return b.confidence - a.confidence; |
| 79 | + }); |
| 80 | + |
| 81 | + for (var i = 0; i < Math.min(window.matchesShown, matches.length); i++) { |
| 82 | + var color = '#' + Math.floor(Math.random()*16777215).toString(16); |
| 83 | + context.fillStyle = color; |
| 84 | + context.strokeStyle = color; |
| 85 | + context.fillRect(matches[i].keypoint1[0], matches[i].keypoint1[1], 4, 4); |
| 86 | + context.fillRect(matches[i].keypoint2[0] + width, matches[i].keypoint2[1], 4, 4); |
36 | 87 |
|
37 | | - var matches = tracking.Brief.reciprocalMatch(corners1, descriptors1, corners2, descriptors2); |
| 88 | + context.beginPath(); |
| 89 | + context.moveTo(matches[i].keypoint1[0], matches[i].keypoint1[1]); |
| 90 | + context.lineTo(matches[i].keypoint2[0] + width, matches[i].keypoint2[1]); |
| 91 | + context.stroke(); |
38 | 92 |
|
39 | | - for (var i = 0; i < matches.length; i++) { |
40 | | - var color = '#' + Math.floor(Math.random()*16777215).toString(16); |
41 | | - context1.fillStyle = color; |
42 | | - context1.fillRect(matches[i].keypoint1[0], matches[i].keypoint1[1], 4, 4); |
43 | | - context2.fillStyle = color; |
44 | | - context2.fillRect(matches[i].keypoint2[0], matches[i].keypoint2[1], 4, 4); |
45 | | - } |
| 93 | + } |
| 94 | + }; |
46 | 95 |
|
47 | | - }); |
48 | | - }); |
| 96 | + doMatch(); |
| 97 | + |
| 98 | + var gui = new dat.GUI(); |
| 99 | + gui.add(window, 'descriptorLength', 128, 512).step(32).onChange(doMatch); |
| 100 | + gui.add(window, 'matchesShown', 1, 100).onChange(doMatch); |
| 101 | + gui.add(window, 'blurRadius', 1.1, 5).onChange(doMatch); |
| 102 | + } |
49 | 103 | </script> |
50 | 104 | </body> |
51 | 105 | </html> |
0 commit comments