UNPKG

p5.beholder

Version:

A p5 library to facilitate using the Beholder system for Aruco marker detection.

1 lines 38.8 kB
(()=>{var e={854:(e,t,n)=>{var r;window,e.exports=(r=n(346),function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t){e.exports=r},function(e,t,n){"use strict";var r=n(2),a=n.n(r)()((function(e){return e[1]}));a.push([e.i,"#beholder-overlay {\n top: 0;\n left: 0;\n position: absolute;\n}\n\n#beholder-video {\n display: none;\n}\n\n.hidden {\n display: none;\n}\n\n#detection-panel {\n width: min(90vw, 800px);\n height: 90vh;\n margin: 5vh calc(50vw - 0.5 * min(90vw, 800px));\n box-sizing: border-box;\n z-index: 999;\n /* display: none; */\n background: black;\n overflow-y: scroll;\n overflow-x: hidden;\n color: white;\n \n font-family: monospace;\n font-size: 12px;\n position: relative;\n}\n\n#detection-panel #full-video-div {\n position: relative;\n float: left;\n width: 100%;\n}\n\n#full-video-div canvas {\n position: relative;\n width: 100%;\n}\n\n#full-video-div #detection-area {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border: 1px solid #00FF00;\n}\n\n#detection-panel #detection-video-div {\n position: relative;\n float: left;\n width: 100%;\n}\n\n#detection-video-div #detection-canvas {\n position: relative;\n width: 100%;\n}\n\n#area-buttons {\n position: relative;\n float: left;\n width: 100%;\n height: 5em;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n#area-buttons button {\n padding: 0.5em 1em;\n margin: 1em;\n}\n\n#detection-video-div #debug-canvas {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n#detection-panel #parameters-menu {\n position: relative;\n float: left;\n clear: both;\n margin: 1em 0 1em 0em;\n padding: 1em 1.5em 1em 1.5em;\n background: black;\n}\n\n#detection-panel #parameters-menu .parameter-item {\n position: relative;\n float: left;\n clear: both;\n margin: 0.25em 0 0.25em 0;\n}\n\n#detection-panel #parameters-menu .parameter-item span {\n position: relative;\n float: left;\n width: 18em;\n font-weight: 600;\n color: white;\n}\n\n\n#toggle-screen {\n position: absolute;\n left: 10px;\n top: 10px;\n width: 60px;\n height: 60px;\n background: #000;\n z-index: 9999;\n color: white;\n text-align: center;\n font-size: 20px;\n font-weight: 400;\n padding: 18px 0;\n border-radius: 30px;\n box-sizing: border-box;\n cursor: pointer;\n transition: all 100ms ease-in;\n}\n\n#toggle-screen:hover, #toggle-screen:active {\n background: white;\n color: black;\n}\n\n#beholder-video {\n display: none;\n}\n",""]),t.a=a},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(r)for(var i=0;i<this.length;i++){var o=this[i][0];null!=o&&(a[o]=!0)}for(var s=0;s<e.length;s++){var c=[].concat(e[s]);r&&a[c[0]]||(n&&(c[2]?c[2]="".concat(n," and ").concat(c[2]):c[2]=n),t.push(c))}},t}},function(e,t,n){"use strict";n.r(t),n.d(t,"update",(function(){return B})),n.d(t,"getAllMarkers",(function(){return F})),n.d(t,"getMarker",(function(){return z})),n.d(t,"getMarkerPair",(function(){return $}));const r=[{width:320,height:240},{width:640,height:480},{width:1280,height:720},{width:1920,height:1080}];var a=class{constructor(e){this.video=e,this.vStream=null;const t=document.querySelector("#camera_param_id");t.innerHTML="",navigator.mediaDevices.enumerateDevices().then((e=>{e.forEach(((e,n)=>{if("videoinput"===e.kind){const r=document.createElement("option");r.value=e.deviceId,r.label=e.label?e.label:n,0===n&&(r.selected=!0),t.appendChild(r)}}))}))}startCameraFeed(e){let t=e.videoSize,n=e.camID,a=e.rearCamera,i=e.torch;const o=r[t];return this.vStream&&this.vStream.getTracks().forEach((e=>{e.stop()})),void 0===navigator.mediaDevices.getUserMedia&&(navigator.mediaDevices.getUserMedia=function(e){var t=navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((function(n,r){t.call(navigator,e,n,r)})):Promise.reject(new Error("getUserMedia is not implemented in this browser"))}),navigator.mediaDevices.getUserMedia({video:{width:o.width,height:o.height,deviceId:0===n||a?{}:{exact:n},facingMode:a?{exact:"environment"}:{}}}).then((e=>{if("srcObject"in this.video?this.video.srcObject=e:this.video.src=window.URL.createObjectURL(e),this.video.width=e.getVideoTracks()[0].getSettings().width,this.video.height=e.getVideoTracks()[0].getSettings().height,this.video.play(),this.vStream=e,console.log("BEHOLDER: new video stream established"),i)if(ImageCapture){const t=e.getVideoTracks()[0];new ImageCapture(t).getPhotoCapabilities().then((()=>{void 0!==t.getCapabilities().torch&&t.applyConstraints({advanced:[{torch:i}]})}))}else console.warn("**BEHOLDER WARNING** Flahslight/Torch functionality is not supported on this device or platform")}))}},i=i||{};i.Image=function(e,t,n){this.width=e||0,this.height=t||0,this.data=n||[]},i.grayscale=function(e,t){for(var n=e.data,r=t.data,a=n.length,i=0,o=0;i<a;i+=4)r[o++]=.299*n[i]+.587*n[i+1]+.114*n[i+2]+.5&255;return t.width=e.width,t.height=e.height,t},i.threshold=function(e,t,n){var r,a=e.data,i=t.data,o=a.length,s=[];for(r=0;r<256;++r)s[r]=r<=n?0:255;for(r=0;r<o;++r)i[r]=s[a[r]];return t.width=e.width,t.height=e.height,t},i.adaptiveThreshold=function(e,t,n,r){var a,o=e.data,s=t.data,c=o.length,d=[];for(i.stackBoxBlur(e,t,n),a=0;a<768;++a)d[a]=a-255<=-r?255:0;for(a=0;a<c;++a)s[a]=d[o[a]-s[a]+255];return t.width=e.width,t.height=e.height,t},i.otsu=function(e){var t,n,r,a=e.data,i=a.length,o=[],s=0,c=0,d=0,h=0,l=0,u=0;for(r=0;r<256;++r)o[r]=0;for(r=0;r<i;++r)o[a[r]]++;for(r=0;r<256;++r)c+=o[r]*r;for(r=0;r<256;++r)if(0!==(h+=o[r])){if(0==(l=i-h))break;(n=h*l*(t=(d+=o[r]*r)/h-(c-d)/l)*t)>u&&(u=n,s=r)}return s},i.stackBoxBlurMult=[1,171,205,293,57,373,79,137,241,27,391,357,41,19,283,265],i.stackBoxBlurShift=[0,9,10,11,9,12,10,11,12,9,13,13,10,9,13,13],i.BlurStack=function(){this.color=0,this.next=null},i.stackBoxBlur=function(e,t,n){var r,a,o,s,c,d,h,l,u,m,p=e.data,y=t.data,v=e.height,x=e.width,g=v-1,f=x-1,b=n+n+1,_=n+1,w=i.stackBoxBlurMult[n],k=i.stackBoxBlurShift[n];for(r=a=new i.BlurStack,m=1;m<b;++m)r=r.next=new i.BlurStack;for(r.next=a,c=0,u=0;u<v;++u){for(d=c,s=_*(o=p[c]),r=a,m=0;m<_;++m)r.color=o,r=r.next;for(m=1;m<_;++m)r.color=p[c+m],s+=r.color,r=r.next;for(r=a,l=0;l<x;++l)y[c++]=s*w>>>k,h=d+((h=l+_)<f?h:f),s-=r.color-p[h],r.color=p[h],r=r.next}for(l=0;l<x;++l){for(d=(c=l)+x,s=_*(o=y[c]),r=a,m=0;m<_;++m)r.color=o,r=r.next;for(m=1;m<_;++m)r.color=y[d],s+=r.color,r=r.next,d+=x;for(r=a,u=0;u<v;++u)y[c]=s*w>>>k,h=l+((h=u+_)<g?h:g)*x,s-=r.color-y[h],r.color=y[h],r=r.next,c+=x}return t},i.gaussianBlur=function(e,t,n,r){var a=i.gaussianKernel(r);return t.width=e.width,t.height=e.height,n.width=e.width,n.height=e.height,i.gaussianBlurFilter(e,n,a,!0),i.gaussianBlurFilter(n,t,a,!1),t},i.findContours=function(e,t){var n,r,a,o,s,c,d,h,l,u=e.width,m=e.height,p=[];for(n=i.binaryBorder(e,t),r=i.neighborhoodDeltas(u+2),a=u+3,s=1,h=0;h<m;++h,a+=2)for(l=0;l<u;++l,++a)0!==(o=n[a])&&(c=d=!1,1===o&&0===n[a-1]?c=!0:o>=1&&0===n[a+1]&&(d=!0),(c||d)&&(++s,p.push(i.borderFollowing(n,a,s,{x:l,y:h},d,r))));return p},i.borderFollowing=function(e,t,n,r,a,o){var s,c,d,h,l,u=[];u.hole=a,h=l=a?0:4;do{if(0!==e[s=t+o[h=h-1&7]])break}while(h!==l);if(h===l)e[t]=-n,u.push({x:r.x,y:r.y});else for(c=t;;){l=h;do{d=c+o[++h]}while(0===e[d]);if((h&=7)-1>>>0<l>>>0?e[c]=-n:1===e[c]&&(e[c]=n),u.push({x:r.x,y:r.y}),r.x+=i.neighborhood[h][0],r.y+=i.neighborhood[h][1],d===t&&c===s)break;c=d,h=h+4&7}return u},i.neighborhood=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1],[0,1],[1,1]],i.neighborhoodDeltas=function(e){for(var t=[],n=i.neighborhood.length,r=0;r<n;++r)t[r]=i.neighborhood[r][0]+i.neighborhood[r][1]*e;return t.concat(t)},i.approxPolyDP=function(e,t){var n,r,a,i,o,s,c,d,h,l,u,m={start_index:0,end_index:0},p={start_index:0,end_index:0},y=[],v=[],x=e.length;for(t*=t,u=0,h=0;h<3;++h)for(o=0,r=e[u=(u+p.start_index)%x],++u===x&&(u=0),l=1;l<x;++l)n=e[u],++u===x&&(u=0),(i=(c=n.x-r.x)*c+(d=n.y-r.y)*d)>o&&(o=i,p.start_index=l);for(o<=t?y.push({x:r.x,y:r.y}):(m.start_index=u,m.end_index=p.start_index+=m.start_index,p.start_index-=p.start_index>=x?x:0,p.end_index=m.start_index,p.end_index<p.start_index&&(p.end_index+=x),v.push({start_index:p.start_index,end_index:p.end_index}),v.push({start_index:m.start_index,end_index:m.end_index}));0!==v.length;){if(a=e[(m=v.pop()).end_index%x],r=e[u=m.start_index%x],++u===x&&(u=0),m.end_index<=m.start_index+1)s=!0;else{for(o=0,c=a.x-r.x,d=a.y-r.y,h=m.start_index+1;h<m.end_index;++h)n=e[u],++u===x&&(u=0),(i=Math.abs((n.y-r.y)*c-(n.x-r.x)*d))>o&&(o=i,p.start_index=h);s=o*o<=t*(c*c+d*d)}s?y.push({x:r.x,y:r.y}):(p.end_index=m.end_index,m.end_index=p.start_index,v.push({start_index:p.start_index,end_index:p.end_index}),v.push({start_index:m.start_index,end_index:m.end_index}))}return y},i.warp=function(e,t,n,r){var a,o,s,c,d,h,l,u,m,p,y,v,x,g,f,b,_,w,k,M,S,E,P=e.data,A=t.data,C=e.width,T=e.height,D=0;for(x=(v=i.getPerspectiveTransform(n,r-1))[8],g=v[2],f=v[5],S=0;S<r;++S)for(b=x+=v[7],_=g+=v[1],w=f+=v[4],E=0;E<r;++E)b+=v[6],o=(a=(k=(_+=v[0])/b)>>>0)==C-1?a:a+1,c=1-(s=k-a),l=1-(h=(M=(w+=v[3])/b)-(d=M>>>0)),u=m=d*C,p=y=(d===T-1?d:d+1)*C,A[D++]=l*(c*P[u+a]+s*P[m+o])+h*(c*P[p+a]+s*P[y+o])&255;return t.width=r,t.height=r,t},i.getPerspectiveTransform=function(e,t){var n=i.square2quad(e);return n[0]/=t,n[1]/=t,n[3]/=t,n[4]/=t,n[6]/=t,n[7]/=t,n},i.square2quad=function(e){var t,n,r,a,i,o,s,c=[];return t=e[0].x-e[1].x+e[2].x-e[3].x,n=e[0].y-e[1].y+e[2].y-e[3].y,0===t&&0===n?(c[0]=e[1].x-e[0].x,c[1]=e[2].x-e[1].x,c[2]=e[0].x,c[3]=e[1].y-e[0].y,c[4]=e[2].y-e[1].y,c[5]=e[0].y,c[6]=0,c[7]=0,c[8]=1):(r=e[1].x-e[2].x,a=e[3].x-e[2].x,i=e[1].y-e[2].y,s=r*(o=e[3].y-e[2].y)-a*i,c[6]=(t*o-a*n)/s,c[7]=(r*n-t*i)/s,c[8]=1,c[0]=e[1].x-e[0].x+c[6]*e[1].x,c[1]=e[3].x-e[0].x+c[7]*e[3].x,c[2]=e[0].x,c[3]=e[1].y-e[0].y+c[6]*e[1].y,c[4]=e[3].y-e[0].y+c[7]*e[3].y,c[5]=e[0].y),c},i.isContourConvex=function(e){var t,n,r,a,i,o,s,c,d=0,h=!0,l=e.length,u=0,m=0;for(n=e[l-1],i=(t=e[0]).x-n.x,o=t.y-n.y;u<l;++u){if(++m===l&&(m=0),n=t,s=(t=e[m]).x-n.x,3==(d|=(a=(c=t.y-n.y)*i)>(r=s*o)?1:a<r?2:3)){h=!1;break}i=s,o=c}return h},i.perimeter=function(e){for(var t,n,r=e.length,a=0,i=r-1,o=0;a<r;i=a++)t=e[a].x-e[i].x,n=e[a].y-e[i].y,o+=Math.sqrt(t*t+n*n);return o},i.minEdgeLength=function(e){for(var t,n,r,a=e.length,i=0,o=a-1,s=1/0;i<a;o=i++)(t=(n=e[i].x-e[o].x)*n+(r=e[i].y-e[o].y)*r)<s&&(s=t);return Math.sqrt(s)},i.countNonZero=function(e,t){var n,r,a=e.data,i=t.height,o=t.width,s=t.x+t.y*e.width,c=e.width-o,d=0;for(n=0;n<i;++n){for(r=0;r<o;++r)0!==a[s++]&&++d;s+=c}return d},i.binaryBorder=function(e,t){var n,r,a=e.data,i=e.height,o=e.width,s=0,c=0;for(r=-2;r<o;++r)t[c++]=0;for(n=0;n<i;++n){for(t[c++]=0,r=0;r<o;++r)t[c++]=0===a[s++]?0:1;t[c++]=0}for(r=-2;r<o;++r)t[c++]=0;return t};var o=i;function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){d(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function d(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const h={};let l={MIN_MARKER_DISTANCE:10,MIN_MARKER_PERIMETER:.2,MAX_MARKER_PERIMETER:.8,SIZE_AFTER_PERSPECTIVE_REMOVAL:49};h.setCameraParams=e=>{l=c(c({},l),e)},h.Marker=(e,t)=>{const n=(t[0].y-t[2].y)/(t[0].x-t[2].x),r=(t[1].y-t[3].y)/(t[1].x-t[3].x),a={x:0,y:0};var i;return a.x=function(e,t,n,r){return(n.y-r.y+t*r.x-e*n.x)/(t-e)}(n,r,t[0],t[1]),a.y=(i=t[0],n*(a.x-i.x)+i.y),{id:e,corners:t,center:a}},h.Detector=function(){this.grey=new o.Image,this.thres=new o.Image,this.homography=new o.Image,this.binary=[],this.contours=[],this.polys=[],this.candidates=[]},h.Detector.prototype.detect=function(e,t){return o.grayscale(e,this.grey),o.adaptiveThreshold(this.grey,this.thres,2,7),this.contours=o.findContours(this.thres,this.binary),this.candidates=this.findCandidates(this.contours,e.width*t.minMarkerPerimeter,e.width*t.maxMarkerPerimeter,.05,10),this.candidates=this.clockwiseCorners(this.candidates),this.candidates=this.notTooNear(this.candidates,t.minMarkerDistance),this.findMarkers(this.grey,this.candidates,t.sizeAfterPerspectiveRemoval)},h.Detector.prototype.findCandidates=function(e,t,n,r,a){var i,s,c,d=[],h=e.length;for(this.polys=[],c=0;c<h;++c)(i=e[c]).length>=t&&i.length<=n&&(s=o.approxPolyDP(i,i.length*r),this.polys.push(s),4===s.length&&o.isContourConvex(s)&&o.minEdgeLength(s)>=a&&d.push(s));return d},h.Detector.prototype.clockwiseCorners=function(e){var t,n,r,a,i,o=e.length;for(i=0;i<o;++i)t=e[i][1].x-e[i][0].x,r=e[i][1].y-e[i][0].y,n=e[i][2].x-e[i][0].x,t*(e[i][2].y-e[i][0].y)-r*n<0&&(a=e[i][1],e[i][1]=e[i][3],e[i][3]=a);return e},h.Detector.prototype.notTooNear=function(e,t){var n,r,a,i,s,c,d=[],h=e.length;for(i=0;i<h;++i)for(s=i+1;s<h;++s){for(n=0,c=0;c<4;++c)n+=(r=e[i][c].x-e[s][c].x)*r+(a=e[i][c].y-e[s][c].y)*a;n/4<t*t&&(o.perimeter(e[i])<o.perimeter(e[s])?e[i].tooNear=!0:e[s].tooNear=!0)}for(i=0;i<h;++i)e[i].tooNear||d.push(e[i]);return d},h.Detector.prototype.findMarkers=function(e,t,n){var r,a,i,s=[],c=t.length;for(i=0;i<c;++i)r=t[i],o.warp(e,this.homography,r,n),o.threshold(this.homography,this.homography,o.otsu(this.homography)),(a=this.getMarker(this.homography,r))&&s.push(a);return s},h.Detector.prototype.getMarker=function(e,t){var n,r,a,i,s,c=e.width/7>>>0,d=c*c>>1,l=[],u=[],m=[];for(i=0;i<7;++i)for(a=0===i||6===i?1:6,s=0;s<7;s+=a)if(n={x:s*c,y:i*c,width:c,height:c},o.countNonZero(e,n)>d)return null;for(i=0;i<5;++i)for(l[i]=[],s=0;s<5;++s)n={x:(s+1)*c,y:(i+1)*c,width:c,height:c},l[i][s]=o.countNonZero(e,n)>d?1:0;for(u[0]=l,m[0]=this.hammingDistance(u[0]),r={first:m[0],second:0},i=1;i<4;++i)u[i]=this.rotate(u[i-1]),m[i]=this.hammingDistance(u[i]),m[i]<r.first&&(r.first=m[i],r.second=i);return 0!==r.first?null:h.Marker(this.mat2id(u[r.second]),this.rotate2(t,4-r.second))},h.Detector.prototype.hammingDistance=function(e){var t,n,r,a,i,o=[[1,0,0,0,0],[1,0,1,1,1],[0,1,0,0,1],[0,1,1,1,0]],s=0;for(r=0;r<5;++r){for(n=1/0,a=0;a<4;++a){for(t=0,i=0;i<5;++i)t+=e[r][i]===o[a][i]?0:1;t<n&&(n=t)}s+=n}return s},h.Detector.prototype.mat2id=function(e){var t,n=0;for(t=0;t<5;++t)n<<=1,n|=e[t][1],n<<=1,n|=e[t][3];return n},h.Detector.prototype.rotate=function(e){var t,n,r=[],a=e.length;for(t=0;t<a;++t)for(r[t]=[],n=0;n<e[t].length;++n)r[t][n]=e[e[t].length-n-1][t];return r},h.Detector.prototype.rotate2=function(e,t){var n,r=[],a=e.length;for(n=0;n<a;++n)r[n]=e[(t+n)%a];return r};var u=h;class m{static sub(e,t){return new m(t.x-e.x,t.y-e.y)}static fromAngle(e){return new m(Math.cos(e),Math.sin(e))}static add(e,t){return new m(t.x+e.x,t.y+e.y)}static addScalar(e,t,n){const r=e.x+t.x*n,a=e.y+t.y*n;return new m(r,a)}static mag(e){return Math.sqrt(e.x*e.x+e.y*e.y)}static angleBetween(e,t){return Math.atan2(e.x*t.y-e.y*t.x,e.x*t.x+e.y*t.y)}static rotate(e,t){const n=e.x*Math.cos(t)-e.y*Math.sin(t),r=e.x*Math.sin(t)+e.y*Math.cos(t);return new m(n,r)}static scale(e,t){return new m(e.x*t,e.y*t)}static dist(e,t){return new m(t.x-e.x,t.y-e.y).mag()}static dist2(e,t){return new m(t.x-e.x,t.y-e.y).mag2()}static normalize(e){const t=e.mag();return new m(e.x/t,e.y/t)}static copy(e){return new m(e.x,e.y)}constructor(e,t){this.x=e,this.y=t}clone(){return new m(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}set(e,t){return this.x=e,this.y=t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}scale(e){return this.x*=e,this.y*=e,this}mag(){return Math.sqrt(this.x*this.x+this.y*this.y)}mag2(){return this.x*this.x+this.y*this.y}dist(e){return m.sub(this,e).mag()}dist2(e){return m.sub(this,e).mag2()}normalize(){const e=this.mag();return this.x/=e,this.y/=e,this}getAngle(){return Math.atan2(this.y,this.x)}rotate(e){const t=this.x*Math.cos(e)-this.y*Math.sin(e),n=this.x*Math.sin(e)+this.y*Math.cos(e);return this.x=t,this.y=n,this}dot(e){return this.x*e.x+this.y*e.y}angleBetween(e){return Math.atan2(this.x*e.y-this.y*e.x,this.x*e.x+this.y*e.y)}}const p=new m(1,0);var y=class{constructor(e){this.timeout=50,this.timestamp=this.timeout,this.present=!1,this.center=new m(0,0),this.position=new m(0,0),this.rawPosition=new m(0,0),this.deltaPosition=new m(0,0),this.corners=[],this.rawRotation=0,this.rotation=0,this.deltaRotation=0,this.scale=29/640,this.enable3D=!1,this.avgSideLength=0,this.deltaAvgSideLength=0,this.id=e,this.positionSmoothing=0,this.rotationSmoothing=0}setScale(e,t){this.scale=e/t}update(e){this.timestamp=0,this.present=!0,this.deltaPosition.copy(this.position);let t=this.center.clone();this.center.x=this.center.x*this.positionSmoothing+e.center.x*(1-this.positionSmoothing),this.center.y=this.center.y*this.positionSmoothing+e.center.y*(1-this.positionSmoothing),this.position.copy(this.center),this.rawPosition.copy(e.center),this.deltaPosition.sub(this.position).scale(-1),(isNaN(this.center.x)||isNaN(this.center.y))&&(this.center.set(t.x,t.y),this.position.set(t.x,t.y),this.deltaPosition.set(0,0),this.rawP,console.warn("BEHOLDER: Detection Broke Momentarily")),this.corners=e.corners.map((e=>e)),this.rawRotation=p.angleBetween(m.sub(this.corners[0],this.corners[1]));const n=m.fromAngle(this.rotation),r=m.fromAngle(this.rawRotation),a=new m(n.x*this.rotationSmoothing+(1*r.x-this.rotationSmoothing),n.y*this.rotationSmoothing+(1*r.y-this.rotationSmoothing));this.rotation=a.getAngle(),this.deltaRotation=m.angleBetween(n,a);const i=this.corners.map(((e,t,n)=>{const r=e.x-n[(t+1)%n.length].x,a=e.y-n[(t+1)%n.length].y;return Math.sqrt(r*r+a*a)}));this.deltaAvgSideLength=-this.avgSideLength,this.avgSideLength=(i[0]+i[1]+i[2]+i[3])/4,this.deltaAvgSideLength+=this.avgSideLength,this.enable3D&&(this.center.z=this.avgPerim/this.scale)}updatePresence(e){this.timestamp+=e>30?30:e,this.present=!(this.timestamp>=this.timeout)}},v=n(0),x=n(1);function g(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function f(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?g(Object(n),!0).forEach((function(t){b(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):g(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function b(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const w={camera_params:{camID:void 0,videoSize:1,torch:!1,rearCamera:!1},detection_params:{minMarkerDistance:10,minMarkerPerimeter:.02,maxMarkerPerimeter:.8,sizeAfterPerspectiveRemoval:49,area:{start:{x:0,y:0},end:{x:1,y:1}}},feed_params:{contrast:0,brightness:0,grayscale:0,flip:!1},overlay_params:{present:!0,hide:!0}};let k=!1,M=[],S=!1;const E=[];let P,A,C,T,D,R,O,I,L,q={},j=Date.now();const B=()=>{const e=Date.now(),t=e-j;j=e,(e=>{const t=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){a=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(a)throw i}}return n}}(e,t)||function(e,t){if(e){if("string"==typeof e)return _(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(e,2),n=t[0],r=t[1];R.width!==D.width&&(R.width=D.width,R.height=D.height),S||(O.drawImage(D,0,0,R.width,R.height),O.strokeStyle="#00FF00",O.beginPath(),O.moveTo(R.width*q.detection_params.area.start.x,R.height*q.detection_params.area.start.y),O.lineTo(R.width*q.detection_params.area.end.x,R.height*q.detection_params.area.start.y),O.lineTo(R.width*q.detection_params.area.end.x,R.height*q.detection_params.area.end.y),O.lineTo(R.width*q.detection_params.area.start.x,R.height*q.detection_params.area.end.y),O.closePath(),O.stroke()),I.width=C.width,I.height=C.height,S||L.clearRect(0,0,I.width,I.height),n.forEach((e=>{const t=E.find((t=>t.id===e.id));if(void 0===t)return;if(t.update(e),S)return;const n=t.center,r=t.corners,a=t.rotation;L.strokeStyle="#FF00AA",L.beginPath(),r.forEach(((e,t)=>{L.moveTo(e.x,e.y);let n=r[(t+1)%r.length];L.lineTo(n.x,n.y)})),L.stroke(),L.closePath(),L.strokeStyle="blue",L.strokeRect(r[0].x-2,r[0].y-2,4,4),L.strokeStyle="#FF00AA",L.strokeRect(n.x-1,n.y-1,2,2),L.font="12px monospace",L.textAlign="center",L.fillStyle="#FF55AA",L.fillText("ID="+t.id,n.x,n.y-7),L.fillText(a.toFixed(2),n.x,n.y+15)})),E.forEach((e=>e.updatePresence(r)))})(A.detect(t,q.feed_params,q.detection_params))},F=()=>E,z=e=>E.find((t=>t.id===e)),$=(e,t)=>new class{constructor(e,t){this.markerA=e,this.markerB=t}get isPresent(){return this.markerA.present&&this.markerB.present}get angleBetween(){return this.markerA.rotation-this.markerB.rotation}get distance(){return m.sub(this.markerA.center,this.markerB.center).mag()}getRelativePosition(e){if(this.isPresent()){const t=[{x:-e/2,y:-e/2},{x:e/2,y:-e/2},{x:e/2,y:e/2},{x:-e/2,y:e/2}],n=function(e,t,n,r,a,i,o,s){const c=v.matrix([[a.x,a.y,1,0,0,0,-e.x*a.x,-e.x*a.y],[0,0,0,a.x,a.y,1,-e.y*a.x,-e.y*a.y],[i.x,i.y,1,0,0,0,-t.x*i.x,-t.x*i.y],[0,0,0,i.x,i.y,1,-t.y*i.x,-t.y*i.y],[o.x,o.y,1,0,0,0,-n.x*o.x,-n.x*o.y],[0,0,0,o.x,o.y,1,-n.y*o.x,-n.y*o.y],[s.x,s.y,1,0,0,0,-r.x*s.x,-r.x*s.y],[0,0,0,s.x,s.y,1,-r.y*s.x,-r.y*s.y]]),d=v.matrix([[e.x],[e.y],[t.x],[t.y],[n.x],[n.y],[r.x],[r.y]]),h=v.lusolve(c,d);return v.matrix([[v.subset(h,v.index(0,0)),v.subset(h,v.index(1,0)),v.subset(h,v.index(2,0))],[v.subset(h,v.index(3,0)),v.subset(h,v.index(4,0)),v.subset(h,v.index(5,0))],[v.subset(h,v.index(6,0)),v.subset(h,v.index(7,0)),1]])}(this.markerA.corners[0],this.markerA.corners[1],this.markerA.corners[2],this.markerA.corners[3],t[0],t[1],t[2],t[3]),r=v.inv(n),a=e=>function(e,t){const n=v.matrix([[t.x],[t.y],[1]]),r=v.multiply(e,n);return{x:v.subset(r,v.index(0,0))/v.subset(r,v.index(2,0)),y:v.subset(r,v.index(1,0))/v.subset(r,v.index(2,0))}}(r,e),i=a(this.markerA.center),o=a(this.markerB.center),s=a(this.markerA.corners[0]),c=a(this.markerA.corners[1]),d=a(this.markerB.corners[0]),h=a(this.markerB.corners[1]),l=m.sub(i,o),u=m.sub(s,c);return{distance:m.mag(l),heading:m.angleBetween(u,l),rotation:m.angleBetween(u,m.sub(d,h))}}return{distance:void 0,heading:void 0,rotation:void 0}}}(E[e],E[t]);t.default={init:(e,t,n)=>{if(n)n.length<=0&&console.warn("BEHOLDER WARNING: your provided list of markers is empty, no markers will be tracked"),n.forEach((e=>E.push(new y(e))));else for(let e=0;e<100;e++)E.push(new y(e));const r=document.querySelector(e);q=w,t&&(t.camera_params&&(q.camera_params=f(f({},q.camera_params),t.camera_params)),t.detection_params&&(q.detection_params=f(f({},q.detection_params),t.detection_params)),t.feed_params&&(q.feed_params=f(f({},q.feed_params),t.feed_params)),t.overlay_params&&(q.overlay_params=f(f({},q.overlay_params),t.overlay_params))),r.innerHTML=((e,t)=>`\n<div id="beholder-overlay" class="active">\n <style type="text/css">\n ${t}\n </style>\n\n <div id="toggle-screen">\n ☰\n </div>\n\n <div id="detection-panel" ${e.overlay_params.hide?'class="hidden"':""}>\n \n <div id="full-video-div">\n <video id="beholder-video"></video>\n <canvas id="detection-canvas-overlay"></canvas>\n </div>\n \n <div id="area-buttons">\n <button id="set-area" class="parameter-item">Set Detection Area</button>\n <div id="set-area-instructions"></div>\n <button id="clear-area" class="parameter-item">Clear Detection Area</button>\n </div>\n \n <div id="detection-video-div">\n <canvas id="detection-canvas"></canvas>\n <canvas id="debug-canvas"></canvas>\n </div>\n\n <div id="parameters-menu" >\n <div class="parameter-item">\n <span>Camera Feed ID</span>\n <select name="CAMERA_INDEX" id="camera_param_id" class="param-input">\n <option value="0" label="0" selected></option>\n </select>\n </div>\n\n <div class="parameter-item">\n <span>Video Size</span>\n <select name="VIDEO_SIZE_INDEX" id="camera_param_videoSize" class="param-input">\n <option value="0" label="320&times;240" ${0==e.camera_params.videoSize?"selected":""}></option>\n <option value="1" label="640&times;480" ${1==e.camera_params.videoSize?"selected":""}></option>\n <option value="2" label="1280&times;720" ${2==e.camera_params.videoSize?"selected":""}></option>\n <option value="2" label="1920&times;1080" ${3==e.camera_params.videoSize?"selected":""}></option>\n </select>\n </div>\n\n <div class="parameter-item">\n <span>Min Marker Distance</span>\n <input\n id="detection_params-minMarkerDistance"\n class="param-input"\n type="number"\n name="MIN_MARKER_DISTANCE"\n min="1"\n max="50"\n value="${e.detection_params.minMarkerDistance}"\n step="1"\n />\n </div>\n\n <div class="parameter-item">\n <span>Min Marker Perimeter</span>\n <input\n id="detection_params-minMarkerPerimeter"\n class="param-input"\n type="number"\n name="MIN_MARKER_PERIMETER"\n min="0.01"\n max="0.99"\n value="${e.detection_params.minMarkerPerimeter}"\n step="0.01"\n />\n </div>\n <div class="parameter-item">\n <span>Max Marker Perimeter</span>\n <input\n id="detection_params-maxMarkerPerimeter"\n class="param-input"\n type="number"\n name="MAX_MARKER_PERIMETER"\n min="0.01"\n max="4.00"\n value="${e.detection_params.maxMarkerPerimeter}"\n step="0.01"\n />\n </div>\n\n <div class="parameter-item">\n <span>Size After Perspective Removal</span>\n <input\n id="detection_params-sizeAfterPerspectiveRemoval"\n class="param-input"\n type="number"\n name="SIZE_AFTER_PERSPECTIVE_REMOVAL"\n min="1"\n max="200"\n value="${e.detection_params.sizeAfterPerspectiveRemoval}"\n step="1"\n />\n </div>\n\n <div class="parameter-item">\n <span>Contrast</span>\n <input\n id="detection_params-contrast"\n class="param-input"\n type="number"\n name="IMAGE_CONTRAST"\n min="-100"\n max="100"\n value="${e.feed_params.contrast}"\n step="1"\n />\n </div>\n\n <div class="parameter-item">\n <span>Brightness</span>\n <input\n id="detection_params-brightness"\n class="param-input"\n type="number"\n name="IMAGE_BRIGHTNESS"\n min="-100"\n max="100"\n value="${e.feed_params.brightness}"\n step="1"\n />\n </div>\n\n <div class="parameter-item">\n <span>Grayscale</span>\n <input\n id="detection_params-grayscale"\n class="param-input"\n type="number"\n name="IMAGE_GRAYSCALE"\n min="0"\n max="100"\n value="${e.feed_params.grayscale}"\n step="1"\n />\n </div>\n\n <div class="parameter-item">\n <span>Torch</span>\n <input\n id="detection_params-torch"\n class="param-input isCheck"\n type="checkbox"\n name="torch"\n ${e.camera_params.torch?"checked":""}\n />\n </div>\n\n <div class="parameter-item">\n <span>Mirror Camera</span>\n <input\n id="detection_params-flip"\n class="param-input isCheck"\n type="checkbox"\n name="Mirror"\n ${e.feed_params.flip?"checked":""}\n />\n </div>\n </div>\n </div>\n</div>`)(q,x.a),D=r.querySelector("#beholder-video"),D.setAttribute("playsinline","playsinline"),document.querySelector("#set-area-instructions").innerHTML=`\n start=x:${q.detection_params.area.start.x.toFixed(2)},y:${q.detection_params.area.start.y.toFixed(2)}&nbsp;&nbsp;&nbsp;\n end=x:${q.detection_params.area.end.x.toFixed(2)},y:${q.detection_params.area.end.y.toFixed(2)}\n `,r.querySelector("#toggle-screen").addEventListener("click",(()=>{S?r.querySelector("#detection-panel").classList.remove("hidden"):r.querySelector("#detection-panel").classList.add("hidden"),S=!S})),S=q.overlay_params.hide,S&&r.querySelector("#detection-panel").classList.add("hidden"),r.querySelector("#set-area").addEventListener("click",(()=>{k=!0,M=[],document.querySelector("#set-area-instructions").innerHTML="Select top-left corner."})),r.querySelector("#detection-canvas-overlay").addEventListener("click",(e=>{k&&(M.push({x:e.offsetX/e.target.clientWidth,y:e.offsetY/e.target.clientHeight}),M.length>1?(k=!1,q.detection_params.area={start:{x:Math.min(M[0].x,M[1].x),y:Math.min(M[0].y,M[1].y)},end:{x:Math.max(M[0].x,M[1].x),y:Math.max(M[0].y,M[1].y)}},document.querySelector("#set-area-instructions").innerHTML=`\n start=x:${q.detection_params.area.start.x.toFixed(2)},y:${q.detection_params.area.start.y.toFixed(2)}&nbsp;&nbsp;&nbsp;\n end=x:${q.detection_params.area.end.x.toFixed(2)},y:${q.detection_params.area.end.y.toFixed(2)}\n `):1===M.length&&(document.querySelector("#set-area-instructions").innerHTML="Select bottom-right corner."))})),r.querySelector("#clear-area").addEventListener("click",(()=>{q.detection_params.area={start:{x:0,y:0},end:{x:1,y:1}},document.querySelector("#set-area-instructions").innerHTML=`\n start=x:${q.detection_params.area.start.x.toFixed(2)},y:${q.detection_params.area.start.y.toFixed(2)}&nbsp;&nbsp;&nbsp;\n end=x:${q.detection_params.area.end.x.toFixed(2)},y:${q.detection_params.area.end.y.toFixed(2)}\n `})),r.querySelector("#camera_param_id").addEventListener("change",(e=>{q.camera_params.camID=e.target.value,P.startCameraFeed(q.camera_params)})),r.querySelector("#camera_param_videoSize").addEventListener("change",(e=>{q.camera_params.videoSize=e.target.value,P.startCameraFeed(q.camera_params)})),r.querySelector("#detection_params-minMarkerDistance").addEventListener("change",(e=>q.detection_params.minMarkerDistance=e.target.value)),r.querySelector("#detection_params-minMarkerPerimeter").addEventListener("change",(e=>q.detection_params.minMarkerPerimeter=e.target.value)),r.querySelector("#detection_params-maxMarkerPerimeter").addEventListener("change",(e=>q.detection_params.maxMarkerPerimeter=e.target.value)),r.querySelector("#detection_params-sizeAfterPerspectiveRemoval").addEventListener("change",(e=>q.detection_params.sizeAfterPerspectiveRemoval=e.target.value)),r.querySelector("#detection_params-contrast").addEventListener("change",(e=>q.feed_params.contrast=e.target.value)),r.querySelector("#detection_params-brightness").addEventListener("change",(e=>q.feed_params.brightness=e.target.value)),r.querySelector("#detection_params-grayscale").addEventListener("change",(e=>q.feed_params.grayscale=e.target.value)),r.querySelector("#detection_params-flip").addEventListener("change",(e=>q.feed_params.flip=e.target.checked)),r.querySelector("#detection_params-torch").addEventListener("change",(e=>{q.camera_params.torch=e.target.checked,P.startCameraFeed(q.camera_params)})),P=new a(r.querySelector("#beholder-video")),A=new class{constructor(e,t){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.video=t,this.detector=new u.Detector}detect(e,t,n){if(this.video&&4===this.video.readyState){const r=n.area.end.x-n.area.start.x,a=n.area.end.y-n.area.start.y;this.video.width>20&&this.canvas.width!==this.video.width*r&&(this.canvas.width=this.video.width*r,this.canvas.height=this.video.height*a),this.ctx.filter=`contrast(${(100+Math.floor(t.contrast))/100})\n brightness(${(100+Math.floor(t.brightness))/100})\n grayscale(${Math.floor(t.grayscale)/100})`,t.flip?(this.ctx.save(),this.ctx.translate(this.canvas.width,0),this.ctx.scale(-1,1),this.ctx.drawImage(this.video,n.area.start.x*this.video.width,n.area.start.y*this.video.height,this.canvas.width,this.canvas.height,0,0,this.canvas.width,this.canvas.height),this.ctx.restore()):this.ctx.drawImage(this.video,n.area.start.x*this.video.width,n.area.start.y*this.video.height,this.canvas.width,this.canvas.height,0,0,this.canvas.width,this.canvas.height);let i=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height);return[this.detector.detect(i,n),e,this.canvas.width,this.canvas.height]}return[[],e,this.canvas.width,this.canvas.height]}}(r.querySelector("#detection-canvas"),r.querySelector("#beholder-video")),R=r.querySelector("#detection-canvas-overlay"),O=R.getContext("2d"),C=r.querySelector("#detection-canvas"),T=C.getContext("2d"),I=r.querySelector("#debug-canvas"),L=I.getContext("2d"),P.startCameraFeed(q.camera_params)},update:B,getMarker:z,getMarkerPair:$,getAllMarkers:F,hide:()=>{document.querySelector("#detection-panel").classList.add("hidden")},show:()=>{document.querySelector("#detection-panel").classList.remove("hidden")},getVideo:()=>P.video}}]))},346:e=>{"use strict";e.exports=void 0}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),(()=>{class e{constructor(){this._bh=n(854).default}prepare(t=e._defaultConfig,n="#beholder_root"){if(this._config=t,this._rootQuery=n,null==this._rootQuery||"#beholder_root"==this._rootQuery){let e=document.createElement("div");e.setAttribute("id","beholder_root"),document.querySelector("body").appendChild(e)}this._bh.init(this._rootQuery,this._config)}markerPresenceToMouseClick(e=0,t=0,n=0){let r=createVector(t,n);const a=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,button:0,clientX:r.x,clientY:r.y}),i=new MouseEvent("mouseup",{bubbles:!0,cancelable:!0,button:0,clientX:r.x,clientY:r.y});this._forwardEventForId(e,"markerdetected",a),this._forwardEventForId(e,"markerundetected",i)}markerPresenceToKey(e=0,t="Space"){const n=new KeyboardEvent("keydown",{bubbles:!0,cancelable:!0,keyCode:t,which:t}),r=new KeyboardEvent("keyup",{bubbles:!0,cancelable:!0,keyCode:t,which:t});this._forwardEventForId(e,"markerdetected",n),this._forwardEventForId(e,"markerundetected",r)}setMarkersTimeout(e=50){for(let t=0;t<this._bh.getAllMarkers().length;t++)this._bh.getMarker(t).timeout=e}debugDrawMarker(e=0){let t=this._bh.getMarker(e);if(0==t.present)return;push(),fill(255,0,0),stroke(0,0,0),beginShape(),vertex(this.cameraToCanvasVector(t.corners[0]).x,this.cameraToCanvasVector(t.corners[0]).y),vertex(this.cameraToCanvasVector(t.corners[1]).x,this.cameraToCanvasVector(t.corners[1]).y),vertex(this.cameraToCanvasVector(t.corners[2]).x,this.cameraToCanvasVector(t.corners[2]).y),vertex(this.cameraToCanvasVector(t.corners[3]).x,this.cameraToCanvasVector(t.corners[3]).y),endShape(CLOSE),fill(0,255,0);let n=this.cameraToCanvasXY(t.center.x,t.center.y);ellipse(n.x,n.y,10,10),textSize(12),text(t.rotation,n.x,n.y+30,80,40),pop()}cameraToCanvasX(e){return map(e,0,this.cameraWidth,0,width)}cameraToCanvasY(e){return map(e,0,this.cameraHeight,0,height)}cameraToCanvasVector(e){return createVector(this.cameraToCanvasX(e.x),this.cameraToCanvasY(e.y))}cameraToCanvasXY(e,t){return createVector(this.cameraToCanvasX(e),this.cameraToCanvasY(t))}markerRotationInRange(e,t,n){const r=this._bh.getMarker(e),a=r.present?r.rotation:0;return this.angleInRange(a,t,n)}angleInRange(e,t,n){const r=p5.Vector.fromAngle(e,1),a=p5.Vector.fromAngle(t,1).angleBetween(r);return abs(a)<=n/2}getMarker(e){return this._bh.getMarker(e)}static _defaultConfig={camera_params:{videoSize:0,rearCamera:!1,torch:!1},detection_params:{minMarkerDistance:10,minMarkerPerimeter:.2,maxMarkerPerimeter:.8,sizeAfterPerspectiveRemoval:49},feed_params:{contrast:0,brightness:0,grayscale:0,flip:!1},overlay_params:{present:!0,hide:!0}};_forwardEventForId(e,t,n){window.addEventListener(t,(t=>{t.detail.id==e&&window.dispatchEvent(n)}))}}n.g.p5beholder=new e,n.g.p5.prototype.registerMethod("pre",(function(){const e=n.g.p5beholder;e.cameraWidth=e._bh.getVideo().width,e.cameraHeight=e._bh.getVideo().height;let t=e._bh.getAllMarkers().map((e=>e.present));e._bh.update();let r=e._bh.getAllMarkers().map((e=>e.present));1==frameCount&&(t=[!1],r=[!1]),t.forEach(((t,n)=>{const a=r[n];if(0!=t||1!=a)if(1!=t||0!=a);else{let t=new CustomEvent("markerundetected",{detail:{id:n,marker:e._bh.getMarker(n)}});window.dispatchEvent(t)}else{let t=new CustomEvent("markerdetected",{detail:{id:n,marker:e._bh.getMarker(n)}});window.dispatchEvent(t)}}))}))})()})();