edit_reference.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <link rel="icon" href="favicon.ico?v=$COMMIT_HASH" type="image/x-icon">
  5. <title>Reference Image</title>
  6. <meta charset="utf-8"/>
  7. <style>
  8. h1 {font-size: 2em;}
  9. h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
  10. h3 {font-size: 1.2em;}
  11. p {font-size: 1em;}
  12. input[type=number] {
  13. width: 100px;
  14. margin-right: 10px;
  15. padding: 3px 5px;
  16. display: inline-block;
  17. border: 1px solid #ccc;
  18. font-size: 16px;
  19. }
  20. .button {
  21. padding: 5px 10px;
  22. width: 210px;
  23. font-size: 16px;
  24. }
  25. table {
  26. padding: 5px;
  27. }
  28. </style>
  29. <link href="firework.css?v=$COMMIT_HASH" rel="stylesheet">
  30. <script type="text/javascript" src="jquery-3.6.0.min.js?v=$COMMIT_HASH"></script>
  31. <script type="text/javascript" src="firework.js?v=$COMMIT_HASH"></script>
  32. </head>
  33. <body style="font-family: arial; padding: 0px 10px;">
  34. <h2>Reference Image</h2>
  35. <p>On this page you define the Reference Image.
  36. See <a href=https://jomjol.github.io/AI-on-the-edge-device-docs/Reference-Image/ target=_blank>https://jomjol.github.io/AI-on-the-edge-device-docs/Reference-Image/</a> for explanations.</p>
  37. <p>After saving a new Reference Image, make sure to update the <a href=edit_alignment.html>Alignment Marks</a> and then
  38. the <a href=edit_digits.html>digit</a> resp. <a href=edit_analog.html>analog</a> ROI's.<br>
  39. Only after those steps a reboot is required.</p>
  40. <table>
  41. <tr>
  42. <td><input class="button" type="button" value="Show Actual Reference" onclick="showReference(param)"></td>
  43. <td><input class="button" type="button" value="Create New Reference" onclick="loadRawImage()"></td>
  44. <td><input class="button" type="submit" id="take" onclick="doTake()" value="Take Image"></td>
  45. </tr>
  46. <tr>
  47. <td style="padding-top: 10px"><label for="mirror" id="labelmirror">Mirror Image:</label></td>
  48. <td style="padding-top: 10px"><input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()"></td>
  49. <td>
  50. <class id="TakeImage_LEDIntensity_text" style="color:black;">LEDIntensity: </class>
  51. <input type="number" id="TakeImage_LEDIntensity_value1" size="13" value=0 min="0" max="100" style="float: right; clear: both;">
  52. </td>
  53. </tr>
  54. <tr>
  55. <td><label for="flip" id="labelflip">Flip Image Size:</label></td>
  56. <td><input type="checkbox" id="flip" name="flip" value="1" onchange="drawRotated()"></td>
  57. <td>
  58. <class id="TakeImage_Brightness_text" style="color:black;">Brightness: </class>
  59. <input type="number" id="TakeImage_Brightness_value1" size="13" value=0 min="-2" max="2" style="float: right; clear: both;">
  60. </td>
  61. </tr>
  62. <tr>
  63. <td><label for="mirror">Pre-rotate Angle:</label></td>
  64. <td><input type="number" id="prerotateangle" name="prerotateangle" value="0" min="-360" max="360" onchange="drawRotated()">Degrees</td>
  65. <td>
  66. <class id="TakeImage_Contrast_text" style="color:black;">Contrast</class>
  67. <input type="number" id="TakeImage_Contrast_value1" size="13" value=0 min="-2" max="2" style="float: right; clear: both;">
  68. </td>
  69. </tr>
  70. <tr>
  71. <td><label for="mirror">Fine Alignment:</label></td>
  72. <td><input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">Degrees</td>
  73. <td>
  74. <class id="TakeImage_Saturation_text" style="color:black;">Saturation</class>
  75. <input type="number" id="TakeImage_Saturation_value1" size="13" value=0 min="-2" max="2" style="float: right; clear: both;">
  76. </td>
  77. </tr>
  78. </table>
  79. <table>
  80. <tr>
  81. <td><canvas id="canvas"></canvas></td>
  82. </tr>
  83. <tr>
  84. <td><input class="button" type="button" id="updatereferenceimage" value="Save" onclick="SaveReference()">
  85. <p>Proceed to update the <a href=edit_alignment.html>Alignment Marks</a> when you are done.</p></td>
  86. </tr>
  87. </table>
  88. <script type="text/javascript" src="common.js?v=$COMMIT_HASH"></script>
  89. <script type="text/javascript" src="readconfigcommon.js?v=$COMMIT_HASH"></script>
  90. <script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>
  91. <script language="JavaScript">
  92. var canvas = document.getElementById('canvas'),
  93. ctx = canvas.getContext('2d'),
  94. imageObj = new Image()
  95. domainname = getDomainname();
  96. isActReference = false;
  97. param;
  98. function doReboot() {
  99. if (confirm("Are you sure you want to reboot? Did you save the config?")) {
  100. var stringota = getDomainname() + "/reboot";
  101. window.location = stringota;
  102. window.location.href = stringota;
  103. window.location.assign(stringota);
  104. window.location.replace(stringota);
  105. }
  106. }
  107. function doTake(){
  108. var xhttp = new XMLHttpRequest();
  109. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  110. {
  111. _intensity = document.getElementById("TakeImage_LEDIntensity_value1").value;
  112. if (_intensity == "") _intensity = "50";
  113. _brightness = document.getElementById("TakeImage_Brightness_value1").value;
  114. _contrast = document.getElementById("TakeImage_Contrast_value1").value;
  115. _saturation = document.getElementById("TakeImage_Saturation_value1").value;
  116. url = getDomainname() + "/editflow?task=test_take&bri=" + _brightness;
  117. url = url + "&con=" + _contrast + "&sat=" + _saturation + "&int=" + _intensity;
  118. }
  119. else
  120. {
  121. url = domainname + "/editflow?task=test_take";
  122. }
  123. if (domainname.length > 0){
  124. url = url + "&host=" + domainname;
  125. }
  126. xhttp.open("GET", url, false);
  127. xhttp.send();
  128. loadRawImage();
  129. }
  130. function loadRawImage(){
  131. url = getDomainname() + "/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
  132. document.getElementById("finerotate").disabled = false;
  133. document.getElementById("prerotateangle").disabled = false;
  134. document.getElementById("updatereferenceimage").disabled = false;
  135. document.getElementById("take").disabled = false;
  136. if (param["Alignment"]["InitialMirror"].found)
  137. document.getElementById("mirror").disabled = false;
  138. else
  139. {
  140. document.getElementById("labelmirror").style = "color:lightgrey;";
  141. }
  142. if (param["Alignment"]["FlipImageSize"].found)
  143. document.getElementById("flip").disabled = false;
  144. else
  145. {
  146. document.getElementById("labelflip").style = "color:lightgrey;";
  147. }
  148. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  149. {
  150. document.getElementById("TakeImage_Brightness_value1").disabled = false;
  151. document.getElementById("TakeImage_Contrast_value1").disabled = false;
  152. document.getElementById("TakeImage_Saturation_value1").disabled = false;
  153. document.getElementById("TakeImage_LEDIntensity_value1").disabled = false;
  154. }
  155. else
  156. {
  157. document.getElementById("TakeImage_Brightness_value1").type = "hidden";
  158. document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
  159. }
  160. // if (param["TakeImage"]["Saturation"].found)
  161. // document.getElementById("TakeImage_Saturation_value1").disabled = false;
  162. // if (param["TakeImage"]["Contrast"].found)
  163. // document.getElementById("TakeImage_Contrast_value1").disabled = false;
  164. isActReference = false;
  165. loadCanvas(url);
  166. drawRotated();
  167. }
  168. function showReference(_param){
  169. url = getDomainname() + "/fileserver/config/reference.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);;
  170. document.getElementById("finerotate").value = 0;
  171. document.getElementById("prerotateangle").value = _param["Alignment"]["InitialRotate"].value1;
  172. if (_param["Alignment"]["InitialMirror"].found && (_param["Alignment"]["InitialMirror"].value1 == "true"))
  173. document.getElementById("mirror").checked = true;
  174. if (_param["Alignment"]["FlipImageSize"].found && (_param["Alignment"]["FlipImageSize"].value1 == "true"))
  175. document.getElementById("flip").checked = true;
  176. document.getElementById("finerotate").disabled = true;
  177. document.getElementById("prerotateangle").disabled = true;
  178. document.getElementById("updatereferenceimage").disabled = true;
  179. document.getElementById("take").disabled = true;
  180. document.getElementById("TakeImage_Brightness_value1").disabled = true;
  181. document.getElementById("TakeImage_Saturation_value1").disabled = true;
  182. document.getElementById("TakeImage_Contrast_value1").disabled = true;
  183. document.getElementById("TakeImage_LEDIntensity_value1").disabled = true;
  184. document.getElementById("mirror").disabled = false;
  185. document.getElementById("flip").disabled = false;
  186. if (!(param["TakeImage"]["Brightness"].found))
  187. {
  188. document.getElementById("TakeImage_Brightness_value1").type = "hidden";
  189. document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
  190. }
  191. document.getElementById("mirror").disabled = true;
  192. document.getElementById("flip").disabled = true;
  193. isActReference = true;
  194. loadCanvas(url);
  195. drawRotated(false, true);
  196. }
  197. function dataURLtoBlob(dataurl) {
  198. var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
  199. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  200. while(n--){
  201. u8arr[n] = bstr.charCodeAt(n);
  202. }
  203. return new Blob([u8arr], {type:mime});
  204. }
  205. function SaveReference(){
  206. if (confirm("Are you sure you want to update the reference image?")) {
  207. param["Alignment"]["InitialRotate"].value1 = document.getElementById("prerotateangle").value;
  208. if ((param["Alignment"]["InitialMirror"].found == true) && (document.getElementById("mirror").checked))
  209. {
  210. param["Alignment"]["InitialMirror"].value1 = "true";
  211. param["Alignment"]["InitialMirror"]["found"] = true;
  212. param["Alignment"]["InitialMirror"]["enabled"] = true;
  213. }
  214. else
  215. param["Alignment"]["InitialMirror"].value1 = "false";
  216. if ((param["Alignment"]["FlipImageSize"].found == true) && (document.getElementById("flip").checked))
  217. param["Alignment"]["FlipImageSize"].value1 = "true";
  218. else
  219. param["Alignment"]["FlipImageSize"].value1 = "false";
  220. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  221. {
  222. ReadParameter(param, "TakeImage", "Brightness", false);
  223. ReadParameter(param, "TakeImage", "Contrast", false);
  224. ReadParameter(param, "TakeImage", "Saturation", false);
  225. ReadParameter(param, "TakeImage", "LEDIntensity", false);
  226. }
  227. var canvas = document.getElementById("canvas");
  228. drawRotated(false);
  229. WriteConfigININew();
  230. SaveConfigToServer(getDomainname());
  231. SaveCanvasToImage(canvas, "/config/reference.jpg", true, getDomainname());
  232. showReference(param);
  233. UpdatePage();
  234. firework.launch('Reference got updated. It will get applied after the next reboot!', 'success', 5000);
  235. }
  236. }
  237. function loadCanvas(dataURL) {
  238. var canvas = document.getElementById('canvas');
  239. var context = canvas.getContext('2d');
  240. imageObj.onload = function() {
  241. canvas.width = this.width;
  242. canvas.height = this.height;
  243. drawRotated();
  244. };
  245. imageObj.src = dataURL;
  246. }
  247. function getCoords(elem) { // crossbrowser version
  248. var box = elem.getBoundingClientRect();
  249. var body = document.body;
  250. var docEl = document.documentElement;
  251. var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
  252. var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
  253. var clientTop = docEl.clientTop || body.clientTop || 0;
  254. var clientLeft = docEl.clientLeft || body.clientLeft || 0;
  255. var top = box.top + scrollTop - clientTop;
  256. var left = box.left + scrollLeft - clientLeft;
  257. return { top: Math.round(top), left: Math.round(left) };
  258. }
  259. function init() {
  260. canvas.addEventListener('mousemove', mouseMove, false);
  261. loadConfig(getDomainname());
  262. ParseConfig();
  263. param = getConfigParameters();
  264. param["TakeImage"]["LEDIntensity"]["enabled"] = true;
  265. param["TakeImage"]["Brightness"]["enabled"] = true;
  266. param["TakeImage"]["Contrast"]["enabled"] = true;
  267. param["TakeImage"]["Saturation"]["enabled"] = true;
  268. if (!param["TakeImage"]["LEDIntensity"]["found"])
  269. {
  270. param["TakeImage"]["LEDIntensity"]["found"] = true;
  271. param["TakeImage"]["LEDIntensity"]["value1"] = "50";
  272. }
  273. if (!param["TakeImage"]["Brightness"]["found"])
  274. {
  275. param["TakeImage"]["Brightness"]["found"] = true;
  276. param["TakeImage"]["Brightness"]["value1"] = "0";
  277. }
  278. if (!param["TakeImage"]["Contrast"]["found"])
  279. {
  280. param["TakeImage"]["Contrast"]["found"] = true;
  281. param["TakeImage"]["Contrast"]["value1"] = "0";
  282. }
  283. if (!param["TakeImage"]["Saturation"]["found"])
  284. {
  285. param["TakeImage"]["Saturation"]["found"] = true;
  286. param["TakeImage"]["Saturation"]["value1"] = "0";
  287. }
  288. UpdateInput();
  289. showReference(param);
  290. }
  291. function UpdateInput() {
  292. WriteParameter(param, category, "TakeImage", "Brightness", false);
  293. WriteParameter(param, category, "TakeImage", "Contrast", false);
  294. WriteParameter(param, category, "TakeImage", "Saturation", false);
  295. WriteParameter(param, category, "TakeImage", "LEDIntensity", false);
  296. }
  297. function ReadParameter(_param, _cat, _name, _optional, _select = false){
  298. if (_param[_cat][_name]["found"]){
  299. if (_optional) {
  300. _param[_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;
  301. }
  302. if (_select) {
  303. var sel = document.getElementById(_cat+"_"+_name+"_value1");
  304. _param[_cat][_name]["value1"] = sel.options[sel.selectedIndex].text;
  305. }
  306. else {
  307. for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
  308. _param[_cat][_name]["value"+j] = document.getElementById(_cat+"_"+_name+"_value"+j).value;
  309. }
  310. }
  311. }
  312. }
  313. function WriteParameter(_param, _category, _cat, _name, _optional, _select = false, _anzpara = 1){
  314. if (_param[_cat][_name]["found"]){
  315. if (_optional) {
  316. document.getElementById(_cat+"_"+_name+"_enabled").checked = _param[_cat][_name]["enabled"];
  317. for (var j = 1; j <= _anzpara; ++j) {
  318. document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_param[_cat][_name]["enabled"];
  319. }
  320. }
  321. document.getElementById(_cat+"_"+_name+"_text").style="color:black;"
  322. if (_select) {
  323. var textToFind = _param[_cat][_name]["value1"];
  324. var dd = document.getElementById(_cat+"_"+_name+"_value1");
  325. for (var i = 0; i < dd.options.length; i++) {
  326. if (dd.options[i].text.toLowerCase() === textToFind.toLowerCase()) {
  327. dd.selectedIndex = i;
  328. break;
  329. }
  330. }
  331. }
  332. else {
  333. for (var j = 1; j <= _anzpara; ++j) {
  334. document.getElementById(_cat+"_"+_name+"_value"+j).value = _param[_cat][_name]["value"+j];
  335. }
  336. }
  337. }
  338. else {
  339. if (_optional) {
  340. document.getElementById(_cat+"_"+_name+"_enabled").disabled = true;
  341. for (var j = 1; j <= _anzpara; ++j) {
  342. document.getElementById(_cat+"_"+_name+"_value"+j).disabled = true;
  343. }
  344. }
  345. document.getElementById(_cat+"_"+_name+"_text").style="color:lightgrey;"
  346. }
  347. }
  348. function drawRotated(_grid = true, _isreference = false){
  349. finerot= parseFloat(document.getElementById("finerotate").value);
  350. prerot = parseFloat(document.getElementById("prerotateangle").value);
  351. mirror = document.getElementById("mirror").checked;
  352. flip = document.getElementById("flip").checked;
  353. if (finerot == 1) {
  354. prerot+=1
  355. finerot = 0
  356. }
  357. if (finerot == -1) {
  358. prerot-=1
  359. finerot = 0
  360. }
  361. degrees = finerot + prerot;
  362. document.getElementById("finerotate").value = finerot;
  363. document.getElementById("prerotateangle").value = prerot;
  364. var canvas = document.getElementById('canvas');
  365. if (flip == 1)
  366. {
  367. canvas.width = imageObj.height;
  368. canvas.height = imageObj.width;
  369. }
  370. else
  371. {
  372. canvas.width = imageObj.width;
  373. canvas.height = imageObj.height;
  374. }
  375. var canvas = document.getElementById('canvas');
  376. var context = canvas.getContext('2d');
  377. context.clearRect(0,0,canvas.width,canvas.height);
  378. context.save();
  379. if (isActReference)
  380. {
  381. context.drawImage(imageObj,0,0);
  382. }
  383. else
  384. {
  385. context.translate(canvas.width/2,canvas.height/2);
  386. context.rotate(degrees*Math.PI/180);
  387. if (mirror) {
  388. context.scale(-1, 1);
  389. }
  390. context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
  391. }
  392. context.restore();
  393. if (_grid == true && !isActReference){
  394. drawGrid();
  395. }
  396. }
  397. function drawGrid(){
  398. var canvas = document.getElementById('canvas');
  399. var ctx = canvas.getContext('2d');
  400. w = canvas.width;
  401. h = canvas.height;
  402. ctx.save();
  403. ctx.strokeStyle = '#00FF00';
  404. for (i = h/2; i < h; i += 100)
  405. {
  406. ctx.moveTo(0, i);
  407. ctx.lineTo(w, i);
  408. ctx.stroke();
  409. ctx.moveTo(0, h-i);
  410. ctx.lineTo(w, h-i);
  411. ctx.stroke();
  412. }
  413. for (i = w/2; i < w; i += 100)
  414. {
  415. ctx.moveTo(i, 0);
  416. ctx.lineTo(i, h);
  417. ctx.stroke();
  418. ctx.moveTo(w-i, 0);
  419. ctx.lineTo(w-i, h);
  420. ctx.stroke(); }
  421. ctx.restore();
  422. }
  423. function mouseMove(e) {
  424. drawRotated();
  425. var canvas = document.getElementById('canvas');
  426. var context = canvas.getContext('2d');
  427. zw = getCoords(this);
  428. x = e.pageX - zw.left;
  429. y = e.pageY - zw.top;
  430. context.lineWidth = 2;
  431. context.strokeStyle = "#00FF00";
  432. context.beginPath();
  433. context.moveTo(0,y);
  434. context.lineTo(canvas.width, y);
  435. context.moveTo(x, 0);
  436. context.lineTo(x, canvas.height);
  437. context.stroke();
  438. }
  439. init();
  440. </script>
  441. </body>
  442. </html>