diff --git a/appVideoServer/data/settings/callibration_cam0.npz b/appVideoServer/data/settings/callibration_cam0.npz new file mode 100644 index 0000000..040851c Binary files /dev/null and b/appVideoServer/data/settings/callibration_cam0.npz differ diff --git a/appVideoServer/data/settings/callibration_cam0_720.npz b/appVideoServer/data/settings/callibration_cam0_720.npz new file mode 100644 index 0000000..8d20672 Binary files /dev/null and b/appVideoServer/data/settings/callibration_cam0_720.npz differ diff --git a/appVideoServer/data/settings/callibration_cam1.npz b/appVideoServer/data/settings/callibration_cam1.npz new file mode 100644 index 0000000..867ef58 Binary files /dev/null and b/appVideoServer/data/settings/callibration_cam1.npz differ diff --git a/appVideoServer/data/settings/callibration_cam1_720.npz b/appVideoServer/data/settings/callibration_cam1_720.npz new file mode 100644 index 0000000..a85a40b Binary files /dev/null and b/appVideoServer/data/settings/callibration_cam1_720.npz differ diff --git a/appVideoServer/data/settings/camera_intrinsics_v0.npz b/appVideoServer/data/settings/camera_intrinsics_v0.npz new file mode 100644 index 0000000..f894cc2 Binary files /dev/null and b/appVideoServer/data/settings/camera_intrinsics_v0.npz differ diff --git a/appVideoServer/data/settings/camera_intrinsics_v1.npz b/appVideoServer/data/settings/camera_intrinsics_v1.npz new file mode 100644 index 0000000..9681556 Binary files /dev/null and b/appVideoServer/data/settings/camera_intrinsics_v1.npz differ diff --git a/appVideoServer/data/settings/settings.json b/appVideoServer/data/settings/settings.json new file mode 100644 index 0000000..ada9ccc --- /dev/null +++ b/appVideoServer/data/settings/settings.json @@ -0,0 +1,10 @@ +{ "coordinateSystem":{ + "MarkersUsed":"DICT_4X4_250", + "KnownMarkers": + { + "50": [0.0, 0.0, 0.0], + "71": [0.140, 0.0, 0.0], + "101": [0.0, -0.080, 0.0] + } + } +} diff --git a/appVideoServer/data/settings/settingsBoard.json b/appVideoServer/data/settings/settingsBoard.json new file mode 100644 index 0000000..89ea18b --- /dev/null +++ b/appVideoServer/data/settings/settingsBoard.json @@ -0,0 +1,10 @@ +{ "coordinateSystem":{ + "MarkersUsed":"DICT_4X4_250", + "KnownMarkers": + { + "50": [0.0, 0.0, 0.0], + "71": [0.140, 0.0, 0.0], + "101": [0.0, -0.080, 0.0] + } + } +} diff --git a/appVideoServer/data/settings/settingsMachine.json b/appVideoServer/data/settings/settingsMachine.json new file mode 100644 index 0000000..46d24c7 --- /dev/null +++ b/appVideoServer/data/settings/settingsMachine.json @@ -0,0 +1,10 @@ +{ "coordinateSystem":{ + "MarkersUsed":"DICT_4X4_250", + "KnownMarkers": + { + "58": [0.0, 0.0, 0.0], + "65": [0.161, 0.0, 0.0], + "75": [0.0, -0.070, 0.0] + } + } +} diff --git a/appVideoServer/https/server.crt b/appVideoServer/https/server.crt new file mode 100644 index 0000000..0fb61c6 --- /dev/null +++ b/appVideoServer/https/server.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUfD0V6IOHq6iL+tCtV3CMQ9w6uqQwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MTExNTA4NDMzOFoXDTI2MTEx +NTA4NDMzOFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEArK1NqQEZBpXDgfOTNFrIcTf0qmsE8yfpqahytAdD/wL3 +CE7YKPs5Bsq77YiPPC1Svc8Q8APETRjb3uPet+xfHtyCZX+cu8Dc45AA8sV1bAco +JDFH5x4oi9fnUBEMoxJewIrR6iGvPLN3OFzvq0QG65LTB7HEozYOeTBx2LNEzYWT ++iIu3Tj/iya4EWqsUKWv4LAdHxNfIyTScjYq98/thy9jbesVq2e62gV+q3Km3bqJ +Q+7NWwXM3sHvSXVU/+yqWxwMxiMO6t8QXFVP71ti6IdOdWlSOds5tTa1X0O6wdje +VKN+JXfI3M+Cq7fMLnOKyrm+olcQ9RHcrNHrN6LYrK/yXwW0XTdt0RDsbFE5VH8x +X887zS1Xj0q4IPXutm/Z5uHAGCchg5BDW+w08fxo3pdCIPVy6CVrpabR5lJ4cNPE +lzOAhCOAZYvFyATtJXOPw0CW5mVUDl2BTjPrijf/2YA0Vh+9j4SvwdPR7W2gXdPL +zsr04LwQmFLIEUKgpPlW28K2gun6H7vDshue+jJ9iuCF3BcC9MZI1hFi1omHaJ8T +ehX00Q5HTOhVZFdxzkGGCUbX7B7umKgbLXbItGU3Cnw2fdgi3+1zZbVSWAm/ixiQ +do/Iaw3CrO9pAgmy813hT95qnBKxmuXBeZ+pf1XlhvOAgJw+uhdWOdjGjyJPjIMC +AwEAAaNTMFEwHQYDVR0OBBYEFH0WYvzhiYjoWDpkmMdx0uk3I/NAMB8GA1UdIwQY +MBaAFH0WYvzhiYjoWDpkmMdx0uk3I/NAMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggIBAHC96KCq7u7WR2t6crbg+MjFuvq8lOGvYdxea4pw8aCK4T31 +KPSVU/4NzeIGHfjAvmghY8/J47wt15rI9nxGFyP0JBD+waSKo+Ruq1hOCSR1Qf3C +4GgUS64Fyj6uXrusszYsa8q50ZXitAYM6o4Nkd5PqQIouvwoHcAABSWBAdxxzXNO +6t+GGElYaajZ8Zv+pVKLdiRJny0A9PSSe3pPd/loqYecr8nX3Be2i+C6lgPFpYY4 +wpswmbGjt7oQgt2UCSr4Tz1tsfeZ94as3HYUDL5W1eIAQKUdtltBRNdC2DT53MS6 +9b2lgCDUNLXKtBe6naIpDRb/jWFXzPTUwEDyXJN6ORJFdAkYIBIoQKzGg+l9NEsO +lYyQB4bMoLwZ4a1B5R8PtUtWxtDcHAegdSIK/9fVz1/QcjYYr3/42NGF6Nr7kpGx +2QCj0z84hJbw/QEGBsg/yFvlOLRE83LTIkjoA4hPo3HRHPuy9/frc3bFk99LnX8+ +BKWbVb7J2eyCXX3LAcUb9RU8x4UvYqpjqjA6BKpryyEsRyhgZh/sVHvjwoW/ifFG +JAqQoYe+TCAPf7s/rsxjB6Y5NKDesFYqwT4qu02+xCmy6LjZc1lyyrzJJCAZ/bjN +ATomtrbmCgMho7FvIT7D2c+VRUBb2NSO64egUvxgXBYho8wbQOW6xkAuf/Ft +-----END CERTIFICATE----- diff --git a/appVideoServer/https/server.key b/appVideoServer/https/server.key new file mode 100644 index 0000000..1e18749 --- /dev/null +++ b/appVideoServer/https/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCsrU2pARkGlcOB +85M0WshxN/SqawTzJ+mpqHK0B0P/AvcITtgo+zkGyrvtiI88LVK9zxDwA8RNGNve +49637F8e3IJlf5y7wNzjkADyxXVsBygkMUfnHiiL1+dQEQyjEl7AitHqIa88s3c4 +XO+rRAbrktMHscSjNg55MHHYs0TNhZP6Ii7dOP+LJrgRaqxQpa/gsB0fE18jJNJy +Nir3z+2HL2Nt6xWrZ7raBX6rcqbduolD7s1bBczewe9JdVT/7KpbHAzGIw7q3xBc +VU/vW2Loh051aVI52zm1NrVfQ7rB2N5Uo34ld8jcz4Krt8wuc4rKub6iVxD1Edys +0es3otisr/JfBbRdN23REOxsUTlUfzFfzzvNLVePSrgg9e62b9nm4cAYJyGDkENb +7DTx/Gjel0Ig9XLoJWulptHmUnhw08SXM4CEI4Bli8XIBO0lc4/DQJbmZVQOXYFO +M+uKN//ZgDRWH72PhK/B09HtbaBd08vOyvTgvBCYUsgRQqCk+VbbwraC6fofu8Oy +G576Mn2K4IXcFwL0xkjWEWLWiYdonxN6FfTRDkdM6FVkV3HOQYYJRtfsHu6YqBst +dsi0ZTcKfDZ92CLf7XNltVJYCb+LGJB2j8hrDcKs72kCCbLzXeFP3mqcErGa5cF5 +n6l/VeWG84CAnD66F1Y52MaPIk+MgwIDAQABAoICACrjqMRvh13BWRwv+cIpQlwM +v/KMPmB+62S+eC8LFvKCNAWWP85+B74OIPtwzdLulvyaL+TNqrZTlFkaVDlutnmd +362CMtXXo4XKQNIMBYxdgrTqoKdhMET7zXJvqanfaDV+xYDX+QSkttoDC2yIqwdc +IppopyS6yoGDbOOcM1yw7v5T+zvral2PsmxxCHfHj5XJaJJNZ3X9MWA44BdJSAAp +3xJwL6OxUhHRB5NiGNw99tYuvEb9e9NgbCTcxc4DZJTYtLuJ/ayM1y136zDSjBCh +evViwY+pSf4eppIQ6pQ3X5G6QhzgUb22tQgd0NNA05pi5FzCL24Pj7ZFNZ1OD278 +mjozzNirn8plbgQ+OGCs5NHprjdwQNW+Q6sE34Yh8FBlF0JfNmk3uaKTetIwSsJF +laMHXR5OtDoX2cWqzjHijTDiUC5mk5ph8/lhOdY3Z1Ax1w52qKEFNOIC9gZrTgFE +2oyp/Nv0tdNUBuhMKOLvKF0xwCDP/2iWeYow0j7iclbpotK5oRKWjbIQqstKAAs7 +vRW6n5CTPUIyzE1oLglp7DbYy++xAUpLBjPYzZn5aKb680FSmJtbBF3CZDupfKus +b3bUWeVmY6TIakSRYMNXK9BWz1fXQinCoJx/ASv0yxpMsrEr/9NFI2f+gkWlD4hu +HX2DwIzGcpghYnUvngXxAoIBAQDTn5Ci652mxBEBkKgfX7QXp9oBdebmisJWeYca +qxVEiXfqoyfEKW+59Y+IZIANKA3e5R7HJofshKKrXJCLRTi7wSm+4oo4Oo/6TDDa +5Qmsxx9WkTJkBm0E/9nDI3e8q53LwiLOvXel/WZAYWXrIKsQJMgnDjFqdes5efG9 +k8jnZ8tf7TtaL7+B+ku5fLagWaLUltg3WS9GjdrS7ZMhkZDJ1ZqqVEQQYYgg756r +ksIim7jQL2dcW8wayB0g9SV7koIoIy/06lp7RX9HrMfhIH5Xorek44ZH2nCDPwtk +s2prjYIzneCt2+fibki/rj2riPlBXTTkf3z2SNe2tBlpx3etAoIBAQDQ4wIAKTVy +BSddk6oVqHNf3tfjub2pp28UXij+K0TMeZHDIDf3oy2AQ+LEatsA0h8g2m93TLIR +KxCBi/Us5DJzrvPNHEhB/XHWEcXinPSI0+guehOIqXKz6TtzA5+XuZE+r+NqhEL/ +2iVSK3va7WweeD/CC1G+HYN0zSdAaW6RzfQcDS6UmykoEu2wyRgO5TNBXj45eVh/ +/BFKv527oqetpchxhzEJ1ZzT+J1lJBtkKoE5AXb8Wsf3O5ZYwG8F8hQfLybzeIh2 +CBskuJO37xZxPSRgcNn5nd0rPPGWKEiX4cRsSTob8Pse5ifBNzxkS8v6s8yIIBt1 +S26WyWp1lFrvAoIBABoF5ihSpvlJ5Pl3S2VIRIIgLuu9Dt7Ms2ck3JtH7H6YFPny +hEJYAhgw/Sx9h02W3lXJgQZmU5KfIM3HvTKTGY3lC/ggLXUKpofV9LAGODFZ7x2b +D0JDlAZoW+PmKaQ2ylmzDsqze9IangdOstS+GKsMitxan3MC+yD/QN3aHXtvRRAP +wRuvAXK/T66IioCfZSmVPxNXUTvw17bWZiBboR1gufs2D4SgKbg7HxzkGCFfWtOm +8KPn2ep1LzfNTYWrl3vOD+ijJOtBuYwb0Bx7/W1TYhfRrsKJNwq8pu8ELRL6vMcS +I/3dK9+pRiLkD0tXtab3CjkLAFfcz0H1VaavU6UCggEABty+TxULfXBv56IXP1jm +WWrvurp6YZ1vh8LEI/116CXCRR/E1uzUbNdOFtfP1AoTHbgvW0L4wpmglDDt4Air +I6PGvKFGOmzCFZ9F2fkAC5KymPxHsgCnFQP/gPrIfmqJO/75QKGRtegLu9RT4FBW +cfXPWmeWyuEbVXX76SDNkhqq/1Trh9RFGNzuVBV3Jd4fvfEDqE21O5cjVkpPOz/P +tGOy3w/q64DKAyiyuwThpXvD/QRwTUAKO7QIb2f6/b4DLTcWV39JNF91zNIHgE5p +dVTl4gkzEAFAp8/7u8wc/mhbVJdfQlW7WjuDaNSQtlbLH7RSbtJnNIZC3s9FIRG7 +nwKCAQBEJnM0+kFJurE8wRWcHN/oHHyQCrMuFptV+9o1+Ncy3B5+kdo2Pqy0AXDY ++OZucTdkVqIxb0goM1FluP0os3oVq9w5wxZH2tksIEehWPPj3BaWkMVFQMy8vV+O +tn4xeOPK4V89voj8BuLsn2s5t6tEa9vvKuiOTPrnTalfoBYKxYANrOo24MLrCzlS +H++cDZD7ug/cBCSNENQsZDKNMekPRJFd3SYAe8VfM8UCfRMZbX9jQZn7dsSdLf+W +KX28dhZ8WnSBpJE4IVBzAPfiya9wN5+kKxh/AxD3cq3O6UXNA9FTbTxrDTYvHgAM +hwXVuAeFYYyuRFN8xJ9SkIPdpr1Y +-----END PRIVATE KEY----- diff --git a/appVideoServer/package-lock.json b/appVideoServer/package-lock.json new file mode 100644 index 0000000..53f363e --- /dev/null +++ b/appVideoServer/package-lock.json @@ -0,0 +1,1192 @@ +{ + "name": "video-streamer", + "version": "1.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "video-streamer", + "version": "1.1.0", + "dependencies": { + "compression": "^1.7.4", + "express": "^4.21.1", + "helmet": "^7.1.0", + "ws": "^8.18.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/appVideoServer/package.json b/appVideoServer/package.json new file mode 100644 index 0000000..a4116ed --- /dev/null +++ b/appVideoServer/package.json @@ -0,0 +1,20 @@ +{ + "name": "video-streamer", + "version": "1.1.0", + "description": "HTTPS + WSS dual-camera MJPEG streamer (modular)", + "main": "server.js", + "type": "commonjs", + "scripts": { + "start": "node server.js", + "dev": "PORT=8443 nodemon server.js" + }, + "dependencies": { + "compression": "^1.7.4", + "express": "^4.21.1", + "helmet": "^7.1.0", + "ws": "^8.18.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } +} \ No newline at end of file diff --git a/appVideoServer/programs/driver.js b/appVideoServer/programs/driver.js new file mode 100644 index 0000000..0ffdbed --- /dev/null +++ b/appVideoServer/programs/driver.js @@ -0,0 +1,71 @@ +const WebSocket = require("ws"); + +/** + * Forwards WebSocket messages between browser clients (/robot) + * and a target WebSocket server (behind a firewall). + * + * @param {WebSocket.Server} wssInput - Local WebSocket server for browser clients + * @param {string} targetUrl - URL of target WebSocket server, e.g. "wss://internal.local:8080" + */ +function setupCommandForwarding(wssInput, targetUrl) { + let targetSocket; + const clients = new Set(); + + function connectTarget() { + console.log(`🔌 Connecting to target server: ${targetUrl}`); + targetSocket = new WebSocket(targetUrl); + + targetSocket.on("open", () => { + console.log("✅ Connected to target server"); + }); + + targetSocket.on("message", (msg) => { + const data = msg.toString(); + console.log("⬅️ Message from target:", data); + // Broadcast to all connected browsers + for (const client of clients) { + if (client.readyState === WebSocket.OPEN) { + client.send(data); + } + } + }); + + targetSocket.on("close", () => { + console.warn("⚠️ Target connection closed. Reconnecting in 5s..."); + setTimeout(connectTarget, 5000); + }); + + targetSocket.on("error", (err) => { + console.error("❌ Target connection error:", err.message); + }); + } + + connectTarget(); + + // When a browser connects to /robot + wssInput.on("connection", (ws, req) => { + console.log("🤖 Browser connected:", req.socket.remoteAddress); + clients.add(ws); + + ws.on("message", (msg) => { + const data = msg.toString(); + console.log("➡️ From browser → target:", data); + if (targetSocket?.readyState === WebSocket.OPEN) { + targetSocket.send(data); + } else { + console.warn("⚠️ Target not connected. Message dropped."); + } + }); + + ws.on("close", () => { + clients.delete(ws); + console.log("🔌 Browser disconnected"); + }); + + ws.on("error", (err) => { + console.error("❌ Browser socket error:", err.message); + }); + }); +} + +module.exports = { setupCommandForwarding }; \ No newline at end of file diff --git a/appVideoServer/programs/input.js b/appVideoServer/programs/input.js new file mode 100644 index 0000000..a8a3254 --- /dev/null +++ b/appVideoServer/programs/input.js @@ -0,0 +1,49 @@ +// programs/input.js +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +function byIdCaptureCandidates() { + const dir = '/dev/v4l/by-id'; + try { + if (!fs.existsSync(dir)) return []; + return fs.readdirSync(dir) + .filter(n => n.endsWith('-index0')) + .map(n => fs.realpathSync(path.join(dir, n))); + } catch { + return []; + } +} + +function naiveVideoNodes() { + try { + return fs.readdirSync('/dev') + .filter(n => /^video\d+$/.test(n)) + .map(n => path.join('/dev', n)) + .sort((a, b) => Number(a.replace(/\D/g, '')) - Number(b.replace(/\D/g, ''))); + } catch { + return ['/dev/video0', '/dev/video2']; + } +} + +function pickDevices(env = process.env) { + const DEV0 = env.DEV0 || null; + const DEV1 = env.DEV1 || null; + + if (DEV0 && DEV1) return [DEV0, DEV1]; + + const byId = byIdCaptureCandidates(); + if (DEV0 || DEV1) { + const pool = byId.length ? byId : naiveVideoNodes(); + const d0 = DEV0 || pool[0]; + const d1 = DEV1 || pool.find(d => d !== d0) || pool[1]; + return [d0, d1]; + } + + if (byId.length >= 2) return [byId[0], byId[1]]; + const naive = naiveVideoNodes(); + return [naive[0], naive[1]]; +} + +module.exports = { pickDevices }; \ No newline at end of file diff --git a/appVideoServer/programs/log.js b/appVideoServer/programs/log.js new file mode 100644 index 0000000..bde9330 --- /dev/null +++ b/appVideoServer/programs/log.js @@ -0,0 +1,165 @@ +// programs/log.js +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +// --- configuration --- +const LOG_DIR = path.join(__dirname, '..', 'logs'); +fs.mkdirSync(LOG_DIR, { recursive: true }); + +function getLogFilePath(d = new Date()) { + const yyyy = d.getFullYear(); + const mm = String(d.getMonth() + 1).padStart(2, '0'); + const dd = String(d.getDate()).padStart(2, '0'); + return path.join(LOG_DIR, `${yyyy}_${mm}_${dd}.txt`); +} + +function write(obj) { + const line = JSON.stringify(obj) + '\n'; + fs.appendFile(getLogFilePath(), line, (err) => { + if (err) console.error('[log] write error:', err); + }); +} + +// --- common extractors --- +function commonFromReq(req) { + try { + const xff = req?.headers?.['x-forwarded-for']; + const xRealIp = req?.headers?.['x-real-ip']; + const ipFromXff = xff ? xff.split(',')[0].trim() : null; + const ip = + ipFromXff || + xRealIp || + req?.ip || + req?.socket?.remoteAddress || + null; + + const tls = + req?.socket?.encrypted + ? { + protocol: + typeof req.socket.getProtocol === 'function' + ? req.socket.getProtocol() + : null, + cipher: + typeof req.socket.getCipher === 'function' + ? (req.socket.getCipher() || {}).name + : null, + } + : null; + + // MAC is not available across routed networks + const mac = null; + + return { + ip, + ips: Array.isArray(req?.ips) ? req.ips : [], + xff: xff || null, + remoteAddress: req?.socket?.remoteAddress || null, + remoteFamily: req?.socket?.remoteFamily || null, + userAgent: req?.headers?.['user-agent'] || null, + acceptLanguage: req?.headers?.['accept-language'] || null, + secChUa: req?.headers?.['sec-ch-ua'] || null, + secChUaPlatform: req?.headers?.['sec-ch-ua-platform'] || null, + secChUaMobile: req?.headers?.['sec-ch-ua-mobile'] || null, + referer: req?.headers?.['referer'] || null, + tls, + mac, + }; + } catch { + return {}; + } +} + +function commonFromSocket(socket) { + return { + remoteAddress: socket?.remoteAddress || null, + remoteFamily: socket?.remoteFamily || null, + }; +} + +// --- specific log functions --- +function logHttpRequest(req) { + write({ + ts: new Date().toISOString(), + type: 'http', + method: req?.method || null, + url: (req?.originalUrl ?? req?.url) || null, + ...commonFromReq(req), + }); +} + +function logTcpConnection(socket) { + write({ + ts: new Date().toISOString(), + type: 'tcp', + ...commonFromSocket(socket), + }); +} + +function logHttpUpgrade(req) { + write({ + ts: new Date().toISOString(), + type: 'http-upgrade', + url: req?.url || null, + ...commonFromReq(req), + }); +} + +function logWssConnected(req) { + write({ + ts: new Date().toISOString(), + type: 'wss', + url: req?.url || null, + ...commonFromReq(req), + }); +} + +function logWssClosed(req, code, reason) { + write({ + ts: new Date().toISOString(), + type: 'wss-close', + url: req?.url || null, + code: typeof code === 'number' ? code : null, + reason: reason ? reason.toString() : null, + ...commonFromReq(req), + }); +} + +function logSnapshot(python, response){ + write({ + ts: new Date().toISOString(), + type: 'snapshot', + command: python.toString(), + wsResponse: response.toString() + }) +} + +// --- generic hooks you requested --- +function connected(context = {}) { + write({ + ts: new Date().toISOString(), + type: 'connected', + ...context, + }); +} + +function connectionLost(context = {}) { + write({ + ts: new Date().toISOString(), + type: 'connection-lost', + ...context, + }); +} + +module.exports = { + logHttpRequest, + logTcpConnection, + logHttpUpgrade, + logWssConnected, + logSnapshot, + logWssClosed, + connected, + connectionLost, +}; diff --git a/appVideoServer/programs/readCamPos.py b/appVideoServer/programs/readCamPos.py new file mode 100644 index 0000000..1cb1371 --- /dev/null +++ b/appVideoServer/programs/readCamPos.py @@ -0,0 +1,369 @@ +#!/usr/bin/env python3 +""" +ArUco detection with multi-marker machine-frame fit + camera pose output (OpenCV >= 4.8). + +- Reads: webCam_1.jpg +- Detects DICT_4X4_250 markers (ids expected: 0, 5, 10, 15) +- Uses multiple reference markers with known machine coordinates to fit camera->machine transform +- Reports positions/orientations of all markers **and the camera** in machine coordinates +- Draws detected markers, per-marker axes, and the machine axes +- Saves: webCam_1a.jpg (annotated) and marker_poses_machine.csv (poses incl. camera) + + +Usage: + python3 readCamPos.py -i snapshot_video1_1764493534200.jpg -npz camera_intrinsics_v0.npz -setting settings.json + + +""" +import faulthandler +faulthandler.enable() + +import argparse +import os +import sys +import csv +import json +import time +from typing import Tuple, Dict, List +import numpy as np +import cv2 + + + +# ----------------------- Configuration Defaults ----------------------- +IMAGE_PATH = "default.jpg" +OUTPUT_IMAGE_PATH = "default.jpg" +OUTPUT_CSV_PATH = "default.csv" +OUTPUT_JSON_PATH = "default.json" + +# Marker side length in meters (25 mm) +MARKER_LENGTH_M = 0.025 + +# Axis lengths for visualization (in meters) +AXIS_LENGTH_M = 0.05 # per-marker axis +MACHINE_AXIS_X_M = 0.200 # 200 mm along +X +MACHINE_AXIS_Y_M = -0.100 # -100 mm along Y (towards camera per description) +MACHINE_AXIS_Z_M = 0.100 # +Z visualized as 100 mm + +# Known machine coordinates for reference markers (meters) +cam_anchor_pts = {} + +EXPECTED_IDS = {50, 71, 101} + +# ----------------------- Utilities ----------------------- + +def load_intrinsics_npz(npz_path: str) -> Tuple[np.ndarray, np.ndarray]: + if os.path.exists(npz_path): + + print("NPZ from File:", npz_path) + data = np.load(npz_path) + for k in ('camera_matrix', 'mtx', 'K'): + if k in data: + camera_matrix = data[k].astype(np.float32) + break + else: + raise KeyError("Camera matrix not found.") + for k in ('dist_coeffs', 'dist', 'D'): + if k in data: + dist = data[k].astype(np.float32).reshape(-1, 1) + break + else: + dist = np.zeros((5, 1), dtype=np.float32) + return camera_matrix, dist + + camera_matrix = np.array([[1400, 0, 640], + [0, 1400, 360], + [0, 0, 1]], dtype=np.float32) + + dist_coeffs = np.zeros((5, 1), dtype=np.float32) + + print("[WARN] Using default approximate intrinsics.") + return camera_matrix, dist_coeffs + + +def rvec_to_R(rvec: np.ndarray) -> np.ndarray: + R, _ = cv2.Rodrigues(rvec) + return R + + +def R_to_euler_zyx(R: np.ndarray) -> Tuple[float, float, float]: + yaw = float(np.degrees(np.arctan2(R[1,0], R[0,0]))) + sp = np.sqrt(R[2,1]**2 + R[2,2]**2) + pitch = float(np.degrees(np.arctan2(-R[2,0], sp))) + roll = float(np.degrees(np.arctan2(R[2,1], R[2,2]))) + return roll, pitch, yaw + + +def corners_to_image_points(corners: np.ndarray) -> np.ndarray: + return corners.reshape(4, 2).astype(np.float32) + + +def get_detector(): + dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_250) + try: + params = cv2.aruco.DetectorParameters() + except Exception: + params = cv2.aruco.DetectorParameters_create() + try: + detector = cv2.aruco.ArucoDetector(dictionary, params) + return detector, None + except Exception: + return None, (dictionary, params) + + +def detect_markers(image: np.ndarray, detector_tuple): + detector, fallback = detector_tuple + print(detector) + if detector is not None: + corners, ids, rejected = detector.detectMarkers(image) + else: + dictionary, params = fallback + corners, ids, rejected = cv2.aruco.detectMarkers(image, dictionary, parameters=params) + return corners, ids, rejected + + +def rigid_transform_no_scale(A: np.ndarray, B: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + assert A.shape == B.shape and A.shape[1] == 3, "A and B must be Nx3" + N = A.shape[0] + if N < 2: + raise ValueError("Need at least 2 points; 3+ recommended.") + centroid_A = A.mean(axis=0) + centroid_B = B.mean(axis=0) + AA = A - centroid_A + BB = B - centroid_B + H = AA.T @ BB + U, S, Vt = np.linalg.svd(H) + R = Vt.T @ U.T + if np.linalg.det(R) < 0: + Vt[-1, :] *= -1 + R = Vt.T @ U.T + t = centroid_B - R @ centroid_A + return R.astype(np.float32), t.astype(np.float32) + +def readSettings(fileSetting): + global cam_anchor_pts + print("Read Settings") + + if(fileSetting == None): + cam_anchor_pts = { + 50: np.array([0.0, 0.0, 0.0], dtype=np.float32), + 71: np.array([0.140, 0.0, 0.0], dtype=np.float32), + 101: np.array([-0.0, -0.080, 0.0], dtype=np.float32), + #15: np.array([20,20,20]) # add if known + } + return + + + with open(fileSetting, 'r') as f: + settings = json.load(f) + for marker_id, coords in settings['coordinateSystem']['KnownMarkers'].items(): + cam_anchor_pts[int(marker_id)] = np.array(coords, dtype=np.float32) + + #KNOWN_MACHINE_POS = {int(k): np.array(v, dtype=np.float32) for k, v in settings.items()} + + +# ----------------------- Main ----------------------- + +def main(): + + parser = argparse.ArgumentParser(description="Detect ArUco markers in two images and compute camera poses in machine coordinates.") + parser.add_argument('-i', '--images', action='append', required=False, + help="Path to image. Provide this option twice: once per camera (e.g., -i2 cam1.jpg -i2 cam2.jpg)") + parser.add_argument('-npz', '--npz', action='append', required=False, default=['camera_intrinsics_v1.npz']) + parser.add_argument('--cam-calib', action='append', required=False, + help="Paths to calibration YAMLs for camera 1 and camera 2 (e.g., cam1.npz cam2.npz)") + parser.add_argument('--marker-size-mm', type=float, default=25, + help="Marker side length in millimeters (e.g., 50)") + parser.add_argument('--dict', default='DICT_4X4_250', + help="ArUco dictionary name (default: DICT_4X4_250)") + parser.add_argument('-settings', type=str, default=None, + help="Json File with Machine Settings") + args = parser.parse_args() + + + + print("ABC 0") + + readSettings(args.settings) + + print("ABC 0") + + if(args.images is None): + image = cv2.imread(IMAGE_PATH) + else: + image = cv2.imread(args.images[0]) + OUTPUT_IMAGE_PATH = args.images[0].replace(".jpg","r.jpg").replace(".PNG","r.PNG") + OUTPUT_CSV_PATH = args.images[0].replace(".jpg",".csv").replace(".PNG",".csv") + OUTPUT_JSON_PATH = args.images[0].replace(".jpg",".json").replace(".PNG",".json") + + + if image is None: + print(f"[ERROR] Cannot read image '{IMAGE_PATH}'.") + sys.exit(1) + + + print("ABC 1") + + camera_matrix, dist_coeffs = load_intrinsics_npz(args.npz[0]) + print("ABC 1a") + detector_tuple = get_detector() + print("ABC 1b") + corners_list, ids, rejected = detect_markers(image, detector_tuple) + + + print("ABC 2") + + if ids is None or len(ids) == 0: + print("[ERROR] No markers detected.") + sys.exit(1) + + draw_img = image.copy() + cv2.aruco.drawDetectedMarkers(draw_img, corners_list, ids) + + half = MARKER_LENGTH_M / 2.0 + obj_points = np.array([ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0], + ], dtype=np.float32) + + poses_cam: Dict[int, Tuple[np.ndarray, np.ndarray]] = {} + centers_cam: Dict[int, np.ndarray] = {} + for i, marker_id in enumerate(ids.flatten()): + img_pts = corners_to_image_points(corners_list[i]) + success, rvec, tvec = cv2.solvePnP(obj_points, img_pts, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_IPPE_SQUARE) + if not success: + success, rvec, tvec = cv2.solvePnP(obj_points, img_pts, camera_matrix, dist_coeffs) + if success: + rvec = rvec.reshape(3,1) + tvec = tvec.reshape(3,1) + poses_cam[int(marker_id)] = (rvec, tvec) + centers_cam[int(marker_id)] = tvec.flatten() + try: + cv2.drawFrameAxes(draw_img, camera_matrix, dist_coeffs, rvec, tvec, AXIS_LENGTH_M) + except Exception: + pass + else: + print(f"[WARN] solvePnP failed for marker {marker_id}") + + common_ids: List[int] = [mid for mid in cam_anchor_pts.keys() if mid in centers_cam] + if len(common_ids) < 2: + print(f"[ERROR] Need at least 2 reference markers; found {len(common_ids)}: {common_ids}") + sys.exit(1) + if len(common_ids) < 3: + print(f"[WARN] Only {len(common_ids)} references ({common_ids}). Fit may be less stable; 3+ recommended.") + + A = np.stack([centers_cam[mid] for mid in common_ids], axis=0) + B = np.stack([cam_anchor_pts[mid] for mid in common_ids], axis=0) + + R_cam_to_machine, t_cam_to_machine = rigid_transform_no_scale(A, B) + + residuals_mm = [] + for i, mid in enumerate(common_ids): + pred = R_cam_to_machine @ A[i] + t_cam_to_machine + err = np.linalg.norm(pred - B[i]) * 1000.0 + residuals_mm.append(err) + rms = float(np.sqrt(np.mean(np.square(residuals_mm)))) if residuals_mm else 0.0 + print("\nReference fit residuals (mm) per marker:") + for mid, e in zip(common_ids, residuals_mm): + print(f" ID {mid}: {e:.2f} mm") + print(f"RMS residual: {rms:.2f} mm") + + # Camera pose in machine coordinates: + # Camera origin (0,0,0 in camera) maps to t_cam_to_machine + cam_pos_machine = t_cam_to_machine + cam_R_machine = R_cam_to_machine # camera basis expressed in machine frame + cam_roll, cam_pitch, cam_yaw = R_to_euler_zyx(cam_R_machine) + + rows = [("id", "x_mm", "y_mm", "z_mm", "roll_deg", "pitch_deg", "yaw_deg")] + marker_list = [] + + print("\nMarker Positions and Orientations in Machine Coordinates:") + print(f"{'ID':>8} {'X(mm)':>10} {'Y(mm)':>10} {'Z(mm)':>10} {'Roll':>10} {'Pitch':>10} {'Yaw':>10}") + + # Add camera first + cx, cy, cz = (cam_pos_machine * 1000.0).tolist() + print(f"{'camera':>8} {cx:10.2f} {cy:10.2f} {cz:10.2f} {cam_roll:10.2f} {cam_pitch:10.2f} {cam_yaw:10.2f}") + rows.append(("camera", f"{cx:.3f}", f"{cy:.3f}", f"{cz:.3f}", f"{cam_roll:.3f}", f"{cam_pitch:.3f}", f"{cam_yaw:.3f}")) + camera_pose = { + "id": "camera", + "position_mm": [float(x) for x in cam_pos_machine * 1000.0], + "orientation_deg": {"roll": cam_roll, "pitch": cam_pitch, "yaw": cam_yaw} +} + + # Then markers + for marker_id in sorted(poses_cam.keys()): + rvec, tvec = poses_cam[marker_id] + R_marker_cam = rvec_to_R(rvec) + pos_machine = R_cam_to_machine @ tvec.flatten() + t_cam_to_machine + R_marker_machine = R_cam_to_machine @ R_marker_cam + roll_deg, pitch_deg, yaw_deg = R_to_euler_zyx(R_marker_machine) + x_mm, y_mm, z_mm = (pos_machine * 1000.0).tolist() + print(f"{marker_id:8d} {x_mm:10.2f} {y_mm:10.2f} {z_mm:10.2f} {roll_deg:10.2f} {pitch_deg:10.2f} {yaw_deg:10.2f}") + rows.append((marker_id, f"{x_mm:.3f}", f"{y_mm:.3f}", f"{z_mm:.3f}", f"{roll_deg:.3f}", f"{pitch_deg:.3f}", f"{yaw_deg:.3f}")) + marker_list.append({"id": marker_id, "position_mm": [x_mm, y_mm, z_mm], "orientation_deg": {"roll": roll_deg, "pitch": pitch_deg, "yaw": yaw_deg}}) + + # Save CSV + try: + with open(OUTPUT_CSV_PATH, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerows(rows) + print(f"\n[INFO] Saved CSV poses to '{OUTPUT_CSV_PATH}'.") + except Exception as e: + print(f"[WARN] Could not save CSV: {e}") + + + # Save JSON + json_data = { + "metadata": { + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), + "reference_markers": common_ids, + "rms_residual_mm": rms, + "description": "Multi-marker machine frame fit with camera pose" + }, + "camera": camera_pose, + "markers": marker_list + } + with open(OUTPUT_JSON_PATH, 'w', encoding='utf-8') as f: + json.dump(json_data, f, indent=4) + + # Warn about expected IDs + detected_ids = set(poses_cam.keys()) + missing = EXPECTED_IDS - detected_ids + if missing: + print(f"[WARN] Expected markers not detected: {sorted(missing)}") + + # Draw machine axes using global transform (machine->camera) + R_machine_to_cam = R_cam_to_machine.T + t_machine_to_cam = - R_machine_to_cam @ t_cam_to_machine + try: + machine_axes = np.float32([ + [0.0, 0.0, 0.0], + [MACHINE_AXIS_X_M, 0.0, 0.0], + [0.0, MACHINE_AXIS_Y_M, 0.0], + [0.0, 0.0, MACHINE_AXIS_Z_M], + ]) + rvec_global, _ = cv2.Rodrigues(R_machine_to_cam) + imgpts, _ = cv2.projectPoints(machine_axes, rvec_global, t_machine_to_cam, camera_matrix, dist_coeffs) + origin = tuple(np.round(imgpts[0].ravel()).astype(int)) + x_end = tuple(np.round(imgpts[1].ravel()).astype(int)) + y_end = tuple(np.round(imgpts[2].ravel()).astype(int)) + z_end = tuple(np.round(imgpts[3].ravel()).astype(int)) + cv2.line(draw_img, origin, x_end, (0, 0, 255), 3) + cv2.line(draw_img, origin, y_end, (0, 255, 0), 3) + cv2.line(draw_img, origin, z_end, (255, 0, 0), 3) + cv2.putText(draw_img, "X (200 mm)", x_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) + cv2.putText(draw_img, "Y (-100 mm)", y_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) + cv2.putText(draw_img, "+Z (100 mm)", z_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2) + except Exception as e: + print(f"[WARN] Failed to draw machine axes: {e}") + + ok = cv2.imwrite(OUTPUT_IMAGE_PATH, draw_img) + if ok: + print(f"[INFO] Annotated image saved as '{OUTPUT_IMAGE_PATH}'.") + else: + print(f"[ERROR] Failed to save annotated image '{OUTPUT_IMAGE_PATH}'.") + +if __name__ == '__main__': + main() diff --git a/appVideoServer/programs/readTwoImages.py b/appVideoServer/programs/readTwoImages.py new file mode 100644 index 0000000..cda3198 --- /dev/null +++ b/appVideoServer/programs/readTwoImages.py @@ -0,0 +1,668 @@ +#!/usr/bin/env python3 +""" +readCamPositionTwo.py + +Two-camera ArUco detection with joint optimization of both camera extrinsics +against known machine-frame reference markers, plus triangulation of unknown +marker positions. Outputs camera pose and marker poses in machine coordinates, +with CSV and JSON similar to the single-camera script. + +Dependencies: numpy, opencv-python (cv2) +Optional but NOT required: SciPy (we implement a simple Levenberg–Marquardt). + +Usage example: + python3 readTwoImages.py -i snapshot_video0_1764531874081.jpg -i snapshot_video1_1764531874081.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + python3 readTwoImages.py -i snapshot_video0_1764524369655.jpg -i snapshot_video1_1764524369655.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + + python3 readTwoImages.py -i snapshot_video0_1765009029764.jpg -i snapshot_video1_1765009029764.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + +Settings JSON is expected to contain: +{ + "coordinateSystem": { + "KnownMarkers": { + "50": [0.0, 0.0, 0.0], + "71": [0.140, 0.0, 0.0], + "101": [0.0, -0.080, 0.0] + } + } +} + +Author: M365 Copilot (generated) +""" +import argparse +import os +import sys +import json +import time +from typing import Dict, Tuple, List +import numpy as np +import cv2 + +# ---------------- Configuration defaults ---------------- +AXIS_LENGTH_M = 0.05 + +# ---------------- Utilities ---------------- +def load_intrinsics_npz(npz_path: str) -> Tuple[np.ndarray, np.ndarray]: + print("NPZ reading of file:", npz_path) + if os.path.exists(npz_path): + data = np.load(npz_path) + for k in ('camera_matrix', 'mtx', 'K'): + if k in data: + camera_matrix = data[k].astype(np.float32) + break + else: + raise KeyError("Camera matrix not found in NPZ.") + for k in ('dist_coeffs', 'dist', 'D'): + if k in data: + dist = data[k].astype(np.float32).reshape(-1,1) + break + else: + dist = np.zeros((5,1), dtype=np.float32) + print("NPZ loaded:", npz_path) + return camera_matrix, dist + # Fallback default intrinsics + camera_matrix = np.array([[1400, 0, 640], + [0, 1400, 360], + [0, 0, 1]], dtype=np.float32) + dist_coeffs = np.zeros((5,1), dtype=np.float32) + print("[WARN] Using default approximate intrinsics.") + return camera_matrix, dist_coeffs + + +def get_aruco_detector(dict_name: str): + mapping = { + 'DICT_4X4_250': cv2.aruco.DICT_4X4_250, + 'DICT_5X5_100': cv2.aruco.DICT_5X5_100, + 'DICT_6X6_250': cv2.aruco.DICT_6X6_250, + 'DICT_ARUCO_ORIGINAL': cv2.aruco.DICT_ARUCO_ORIGINAL, + } + if dict_name not in mapping: + dict_id = cv2.aruco.DICT_4X4_250 + else: + dict_id = mapping[dict_name] + dictionary = cv2.aruco.getPredefinedDictionary(dict_id) + try: + params = cv2.aruco.DetectorParameters() + except Exception: + params = cv2.aruco.DetectorParameters_create() + try: + detector = cv2.aruco.ArucoDetector(dictionary, params) + return detector, None + except Exception: + return None, (dictionary, params) + + +def detect_markers(image: np.ndarray, detector_tuple): + detector, fallback = detector_tuple + if detector is not None: + corners, ids, rejected = detector.detectMarkers(image) + else: + dictionary, params = fallback + corners, ids, rejected = cv2.aruco.detectMarkers(image, dictionary, parameters=params) + return corners, ids, rejected + + +def corners_to_image_points(corners: np.ndarray) -> np.ndarray: + return corners.reshape(4,2).astype(np.float32) + + +def marker_center_from_corners(corners: np.ndarray) -> np.ndarray: + pts = corners.reshape(4,2) + return pts.mean(axis=0).astype(np.float32) + + +def rvec_to_R(rvec: np.ndarray) -> np.ndarray: + R, _ = cv2.Rodrigues(rvec) + return R + + +def rigid_transform_no_scale(A: np.ndarray, B: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + """Find R,t s.t. B ≈ R A + t. A,B: Nx3.""" + assert A.shape == B.shape and A.shape[1] == 3, "A and B must be Nx3" + N = A.shape[0] + if N < 2: + raise ValueError("Need at least 2 points; 3+ recommended.") + centroid_A = A.mean(axis=0) + centroid_B = B.mean(axis=0) + AA = A - centroid_A + BB = B - centroid_B + H = AA.T @ BB + U, S, Vt = np.linalg.svd(H) + R = Vt.T @ U.T + if np.linalg.det(R) < 0: + Vt[-1, :] *= -1 + R = Vt.T @ U.T + t = centroid_B - R @ centroid_A + return R.astype(np.float32), t.astype(np.float32) + + +def undistort_to_normalized(points_px: np.ndarray, K: np.ndarray, D: np.ndarray) -> np.ndarray: + """points_px: Nx2 pixel. Returns Nx2 normalized coords (x,y) where projection is x=Xp/Z, y=Yp/Z. + cv2.undistortPoints with P=None yields normalized coordinates. + """ + pts = points_px.reshape(-1,1,2).astype(np.float32) + und = cv2.undistortPoints(pts, K, D, P=None) # returns Nx1x2 + return und.reshape(-1,2) + + +# ---------------- Joint optimization (LM, numerical Jacobian) ---------------- + +def pack_params(omega1, t1, omega2, t2) -> np.ndarray: + return np.hstack([omega1, t1, omega2, t2]).astype(np.float64) + + +def unpack_params(theta: np.ndarray): + omega1 = theta[0:3] + t1 = theta[3:6] + omega2 = theta[6:9] + t2 = theta[9:12] + return omega1, t1, omega2, t2 + + +def residuals_centers_normalized(theta: np.ndarray, + X_mach: np.ndarray, + obs1_norm: np.ndarray, + obs2_norm: np.ndarray) -> np.ndarray: + """ + Compute residuals in normalized coordinates (no intrinsics, no distortion). + For camera j: X_cam = R_j X_mach + t_j; proj: (x/z, y/z). + Returns stacked residuals [r1; r2] shape (4N,), where N = number of references. + """ + omega1, t1, omega2, t2 = unpack_params(theta) + R1 = cv2.Rodrigues(omega1)[0] + R2 = cv2.Rodrigues(omega2)[0] + # Camera 1 projections + X_cam1 = (R1 @ X_mach.T + t1.reshape(3,1)).T # Nx3 + uv1 = X_cam1[:, :2] / X_cam1[:, 2:3] + r1 = (obs1_norm - uv1).reshape(-1) + # Camera 2 projections + X_cam2 = (R2 @ X_mach.T + t2.reshape(3,1)).T + uv2 = X_cam2[:, :2] / X_cam2[:, 2:3] + r2 = (obs2_norm - uv2).reshape(-1) + return np.hstack([r1, r2]) + + +def numerical_jacobian(f, theta: np.ndarray, eps: float, *args) -> np.ndarray: + """Finite-difference Jacobian: forward differences.""" + r0 = f(theta, *args) + m = r0.size + n = theta.size + J = np.zeros((m, n), dtype=np.float64) + for k in range(n): + th = theta.copy() + th[k] += eps + rk = f(th, *args) + J[:, k] = (rk - r0) / eps + return J, r0 + + +def lm_solve(theta0: np.ndarray, + X_mach: np.ndarray, + obs1_norm: np.ndarray, + obs2_norm: np.ndarray, + max_iter: int = 50, + eps_jac: float = 1e-6, + lambda_init: float = 1e-3) -> Tuple[np.ndarray, Dict]: + """Simple Levenberg–Marquardt on center normalized residuals.""" + lam = lambda_init + theta = theta0.copy() + history = {"iters": [], "rms": []} + for it in range(max_iter): + J, r = numerical_jacobian(residuals_centers_normalized, theta, eps_jac, + X_mach, obs1_norm, obs2_norm) + rms = float(np.sqrt(np.mean(r*r))) if r.size else 0.0 + history["iters"].append(it) + history["rms"].append(rms) + # Normal equations with damping + JTJ = J.T @ J + g = J.T @ r + H = JTJ + lam * np.eye(JTJ.shape[0]) + try: + delta = -np.linalg.solve(H, g) + except np.linalg.LinAlgError: + # Fallback to least squares + delta, *_ = np.linalg.lstsq(H, -g, rcond=None) + theta_trial = theta + delta + r_trial = residuals_centers_normalized(theta_trial, X_mach, obs1_norm, obs2_norm) + rms_trial = float(np.sqrt(np.mean(r_trial*r_trial))) + if rms_trial < rms: # improve + theta = theta_trial + lam *= 0.5 + else: + lam *= 2.0 + # Convergence criteria + if np.linalg.norm(delta) < 1e-9 or abs(rms - rms_trial) < 1e-9: + break + return theta, history + + +# ---------------- Triangulation ---------------- + +def build_projection_matrix(K: np.ndarray, R: np.ndarray, t: np.ndarray) -> np.ndarray: + return K @ np.hstack([R, t.reshape(3,1)]) + + +def triangulate_center(P1: np.ndarray, P2: np.ndarray, u1: np.ndarray, u2: np.ndarray) -> np.ndarray: + # u1,u2: (2,) pixel coordinates + x1 = u1.reshape(2,1) + x2 = u2.reshape(2,1) + X_h = cv2.triangulatePoints(P1, P2, x1, x2) # 4x1 homogeneous in machine frame if P maps machine->pixels + X = (X_h[:3] / X_h[3]).reshape(3) + return X.astype(np.float32) + + +# ---------------- Main ---------------- +def main(): + print("Started") + parser = argparse.ArgumentParser(description="Two-camera ArUco joint optimization and triangulation") + parser.add_argument('-i', '--images', action='append', required=True, + help="Two image paths: first camera then second camera") + parser.add_argument('-npz', '--npz', action='append', required=True, + help="Two NPZ intrinsics paths: cam1 then cam2") + parser.add_argument('-markerSizeMM', '--markerSizeMM', type=float, default=25.0, + help="Marker side length in millimeters") + parser.add_argument('--dict', default='DICT_4X4_250', help="ArUco dictionary name") + parser.add_argument('-settings', type=str, default=None, + help="Json settings file containing machine KnownMarkers") + args = parser.parse_args() + + if len(args.images) != 2 or len(args.npz) != 2: + print("[ERROR] Provide exactly two images and two intrinsics NPZ files.") + sys.exit(1) + + img1 = cv2.imread(args.images[0]) + img2 = cv2.imread(args.images[1]) + draw1 = img1.copy() + draw2 = img2.copy() + h, w = draw1.shape[:2] + #drawPNG1 = np.zeros((h, w, 4), dtype=np.uint8) # fully transparent + drawPNG1 = np.zeros((h, w, 3), dtype=np.uint8) + # Also prepare a matching canvas for camera2 to keep the layout tidy + drawPNG2 = np.zeros((h, w, 3), dtype=np.uint8) + + if img1 is None or img2 is None: + print("[ERROR] Cannot read one of the images.") + sys.exit(1) + + K1, D1 = load_intrinsics_npz(args.npz[0]) + K2, D2 = load_intrinsics_npz(args.npz[1]) + + # Marker 3D local geometry (square corners) + half = (args.markerSizeMM / 1000.0) / 2.0 + obj_points = np.array([ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0], + ], dtype=np.float32) + + # Read settings for machine known markers + known_markers: Dict[int, np.ndarray] = {} + if args.settings is not None and os.path.exists(args.settings): + with open(args.settings, 'r') as f: + settings = json.load(f) + for marker_id, coords in settings['coordinateSystem']['KnownMarkers'].items(): + known_markers[int(marker_id)] = np.array(coords, dtype=np.float32) + print("[INFO] Loaded KnownMarkers from settings.") + else: + # Fallback defaults + known_markers = { + 50: np.array([0.0, 0.0, 0.0], dtype=np.float32), + 71: np.array([0.140, 0.0, 0.0], dtype=np.float32), + 101: np.array([0.0, -0.080, 0.0], dtype=np.float32), + } + print("[WARN] Using default KnownMarkers; provide -settings for your machine.") + + # Detect markers in both images + detector_tuple = get_aruco_detector(args.dict) + corners1, ids1, _ = detect_markers(img1, detector_tuple) + corners2, ids2, _ = detect_markers(img2, detector_tuple) + if ids1 is None or ids2 is None: + print("[ERROR] No markers detected in one or both images.") + sys.exit(1) + + ids1 = ids1.flatten().tolist() + ids2 = ids2.flatten().tolist() + + + + # Build dicts: id -> corners, center, rvec/tvec (per-camera PnP) + def build_marker_dict(img, corners_list, ids, K, D, draw = False) -> Tuple[Dict[int,np.ndarray], Dict[int,np.ndarray], Dict[int,Tuple[np.ndarray,np.ndarray]]]: + centers = {} + corners_dict = {} + poses = {} + for i, mid in enumerate(ids): + C = corners_list[i] + corners_dict[int(mid)] = C + centers[int(mid)] = marker_center_from_corners(C) + # Pose from single marker + img_pts = corners_to_image_points(C) + success, rvec, tvec = cv2.solvePnP(obj_points, img_pts, K, D, flags=cv2.SOLVEPNP_IPPE_SQUARE) + if not success: + success, rvec, tvec = cv2.solvePnP(obj_points, img_pts, K, D) + if success: + poses[int(mid)] = (rvec.reshape(3,1), tvec.reshape(3,1)) + if(draw): + cv2.drawFrameAxes(draw1, K, D, rvec, tvec, 0.02) # slim orientation axes + cv2.drawFrameAxes(drawPNG1, K, D, rvec, tvec, 0.02) # slim orientation axes + return centers, corners_dict, poses + + centers1, corners_dict1, poses1 = build_marker_dict(img1, corners1, ids1, K1, D1, draw = True) + centers2, corners_dict2, poses2 = build_marker_dict(img2, corners2, ids2, K2, D2) + + # Common reference markers present in both images and known in machine frame + common_refs = [mid for mid in known_markers.keys() if (mid in centers1 and mid in centers2)] + if len(common_refs) < 3: + print(f"[ERROR] Need ≥3 common reference markers in both cameras; found {len(common_refs)}: {common_refs}") + sys.exit(1) + + # Initial extrinsics from rigid fits per camera using tvec centers of references + # For camera j, A = camera-frame positions of reference markers (from PnP tvec), B = machine positions + def init_extrinsics_from_rigid(poses_cam: Dict[int,Tuple[np.ndarray,np.ndarray]], refs: List[int]) -> Tuple[np.ndarray,np.ndarray]: + A = [] + B = [] + for mid in refs: + if mid in poses_cam: + _, tvec = poses_cam[mid] + A.append(tvec.flatten()) + B.append(known_markers[mid]) + if len(A) < 2: + raise RuntimeError("Insufficient reference poses for rigid transform init.") + A = np.stack(A, axis=0) + B = np.stack(B, axis=0) + R_cm, t_cm = rigid_transform_no_scale(A, B) # camera->machine + # Convert to machine->camera + R_mc = R_cm.T + t_mc = - R_mc @ t_cm + return R_mc.astype(np.float32), t_mc.astype(np.float32) + + R1_init, t1_init = init_extrinsics_from_rigid(poses1, common_refs) + R2_init, t2_init = init_extrinsics_from_rigid(poses2, common_refs) + + # Observations: reference centers (pixels) -> normalized + X_mach_refs = np.stack([known_markers[mid] for mid in common_refs], axis=0).astype(np.float32) + obs1_px = np.stack([centers1[mid] for mid in common_refs], axis=0).astype(np.float32) + obs2_px = np.stack([centers2[mid] for mid in common_refs], axis=0).astype(np.float32) + obs1_norm = undistort_to_normalized(obs1_px, K1, D1) + obs2_norm = undistort_to_normalized(obs2_px, K2, D2) + + # Pack initial params as Rodrigues vectors + omega1_init = cv2.Rodrigues(R1_init)[0].reshape(3) + omega2_init = cv2.Rodrigues(R2_init)[0].reshape(3) + theta0 = pack_params(omega1_init, t1_init.reshape(3), omega2_init, t2_init.reshape(3)) + + theta_opt, hist = lm_solve(theta0, X_mach_refs, obs1_norm, obs2_norm, + max_iter=60, eps_jac=1e-6, lambda_init=1e-3) + + omega1, t1, omega2, t2 = unpack_params(theta_opt) + R1_opt = cv2.Rodrigues(omega1)[0] + R2_opt = cv2.Rodrigues(omega2)[0] + + # Camera pose in machine coordinates (camera->machine): R_cm = R^T, t_cm = -R^T t + R1_cm = R1_opt.T + t1_cm = - R1_cm @ t1 + R2_cm = R2_opt.T + t2_cm = - R2_cm @ t2 + + # Build projection matrices for triangulation (machine -> pixels) + P1 = build_projection_matrix(K1, R1_opt, t1) + P2 = build_projection_matrix(K2, R2_opt, t2) + + # Collect markers seen by at least one camera + all_ids = set(ids1) | set(ids2) + # Output structures + rows = [("id", "x_mm", "y_mm", "z_mm", "roll_deg", "pitch_deg", "yaw_deg")] + marker_list = [] + + # Camera orientations in Euler (ZYX) + def R_to_euler_zyx(R: np.ndarray) -> Tuple[float,float,float]: + yaw = float(np.degrees(np.arctan2(R[1,0], R[0,0]))) + sp = np.sqrt(R[2,1]**2 + R[2,2]**2) + pitch = float(np.degrees(np.arctan2(-R[2,0], sp))) + roll = float(np.degrees(np.arctan2(R[2,1], R[2,2]))) + return roll, pitch, yaw + + cam1_roll, cam1_pitch, cam1_yaw = R_to_euler_zyx(R1_cm) + cam2_roll, cam2_pitch, cam2_yaw = R_to_euler_zyx(R2_cm) + + # Camera rows + c1_mm = (t1_cm * 1000.0).tolist() + rows.append(("camera 0", f"{c1_mm[0]:.2f}", f"{c1_mm[1]:.2f}", f"{c1_mm[2]:.2f}", f"{cam1_roll:.3f}", f"{cam1_pitch:.3f}", f"{cam1_yaw:.3f}")) + c2_mm = (t2_cm * 1000.0).tolist() + rows.append(("camera 1", f"{c2_mm[0]:.2f}", f"{c2_mm[1]:.2f}", f"{c2_mm[2]:.2f}", f"{cam2_roll:.3f}", f"{cam2_pitch:.3f}", f"{cam2_yaw:.3f}")) + + # Triangulate and output markers + def orientation_in_machine(mid: int) -> Tuple[float,float,float]: + # Prefer camera1 orientation, else camera2 + if mid in poses1: + Rm_cam = rvec_to_R(poses1[mid][0]) + Rm_machine = R1_cm @ Rm_cam + elif mid in poses2: + Rm_cam = rvec_to_R(poses2[mid][0]) + Rm_machine = R2_cm @ Rm_cam + else: + Rm_machine = np.eye(3, dtype=np.float32) + return R_to_euler_zyx(Rm_machine) + + # Residual report for references + # Recompute residual RMS in pixels for references (after optimization) + refs_rms_px = [] + for j,(K,R_opt,t_opt,centers_px) in enumerate([(K1,R1_opt,t1,centers1),(K2,R2_opt,t2,centers2)]): + errs = [] + for mid in common_refs: + X = known_markers[mid] + X_cam = R_opt @ X + t_opt + x = K @ X_cam + u_pred = x[0]/x[2] + v_pred = x[1]/x[2] + u_obs, v_obs = centers_px[mid] + errs.append(np.hypot(u_obs-u_pred, v_obs-v_pred)) + refs_rms_px.append(float(np.sqrt(np.mean(np.square(errs))) if errs else 0.0)) + + # Compute per-marker positions + for mid in sorted(all_ids): + # Triangulate if seen in both + if mid in centers1 and mid in centers2: + X_mach = triangulate_center(P1, P2, centers1[mid], centers2[mid]) + elif mid in poses1: + # Fallback single-camera: transform tvec (camera->machine) + X_mach = (R1_cm @ poses1[mid][1].flatten() + t1_cm) + elif mid in poses2: + X_mach = (R2_cm @ poses2[mid][1].flatten() + t2_cm) + else: + continue + roll, pitch, yaw = orientation_in_machine(mid) + x_mm, y_mm, z_mm = (X_mach * 1000.0).tolist() + rows.append((mid, f"{x_mm:.2f}", f"{y_mm:.2f}", f"{z_mm:.2f}", f"{roll:.3f}", f"{pitch:.3f}", f"{yaw:.3f}")) + marker_list.append({ + "id": int(mid), + "position_mm": [float(x_mm), float(y_mm), float(z_mm)], + "orientation_deg": {"roll": float(roll), "pitch": float(pitch), "yaw": float(yaw)} + }) + + # Save CSV & JSON + base1 = os.path.splitext(args.images[0])[0] + base2 = os.path.splitext(args.images[1])[0] + out_csv = f"{base1}_two_cam.csv" + out_json = f"{base1}_two_cam.json" + + try: + import csv + with open(out_csv, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerows(rows) + print(f"[INFO] Saved CSV poses to '{out_csv}'.") + except Exception as e: + print(f"[WARN] Could not save CSV: {e}") + + json_data = { + "metadata": { + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), + "reference_markers": common_refs, + "dict": args.dict, + "marker_size_mm": args.markerSizeMM, + "rms_refs_px_cam1": refs_rms_px[0] if refs_rms_px else None, + "rms_refs_px_cam2": refs_rms_px[1] if refs_rms_px else None, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [float(x) for x in (t1_cm * 1000.0)], + "orientation_deg": {"roll": cam1_roll, "pitch": cam1_pitch, "yaw": cam1_yaw}, + }, + { + "id": "camera2", + "position_mm": [float(x) for x in (t2_cm * 1000.0)], + "orientation_deg": {"roll": cam2_roll, "pitch": cam2_pitch, "yaw": cam2_yaw}, + } + ], + "markers": marker_list + } + + try: + with open(out_json, 'w', encoding='utf-8') as f: + json.dump(json_data, f, indent=4) + print(f"[INFO] Saved JSON poses to '{out_json}'.") + except Exception as e: + print(f"[WARN] Could not save JSON: {e}") + + # Annotate images with machine axes using camera1 extrinsics + try: + R_machine_to_cam1 = R1_opt + t_machine_to_cam1 = t1 + machine_axes = np.float32([ + [0.0, 0.0, 0.0], + [0.200, 0.0, 0.0], + [0.0, -0.100, 0.0], + [0.0, 0.0, 0.100], + ]) + rvec_global, _ = cv2.Rodrigues(R_machine_to_cam1) + imgpts, _ = cv2.projectPoints(machine_axes, rvec_global, t_machine_to_cam1, K1, D1) + origin = tuple(np.round(imgpts[0].ravel()).astype(int)) + x_end = tuple(np.round(imgpts[1].ravel()).astype(int)) + y_end = tuple(np.round(imgpts[2].ravel()).astype(int)) + z_end = tuple(np.round(imgpts[3].ravel()).astype(int)) + + # Draw marker outlines only (omit default small id labels) — we draw larger IDs below + cv2.aruco.drawDetectedMarkers(draw1, corners1) + cv2.aruco.drawDetectedMarkers(drawPNG1, corners1) + # Draw larger blue ID labels (keep default marker outlines as-is) + try: + for i, mid in enumerate(ids1): + try: + pts = corners1[i].reshape((4, 2)) + center = tuple(np.round(pts.mean(axis=0)).astype(int)) + except Exception: + continue + text = str(int(mid)) + # Offset: 5px more to the right and 5px up (y axis is downwards) + pos = (int(center[0]) + 15, int(center[1]) - 15) + cv2.putText(draw1, text, pos, cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,0,0), 3, lineType=cv2.LINE_AA) + cv2.putText(drawPNG1, text, pos, cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,0,0,255), 3, lineType=cv2.LINE_AA) + except Exception: + pass + cv2.line(draw1, origin, x_end, (0,0,255), 3) + cv2.line(draw1, origin, y_end, (0,255,0), 3) + cv2.line(draw1, origin, z_end, (255,0,0), 3) + + # Draw lines (RGBA colors: B,G,R,A). A=255 for fully opaque. + cv2.line(drawPNG1, origin, x_end, (0, 0, 255, 255), 3) # Red X + cv2.line(drawPNG1, origin, y_end, (0, 255, 0, 255), 3) # Green Y + cv2.line(drawPNG1, origin, z_end, (255, 0, 0, 255), 3) # Blue Z + + cv2.putText(draw1, "X (200 mm)", x_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) + cv2.putText(draw1, "Y (-100 mm)", y_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) + cv2.putText(draw1, "+Z (100 mm)", z_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2) + + + # Try to draw text (might be jaggy on transparent BG in older OpenCV) + cv2.putText(drawPNG1, "X (200 mm)", x_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255, 255), 2) + cv2.putText(drawPNG1, "Y (-100 mm)", y_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0, 255), 2) + cv2.putText(drawPNG1, "+Z (100 mm)", z_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0, 255), 2) + + + out_img1 = f"{base1}_two_cam_annotated.jpg" + cv2.imwrite(out_img1, draw1) + print(f"[INFO] Annotated image saved as '{out_img1}'.") + + # Save as transparent PNG + + gray = cv2.cvtColor(drawPNG1, cv2.COLOR_BGR2GRAY) + _, alpha = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) + + # 5) Merge BGR + alpha → RGBA transparent overlay + drawPNG_1 = cv2.merge([drawPNG1[:, :, 0], drawPNG1[:, :, 1], drawPNG1[:, :, 2], alpha]) + + out_png1 = f"{base1}_two_cam_overlay.png" + cv2.imwrite(out_png1, drawPNG_1) + + except Exception as e: + print(f"[WARN] Failed to draw machine axes: {e}") + + # Also annotate the second camera image and produce a transparent overlay + try: + machine_axes2 = np.float32([ + [0.0, 0.0, 0.0], + [0.200, 0.0, 0.0], + [0.0, -0.100, 0.0], + [0.0, 0.0, 0.100], + ]) + rvec_global2, _ = cv2.Rodrigues(R2_opt) + imgpts2, _ = cv2.projectPoints(machine_axes2, rvec_global2, t2, K2, D2) + origin2 = tuple(np.round(imgpts2[0].ravel()).astype(int)) + x_end2 = tuple(np.round(imgpts2[1].ravel()).astype(int)) + y_end2 = tuple(np.round(imgpts2[2].ravel()).astype(int)) + z_end2 = tuple(np.round(imgpts2[3].ravel()).astype(int)) + + # Draw marker outlines only (omit default small id labels) — we draw larger IDs below + cv2.aruco.drawDetectedMarkers(draw2, corners2) + cv2.aruco.drawDetectedMarkers(drawPNG2, corners2) + # Draw larger blue ID labels (keep default marker outlines as-is) + try: + for i, mid in enumerate(ids2): + try: + pts = corners2[i].reshape((4, 2)) + center = tuple(np.round(pts.mean(axis=0)).astype(int)) + except Exception: + continue + text = str(int(mid)) + # Offset: 5px more to the right and 5px up (y axis is downwards) + pos = (int(center[0]) + 13, int(center[1]) + 3) + cv2.putText(draw2, text, pos, cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,0,0), 3, lineType=cv2.LINE_AA) + cv2.putText(drawPNG2, text, pos, cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,0,0,255), 3, lineType=cv2.LINE_AA) + except Exception: + pass + + cv2.line(draw2, origin2, x_end2, (0,0,255), 3) + cv2.line(draw2, origin2, y_end2, (0,255,0), 3) + cv2.line(draw2, origin2, z_end2, (255,0,0), 3) + + cv2.line(drawPNG2, origin2, x_end2, (0, 0, 255, 255), 3) + cv2.line(drawPNG2, origin2, y_end2, (0, 255, 0, 255), 3) + cv2.line(drawPNG2, origin2, z_end2, (255, 0, 0, 255), 3) + + cv2.putText(draw2, "X (200 mm)", x_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) + cv2.putText(draw2, "Y (-100 mm)", y_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) + cv2.putText(draw2, "+Z (100 mm)", z_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2) + + cv2.putText(drawPNG2, "X (200 mm)", x_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255, 255), 2) + cv2.putText(drawPNG2, "Y (-100 mm)", y_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0, 255), 2) + cv2.putText(drawPNG2, "+Z (100 mm)", z_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0, 255), 2) + + out_img2 = f"{base2}_two_cam_annotated.jpg" + cv2.imwrite(out_img2, draw2) + print(f"[INFO] Annotated image saved as '{out_img2}'.") + + gray2 = cv2.cvtColor(drawPNG2, cv2.COLOR_BGR2GRAY) + _, alpha2 = cv2.threshold(gray2, 0, 255, cv2.THRESH_BINARY) + drawPNG_2 = cv2.merge([drawPNG2[:, :, 0], drawPNG2[:, :, 1], drawPNG2[:, :, 2], alpha2]) + out_png2 = f"{base2}_two_cam_overlay.png" + cv2.imwrite(out_png2, drawPNG_2) + print(f"[INFO] Overlay PNG saved as '{out_png2}'.") + + except Exception as e: + print(f"[WARN] Failed to draw machine axes for camera2: {e}") + +if __name__ == '__main__': + main() diff --git a/appVideoServer/programs/screenShot.js b/appVideoServer/programs/screenShot.js new file mode 100644 index 0000000..1edcbd2 --- /dev/null +++ b/appVideoServer/programs/screenShot.js @@ -0,0 +1,135 @@ +const fs = require('fs'); +const path = require('path'); +const { exec } = require('child_process'); +const { logSnapshot } = require('./log'); + + +function snapshot(outDir, cam0, cam1, ws){ + + if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true }); + const picDate = Date.now(); + const name0 = `snapshot_video0_${picDate}.jpg`; + const name1 = `snapshot_video1_${picDate}.jpg`; + cam0.snapshot(path.join(outDir, name0)); + cam1.snapshot(path.join(outDir, name1)); + + + strFile0 = path.join(outDir, name0); + strFile1 = path.join(outDir, name1); + + const relUrl = `/snapshots/${name0}`; + const relUrlApp = `/snapshots/${name0.replace('.jpg','_two_cam_annotated.jpg')}`; + // The Python postprocessor writes an overlay named "_two_cam_overlay.png" and a CSV named "_two_cam.csv" + const relOverlay = `/snapshots/${name0.replace('.jpg','_two_cam_overlay.png')}`; + const relOverlayCSV = `/snapshots/${name0.replace('.jpg','_two_cam.csv')}`; + + const annotatedPath = path.join(outDir, name0.replace('.jpg','_two_cam_annotated.jpg')); + const overlayPath = path.join(outDir, name0.replace('.jpg','_two_cam_overlay.png')); + const csvPath = path.join(outDir, name0.replace('.jpg','_two_cam.csv')); + + + + const command = `python3 /usr/src/app/programs/readTwoImages.py -i ${strFile0} -i ${strFile1} -npz /usr/src/app/data/settings/callibration_cam0.npz -npz /usr/src/app/data/settings/callibration_cam1.npz -settings /usr/src/app/data/settings/settings.json`; + console.log("Executing Python " + command); + + // Run the Python post-processing and send the snapshot response only + // after the annotated files are present to avoid transient 404s in the browser. + exec(command, (error, stdout, stderr) => { + try { + if (error) { + console.error(`Error: ${error.message}`); + // Capture which generated files actually exist for debugging + const files = { + annotated: fs.existsSync(annotatedPath), + overlay: fs.existsSync(overlayPath), + csv: fs.existsSync(csvPath) + }; + // Log full details server-side for diagnosis + const detailed = { + type: 'snapshot', + ok: false, + error: error.message, + stdout: String(stdout).slice(0, 4096), + stderr: String(stderr).slice(0, 4096), + files + }; + logSnapshot(command, JSON.stringify(detailed)); + + // Send a short, user-friendly error to the client (no large stdout/stderr) + const shortError = String(stderr || error.message || '').includes('Corrupt JPEG') + ? 'postprocessor failed: corrupt JPEG input' + : 'postprocessor failed'; + try { ws.send(JSON.stringify({ type: 'snapshot', ok: false, error: shortError })); } catch (e) {} + return; + } + + if (stderr) { + // Log stderr but don't fail outright; sometimes tools output warnings on stderr. + if (String(stderr).trim()) console.error(`Stderr: ${stderr}`); + } + + console.log(`Output:\n${stdout}`); + + // Wait up to ~1s (10 * 100ms) for the generated files to appear on disk. + const waitForFiles = (paths, attempts = 10, delayMs = 100) => new Promise((resolve) => { + let tries = 0; + (function poll() { + const ok = paths.every(p => fs.existsSync(p)); + if (ok || tries >= attempts) return resolve(ok); + tries++; + setTimeout(poll, delayMs); + })(); + }); + + waitForFiles([annotatedPath, overlayPath, csvPath]).then((found) => { + if (!found) { + const files = { + annotated: fs.existsSync(annotatedPath), + overlay: fs.existsSync(overlayPath), + csv: fs.existsSync(csvPath) + }; + // Log details server-side + const detailed = { + type: 'snapshot', + ok: false, + url: relUrl, + urlApp: relUrlApp, + overlay: relOverlay, + overlayCSV: relOverlayCSV, + files + }; + logSnapshot(command, JSON.stringify(detailed)); + // Send a concise error to the client + try { ws.send(JSON.stringify({ type: 'snapshot', ok: false, error: 'postprocessor incomplete (missing outputs)' })); } catch (e) {} + return; + } + + const response = JSON.stringify({ + type: 'snapshot', + ok: found, + url: relUrl, + urlApp: relUrlApp, + overlay: relOverlay, + overlayCSV: relOverlayCSV + }); + logSnapshot(command, response); + try { ws.send(response); } catch (e) {} + }).catch((waitErr) => { + console.error('waitForFiles failed:', waitErr); + const response = JSON.stringify({ type: 'snapshot', ok: false, error: String(waitErr) }); + logSnapshot(command, response); + try { ws.send(response); } catch (e) {} + }); + } catch (handlerErr) { + console.error('snapshot handler error:', handlerErr); + const response = JSON.stringify({ type: 'snapshot', ok: false, error: String(handlerErr) }); + logSnapshot(command, response); + try { ws.send(response); } catch (e) {} + } + }); + + +} + + +module.exports = { snapshot }; \ No newline at end of file diff --git a/appVideoServer/programs/videoServer.js b/appVideoServer/programs/videoServer.js new file mode 100644 index 0000000..ed3c55d --- /dev/null +++ b/appVideoServer/programs/videoServer.js @@ -0,0 +1,234 @@ +// programs/videoServer.js +'use strict'; + +const fs = require('fs'); +const { spawn } = require('child_process'); +const WebSocket = require('ws'); + +class JpegFrameSplitter { + constructor(onFrame) { + this.onFrame = onFrame; + this.buffer = Buffer.alloc(0); + } + push(chunk) { + if (!chunk || !chunk.length) return; + this.buffer = Buffer.concat([this.buffer, chunk]); + let start = this.buffer.indexOf(Buffer.from([0xFF, 0xD8])); + while (start !== -1) { + const end = this.buffer.indexOf(Buffer.from([0xFF, 0xD9]), start + 2); + if (end === -1) break; + const frame = this.buffer.slice(start, end + 2); + try { this.onFrame(frame); } catch {} + this.buffer = this.buffer.slice(end + 2); + start = this.buffer.indexOf(Buffer.from([0xFF, 0xD8])); + } + if (this.buffer.length > 8 * 1024 * 1024) { + const nextSOI = this.buffer.indexOf(Buffer.from([0xFF, 0xD8])); + this.buffer = nextSOI !== -1 ? this.buffer.slice(nextSOI) : Buffer.alloc(0); + } + } +} + +class FFmpegStreamer { + /** + * devicePath: '/dev/videoX' + * options: { + * name, width, height, fps, quality, + * input: { format, fps, size, useWallclock, threadQueueSize, channel }, + * tryFormats: [ 'mjpeg', undefined, 'yuyv422', 'rgb24' ] + * } + */ + constructor(devicePath, options = {}) { + this.devicePath = devicePath; + this.name = options.name || devicePath; + this.opts = { + width: options.width ?? undefined, + height: options.height ?? undefined, + fps: options.fps ?? 20, + quality: options.quality ?? 5, + input: { + format: options.input?.format, + fps: options.input?.fps, + size: options.input?.size, + useWallclock: options.input?.useWallclock ?? true, + threadQueueSize: options.input?.threadQueueSize ?? 64, + channel: options.input?.channel, + }, + tryFormats: (options.tryFormats || [options.input?.format, 'yuyv422', 'mjpeg', 'rgb24']) + .filter((v, i, a) => a.indexOf(v) === i), + }; + + this.proc = null; + this.clients = new Set(); + this.startedAt = null; + this.latestFrame = null; + this.splitter = null; + + this.formatIdx = 0; + this.currentFormat = this.opts.tryFormats[this.formatIdx]; + + this._restarting = false; + this._backoffMs = 500; + this._maxBackoffMs = 8000; + this._stderrBuf = []; + this._stderrMaxLines = 8; + + this._quickFailCount = 0; + this._quickFailLimit = 6; + this._suspendedUntil = 0; + } + + get running() { return !!this.proc; } + _scaling() { return Number(this.opts.width) > 0 && Number(this.opts.height) > 0; } + + _buildFfmpegArgs() { + const outFps = this.opts.fps; + const quality = this.opts.quality; + const scaling = this._scaling(); + + const inFmt = this.currentFormat; + const inFps = this.opts.input.fps; + const inSize = this.opts.input.size; + const useWallclock = this.opts.input.useWallclock; + const tqs = this.opts.input.threadQueueSize; + const inChannel = this.opts.input.channel; + + const args = [ + '-hide_banner', '-loglevel', 'error', '-nostdin', + '-f', 'video4linux2', + ...(tqs ? ['-thread_queue_size', String(tqs)] : []), + ...(inFmt ? ['-input_format', String(inFmt)] : []), + ...(inFps ? ['-framerate', String(inFps)] : []), + ...(inSize ? ['-video_size', String(inSize)] : []), + ...(typeof inChannel === 'number' ? ['-channel', String(inChannel)] : []), + ...(useWallclock ? ['-use_wallclock_as_timestamps', '1'] : []), + '-i', this.devicePath, + '-fflags', 'nobuffer', '-flags', 'low_delay', '-an', '-sn', + ]; + + if (inFmt === 'mjpeg' && !scaling) { + args.push('-vsync', 'passthrough', '-c:v', 'copy', '-f', 'mjpeg', 'pipe:1'); + return args; + } + if (scaling) args.push('-vf', `scale=${Number(this.opts.width)}:${Number(this.opts.height)}`); + if (outFps) args.push('-r', String(outFps)); + args.push('-f', 'mjpeg', '-q:v', String(quality), 'pipe:1'); + return args; + } + + _logStderr(d) { + const s = d.toString().trim(); + if (!s) return; + this._stderrBuf.push(s); + if (this._stderrBuf.length > this._stderrMaxLines) this._stderrBuf.shift(); + } + + start() { + if (this.proc) return; + if (Date.now() < this._suspendedUntil) { + const wait = this._suspendedUntil - Date.now(); + console.warn(`[FFmpeg] ${this.name} suspended for ${wait}ms due to repeated failures`); + return setTimeout(() => this.start(), wait); + } + + const args = this._buildFfmpegArgs(); + console.log(`[FFmpeg] Start ${this.devicePath} (${this.name}) :: ${args.join(' ')}`); + + this._stderrBuf = []; + this.proc = spawn('ffmpeg', args, { stdio: ['ignore', 'pipe', 'pipe'], detached: true }); + this.startedAt = Date.now(); + + this.splitter = new JpegFrameSplitter((frame) => { + this.latestFrame = frame; + this._broadcast(frame); + }); + + this.proc.stdout.on('data', (chunk) => this.splitter?.push(chunk)); + this.proc.stderr.on('data', (d) => this._logStderr(d)); + + this.proc.on('exit', (code, signal) => { + console.warn(`[FFmpeg] ${this.devicePath} exited code=${code} sig=${signal}`); + if (this._stderrBuf.length) console.warn(`[FFmpeg] ${this.name} last errors:\n - ${this._stderrBuf.join('\n - ')}`); + + this.proc = null; + const quick = (Date.now() - (this.startedAt || Date.now())) < 2000; + this.startedAt = null; + + if (quick && !this._restarting) { + this._quickFailCount++; + this.formatIdx = (this.formatIdx + 1) % this.opts.tryFormats.length; + this.currentFormat = this.opts.tryFormats[this.formatIdx]; + console.warn(`[FFmpeg] ${this.name}: quick failure -> trying next format: ${this.currentFormat}`); + } else { + this._quickFailCount = 0; + } + + if (this._quickFailCount >= this._quickFailLimit) { + this._suspendedUntil = Date.now() + 60000; // 60s pause + this._quickFailCount = 0; + console.error(`[FFmpeg] ${this.name}: too many quick failures; suspending restarts for 60s`); + } + + const delay = this._restarting ? 300 : Math.min(this._backoffMs, this._maxBackoffMs); + setTimeout(() => { + if (!this._restarting) this._backoffMs = Math.min(this._backoffMs * 2, this._maxBackoffMs); + else this._backoffMs = 500; + this.start(); + }, delay); + this._restarting = false; + }); + } + + _killProcessGroup(signal = 'SIGTERM') { + if (!this.proc) return; + try { + if (process.platform !== 'win32') process.kill(-this.proc.pid, signal); + else this.proc.kill(signal); + } catch {} + } + + stop() { + if (!this.proc) return; + this._restarting = false; + this._killProcessGroup('SIGTERM'); + } + + restart(newOpts = {}) { + this._restarting = true; + if (newOpts.input) this.opts.input = { ...this.opts.input, ...newOpts.input }; + this.opts = { ...this.opts, ...newOpts, input: this.opts.input }; + if (newOpts.input && Object.prototype.hasOwnProperty.call(newOpts.input, 'format')) { + const idx = this.opts.tryFormats.indexOf(this.opts.input.format); + if (idx >= 0) { + this.formatIdx = idx; + this.currentFormat = this.opts.tryFormats[this.formatIdx]; + } + } + if (this.proc) this._killProcessGroup('SIGTERM'); else { this._restarting = false; this.start(); } + } + + attach(ws) { + this.clients.add(ws); + if (this.latestFrame && ws.readyState === WebSocket.OPEN) { + try { ws.send(this.latestFrame, { binary: true }); } catch {} + } + ws.on('close', () => this.clients.delete(ws)); + } + + snapshot(toFile) { + if (!this.latestFrame) throw new Error('No frame available yet'); + fs.writeFileSync(toFile, this.latestFrame); + return toFile; + } + + _broadcast(frame) { + if (!this.clients.size) return; + for (const ws of this.clients) { + if (ws.readyState !== WebSocket.OPEN) continue; + if (ws.bufferedAmount > 512 * 1024) continue; // drop if back-pressured + try { ws.send(frame, { binary: true }); } catch {} + } + } +} + +module.exports = { FFmpegStreamer }; \ No newline at end of file diff --git a/appVideoServer/public/GamePad.js b/appVideoServer/public/GamePad.js new file mode 100644 index 0000000..e8d72a6 --- /dev/null +++ b/appVideoServer/public/GamePad.js @@ -0,0 +1,110 @@ +var isRunning = false; +var gamePadId = 0; +var gamepad = {}; + +let lastCheckTime = 0; + + + +function checkGamePad() { + if(isRunning == false){return;} + + const stepSize = "0.01"; + const stepSizeXYZ = "0.5"; // 3 ist auch ok + const stepSizeE = "0.01"; + var gp = navigator.getGamepads()[gamePadId] + var buttons = gp.buttons + + var xyzSpeed = 10; // 100 geht auch + + var psi = gp.axes[0]; + var z = gp.axes[1]; + var x = gp.axes[2]; + var y = gp.axes[3]; + + + // Dreieck zum Dreieck-Setzen + if (buttons[3].pressed) { + socketDriver.send(`G90 G1 X0 Y300 Z0 A${Math.PI/2} B${-1.0*Math.PI/2} C0 F${xyzSpeed}`); + } + if (buttons[4].pressed) { + //console.log("x=" + robot.x + " y=" + robot.y + " z=" + robot.z); + } + + + + // X Button setzt eine Marke + if(buttons[0].pressed && (Date.now() - lastCheckTime > 500)){ + lastCheckTime = Date.now() + console.log('FPoint!'); + socketDriver.send('FPoint'); + socketDriver.send('FShow'); + } + + // L1 und R1 Button to forward-backward in Point-List + if(gp.buttons[4].pressed && (Date.now() - lastCheckTime > 500)){ + lastCheckTime = Date.now() + socketDriver.send('FMinus'); + socketDriver.send('FShow'); + } + if(gp.buttons[5].pressed && (Date.now() - lastCheckTime > 500)){ + lastCheckTime = Date.now() + socketDriver.send('FPlus'); + socketDriver.send('FShow'); + } + + if (x < -0.2) { socketDriver.send(`G91 G1 X+${stepSizeXYZ} F${xyzSpeed}`);} + if (x > 0.2) { socketDriver.send(`G91 G1 X-${stepSizeXYZ} F${xyzSpeed}`);} + + if (y < -0.2) { socketDriver.send(`G91 G1 Y${stepSizeXYZ} F${xyzSpeed}`); } + if (y > 0.2) { socketDriver.send(`G91 G1 Y-${stepSizeXYZ} F${xyzSpeed}`);} + + if (z < -0.2) { socketDriver.send(`G91 G1 Z${stepSizeXYZ} F${xyzSpeed}`); } + if (z > 0.2) { socketDriver.send(`G91 G1 Z-${stepSizeXYZ} F${xyzSpeed}`); } + + + // Greif-Richtung + // LeftRight + if(buttons[14].pressed){ socketDriver.send(`G91 G1 A${stepSize} F${xyzSpeed}`);} + if(buttons[15].pressed){ socketDriver.send(`G91 G1 A-${stepSize} F${xyzSpeed}`);} + // Up - Down + if(buttons[12].pressed){ socketDriver.send(`G91 G1 B${stepSize} F${xyzSpeed}`);} + if(buttons[13].pressed){ socketDriver.send(`G91 G1 B-${stepSize} F${xyzSpeed}`);} + // Drehung + if (psi < -0.2) { socketDriver.send(`G91 G1 C${stepSize} F${xyzSpeed}`); } + if (psi > 0.2) { socketDriver.send(`G91 G1 C-${stepSize} F${xyzSpeed}`); } + + // Trigger-Buttons für Öffnen und Schliessen + if(buttons[6].pressed){socketDriver.send(`G91 G1 E-${stepSizeE} F${xyzSpeed}`);} + if(buttons[7].pressed){socketDriver.send(`G91 G1 E${stepSizeE} F${xyzSpeed}`);} + + if (isRunning) { setTimeout(checkGamePad, 15);} +} + +function gamepadHandler(event, connecting) { + + gamepad = event.gamepad; + if (typeof gamepad === `undefined`) { + isRunning = false; + gamePadId = 0; + console.warn("GamePad kann nicht gefunden werden"); + return; + } + + if (connecting) { + console.log("GamePad " + event.gamepad.index + " connected"); + gamePadId = gamepad.index; + isRunning = true; + setTimeout(checkGamePad, 20); + } else { + console.log("GamePad " +gamePadId +" disconnected"); + isRunning = false; + gamePadId = 0; + } +} + + +window.addEventListener("gamepadconnected", function (e) { gamepadHandler(e, true); }, false); +window.addEventListener("gamepaddisconnected", function (e) { gamepadHandler(e, false); }, false); + +document.addEventListener("touchstart", e => { console.log("TouchStart"); }) \ No newline at end of file diff --git a/appVideoServer/public/KeyboardInput.js b/appVideoServer/public/KeyboardInput.js new file mode 100644 index 0000000..8e26db3 --- /dev/null +++ b/appVideoServer/public/KeyboardInput.js @@ -0,0 +1,64 @@ +document.onkeydown = checkKey; + +function checkKey(e) { + + e = e || window.event; + + if(e.key == 'a' || e.key == 'A') + { + console.log("back to A position"); + socketDriver.send(`G90 G1 X0 Y300 Z0 A${Math.PI/2} B-${Math.PI/2} C0 F100`); + } + + // Hand-Winkel (Eulerwinkel) + else if(e.key == 'i' || e.key == 'I'){ + socketDriver.send('G91 G1 B+0.1 F100'); + } + else if(e.key == 'k' || e.key == 'K'){ + socketDriver.send('G91 G1 B-0.1 F100'); + } + else if(e.key == 'l' || e.key == 'L'){ + socketDriver.send('G91 G1 A+0.1 F100'); + } + else if(e.key == 'j' || e.key == 'J'){ + socketDriver.send('G91 G1 A-0.1 F100'); + } + else if(e.key == 'o' || e.key == 'O'){ + socketDriver.send('G91 G1 C+0.1 F100'); + } + else if(e.key == 'u' || e.key == 'U'){ + socketDriver.send('G91 G1 C-0.1 F100'); + } + + // XYZ Koordinaten + else if(e.key == 'e' || e.key == 'E'){ + socketDriver.send('G91 G1 Z+5 F100'); + } + else if(e.key == 'd' || e.key == 'D'){ + socketDriver.send('G91 G1 Z-5 F100'); + } + else if(e.key == 's' || e.key == 'S'){ + socketDriver.send('G91 G1 X5 F100'); + } + else if(e.key == 'f' || e.key == 'S'){ + socketDriver.send('G91 G1 X-5 F100'); + } + else if(e.key == 'r' || e.key == 'R'){ + socketDriver.send('G91 G1 Y5 F100'); + } + else if(e.key == 'w' || e.key == 'W'){ + socketDriver.send('G91 G1 Y-5 F100'); + } + + // File & Log-Operations + else if(e.key == ' '){ + console.log('FPoint!') + socketDriver.send('FPoint'); + } + else if(e.key == 'b'){ + socketDriver.send('FMinus'); + } + else if(e.key == 'n'){ + socketDriver.send('FPlus'); + } +} \ No newline at end of file diff --git a/appVideoServer/public/WebSocket.js b/appVideoServer/public/WebSocket.js new file mode 100644 index 0000000..e6c1ce4 --- /dev/null +++ b/appVideoServer/public/WebSocket.js @@ -0,0 +1,25 @@ +const protocolS = location.protocol === "https:" ? "wss://" : "ws://"; +const robotURL = protocolS + location.host + "/ws/robot"; +console.log("socketDriver try to connect to "+ robotURL); + +const socketDriver = new WebSocket(robotURL); + + + +socketDriver.onopen = () => { console.log("socketDriver WebSocket connected"); }; + +socketDriver.onmessage = (event) => { + if(event.data.toString().includes("position")){ + console.log("Position: " + event.data); + } + else if(event.data.toString().includes("XYZ__FShow__XYZ")){ + const content = event.data.toString().split("XYZ__FShow__XYZ")[1]; + document.querySelectorAll("textarea#GCodeWindow.editor-look")[0].value = content; + } + else{ + console.log('DATA SinceStartup: ' + (Date.now() - startTime).toString() +': ', event.data); + } +} + +socketDriver.onclose = () => {console.log("socketDriver WebSocket is closing");}; +socketDriver.onerror = (err) => { console.error("socketDriver socket error:", err); }; \ No newline at end of file diff --git a/appVideoServer/public/app.js b/appVideoServer/public/app.js new file mode 100644 index 0000000..b5cdb53 --- /dev/null +++ b/appVideoServer/public/app.js @@ -0,0 +1,72 @@ +// /public/app.js +// Small bootstrap moved out of index.html to satisfy CSP (`script-src 'self'`). +(function () { + const isSecure = location.protocol === 'https:'; + const wsProto = isSecure ? 'wss' : 'ws'; + const base = `${wsProto}://${location.host}`; + + // Camera 0 with control channel + window.VideoService.attachStream({ + url: `${base}/ws/video0`, + canvas: document.getElementById('canvas0'), + statusEl: document.getElementById('status0'), + control: { + resSelect: document.getElementById('res0'), + fpsSelect: document.getElementById('fps0'), + qSelect: document.getElementById('q0'), + applyBtn: document.getElementById('apply0'), + snapshotBtn: document.getElementById('snap0'), + startBtn: document.getElementById('start0'), + stopBtn: document.getElementById('stop0'), + snapshotOutEl: document.getElementById('snapshotLink'), + } + }); + + // Camera 1 (no control) + window.VideoService.attachStream({ + url: `${base}/ws/video1`, + canvas: document.getElementById('canvas1'), + statusEl: document.getElementById('status1'), + }); + + // Run an automatic snapshot shortly after the page loads so the client + // receives the freshest annotated image/CSV on startup. This uses a + // synthetic click on the snapshot button; the handler will no-op if the + // WebSocket isn't open yet. + setTimeout(() => { + const snapBtn = document.getElementById('snap0'); + if (snapBtn) snapBtn.click(); + }, 200); + + // Attach handlers for the Point/Up/Down buttons (no inline JS, CSP-safe) + const btnPoint = document.getElementById('btnPoint'); + const btnDown = document.getElementById('btnDown'); + const btnUp = document.getElementById('btnUp'); + if (btnPoint) btnPoint.addEventListener('click', () => { + console.log('FPoint!'); + try { socketDriver.send('FPoint'); socketDriver.send('FShow'); } catch (e) { console.error(e); } + }); + if (btnDown) btnDown.addEventListener('click', () => { + console.log('FPlus'); + try { socketDriver.send('FPlus'); socketDriver.send('FShow'); } catch (e) { console.error(e); } + }); + if (btnUp) btnUp.addEventListener('click', () => { + console.log('FMinus'); + try { socketDriver.send('FMinus'); socketDriver.send('FShow'); } catch (e) { console.error(e); } + }); + + // Other buttons that were previously using inline onclicks. + const btnInfo = document.getElementById('b_M114'); + const btnNull = document.getElementById('b_G28'); + const btnListFile = document.getElementById('btnListFile'); + const btnSendGCode = document.getElementById('btnSendGCode'); + if (btnInfo) btnInfo.addEventListener('click', () => { try { socketDriver.send('M114'); } catch (e) { console.error(e); } }); + if (btnNull) btnNull.addEventListener('click', () => { try { socketDriver.send('G28'); } catch (e) { console.error(e); } }); + if (btnListFile) btnListFile.addEventListener('click', () => { try { socketDriver.send('FShow'); } catch (e) { console.error(e); } }); + if (btnSendGCode) btnSendGCode.addEventListener('click', () => { + try { + const input = document.getElementById('GKarth'); + if (input && input.value) socketDriver.send(input.value); + } catch (e) { console.error(e); } + }); +})(); diff --git a/appVideoServer/public/buttonCmd.js b/appVideoServer/public/buttonCmd.js new file mode 100644 index 0000000..8fd6c9d --- /dev/null +++ b/appVideoServer/public/buttonCmd.js @@ -0,0 +1,23 @@ + + +document.getElementById("b_uparrow").addEventListener('click',() => { socketDriver.send(`G91 G1 Z10 F100`);}); +document.getElementById("b_downarw").addEventListener('click',() => { socketDriver.send(`G90 G1 Z-10 F100`);}); +document.getElementById("b_right").addEventListener('click',() => { socketDriver.send(`G90 G1 X10 F100`);}); +document.getElementById("b_left").addEventListener('click',() => { socketDriver.send(`G90 G1 X-10 F100`);}); +document.getElementById("b_forward").addEventListener('click',() => { socketDriver.send(`G90 G1 Y10 F100`);}); +document.getElementById("b_backward").addEventListener('click',() => { socketDriver.send(`G90 G1 Y-10 F100`);}); + +document.getElementById("b_aPlus").addEventListener('click',() => { socketDriver.send(`G91 G1 A0.10 F100`);}); +document.getElementById("b_aMinus").addEventListener('click',() => { socketDriver.send(`G91 G1 A-0.10 F100`);}); +document.getElementById("b_bPlus").addEventListener('click',() => { socketDriver.send(`G91 G1 B0.10 F100`);}); +document.getElementById("b_bMinus").addEventListener('click',() => { socketDriver.send(`G91 G1 B-0.10 F100`);}); +document.getElementById("b_cPlus").addEventListener('click',() => { socketDriver.send(`G91 G1 C0.10 F100`);}); +document.getElementById("b_cMinus").addEventListener('click',() => { socketDriver.send(`G91 G1 C-0.10 F100`);}); + +document.getElementById("b_ePlus").addEventListener('click',() => { socketDriver.send(`G91 G1 E0.10 F100`);}); +document.getElementById("b_eMinus").addEventListener('click',() => { socketDriver.send(`G91 G1 E-0.10 F100`);}); + + +document.getElementById("b_default").addEventListener('click',() => { socketDriver.send(`G90 G1 X0 Y300 Z0 A${Math.PI/2} B-${Math.PI/2} C0 F100`);}); +document.getElementById("b_G28").addEventListener('click',() => { socketDriver.send(`G28`);}); +document.getElementById("b_M114").addEventListener('click',() => { socketDriver.send(`M114`);}); diff --git a/appVideoServer/public/index.html b/appVideoServer/public/index.html new file mode 100644 index 0000000..e25c399 --- /dev/null +++ b/appVideoServer/public/index.html @@ -0,0 +1,108 @@ + + + + + Dual Camera Stream (HTTPS + WSS) + + + + + + + + +

Robot Control

+ +
+ +
+

Camera 0

+ + +
+ + +
+
Connecting…
+
+ + +
+

Camera 1

+
+ +
+
Connecting…
+
+ +
+
+ + +
+ +
+
+ + +
+ +
+ +
+ +
+

Controls

+ + +
+ + +
+ + +
+ + + +
+
+ + +
+ + +
+ + + +
+ + +
+
+
+
+
+
+ + +
+ +
+ + + +
+
+
+ + + + + + + \ No newline at end of file diff --git a/appVideoServer/public/indexA.css b/appVideoServer/public/indexA.css new file mode 100644 index 0000000..33c015c --- /dev/null +++ b/appVideoServer/public/indexA.css @@ -0,0 +1,203 @@ +:root { color-scheme: dark light; } +/* Overlay opacity is configurable here. Set to 1 to let PNG alpha be authoritative */ +:root { + --overlay-opacity: 1; /* default overlay alpha applied client-side */ +} + +body { + font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; + margin: 0; + padding: 1rem; + background: #0b1020; + color: #e7eaf6; + +} + +h1, h2 { + margin: 0.5rem 0 0.25rem; +} + +.grid { + display: grid; + gap: 1rem; + /* + grid-auto-flow: column; + grid-auto-columns: 1280px; + justify-content: start; + */ + grid-template-columns: repeat(auto-fit, minmax(1280px, 1fr)); + align-items: start; +} + +.panel { + background: #141b34; + border: 1px solid #242c4f; + border-radius: 12px; + padding: 1rem; + box-shadow: 0 10px 24px rgba(0,0,0,0.25); +} + +.video-wrap { + position: relative; + background: #000; + border-radius: 8px; + overflow: hidden; + /* Keep a 16:9 box that doesn't stretch beyond the source resolution */ + width: 100%; + max-width: 1280px; + aspect-ratio: 16 / 9; + margin: 0 auto; +} + +/* Ensure canvas and overlay are sized identically and keep the same aspect ratio + so overlays align correctly when the window is resized. */ +.video-wrap canvas, +.video-wrap img, +#overlayImg { + position: absolute; + inset: 0; /* top:0; right:0; bottom:0; left:0 */ + width: 100%; + height: 100%; + /* Use `contain` so both layers scale uniformly and show letterboxing instead + of stretching or cropping when the container size differs from the image. */ + object-fit: contain; + background: #000; +} + +.video-wrap canvas { + z-index: 1; +} +.video-wrap img, +#overlayImg { + z-index: 2; + pointer-events: none; /* don't block interactions with the canvas */ + opacity: var(--overlay-opacity); +} + +.status { + font-size: 0.9rem; + opacity: 0.85; + margin: 0.5rem 0 0; +} + +.controls { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 0.5rem; + margin-top: 0.75rem; +} + +.controls label { + display: grid; + gap: 0.25rem; + font-size: 0.9rem; +} + +select, input, button { + padding: 0.5rem 0.6rem; + border-radius: 8px; + border: 1px solid #2d3766; + background: #0d1530; + color: #e7eaf6; +} + +button.primary { + background: #355dff; + border-color: #355dff; +} + +a { + color: #9eb8ff; +} + +footer { + margin-top: 1.25rem; + opacity: 0.7; + font-size: 0.9rem; +} + +.muted { + opacity: 0.8; +} + + +/* Ensure overlay uses contain and respects alpha channel from the PNG + (the PNG's transparency is the authoritative source of which pixels + are transparent; CSS opacity only adjusts global alpha). */ +#overlayImg { + position: absolute; + inset: 0; /* shorthand for top:0; right:0; bottom:0; left:0; */ + width: 100%; + height: 100%; + pointer-events: none; + opacity: var(--overlay-opacity); + object-fit: contain; /* preserve aspect ratio and don't distort */ + background: transparent; +} + +/* CSV table styles */ +.csv-table { + width: 440px; /* 4 columns * 200px each */ + border-collapse: collapse; + margin-top: 0.5rem; + table-layout: fixed; /* use fixed layout so column widths are respected */ +} +.csv-table th, .csv-table td { + border: 1px solid rgba(255,255,255,0.06); + padding: 0.35rem 0.5rem; + text-align: center; + font-size: 0.9rem; + width: 110px; /* fixed column width */ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.csv-table th { + background: rgba(255,255,255,0.02); + font-weight: 600; +} +.csv-table tr:nth-child(even) td { + background: rgba(255,255,255,0.01); +} + +/* Right-align CSV numeric data and use tabular digits for stable column alignment */ +.csv-table td { text-align: right; font-variant-numeric: tabular-nums; } + +#GCodeWindow { + width: 100%; + height: 200px; +} + +/* Layout: place the buttons and GCode window side-by-side in their panel. + - `#divButtons` gets a fixed ~300px width + - `#divGCodeWindow` uses the remaining width + - On small screens they stack vertically for usability */ +/* Use floats for a predictable two-column layout inside the panel. */ +#divButtons { + float: left; + width: 300px; + box-sizing: border-box; + margin-right: 1rem; +} +#divGCodeWindow { + display: block; + margin-left: 320px; /* 300px left column + 1rem gap */ + box-sizing: border-box; +} + +/* Clear floats inside panels so subsequent content flows correctly */ +.panel::after { + content: ""; + display: table; + clear: both; +} +@media (max-width: 800px) { + #divButtons, #divGCodeWindow { + display: block; + float: none; + width: 100%; + margin-left: 0; + margin-right: 0; + } +} + diff --git a/appVideoServer/public/readCSV.js b/appVideoServer/public/readCSV.js new file mode 100644 index 0000000..d5c821b --- /dev/null +++ b/appVideoServer/public/readCSV.js @@ -0,0 +1,76 @@ +// public/readCSV.js +// Fetch a CSV file and render a small table into the given container. +// Usage: window.readCSV.renderCSV(containerOrId, csvUrl) + +(function () { + async function renderCSV(container, csvUrl) { + console.log("readCSV should start"); + console.log('readCSV.renderCSV', container, csvUrl); + + const el = (typeof container === 'string') ? document.getElementById(container) : container; + if (!el) return; + if (!csvUrl) { + el.innerHTML = 'No CSV URL provided'; + return; + } + el.innerHTML = 'Loading CSV…'; + try { + const res = await fetch(csvUrl, { cache: 'no-store' }); + if (!res.ok) { + el.innerHTML = `CSV not found (HTTP ${res.status})`; + return; + } + const text = await res.text(); + const lines = text.trim().split(/\r?\n/).filter(Boolean); + if (!lines.length) { + el.innerHTML = 'CSV is empty'; + return; + } + const headers = lines[0].split(',').map(h => h.trim()); + // Look for id,x,y,z columns (case-insensitive) + const lower = headers.map(h => h.toLowerCase()); + const ids = { + id: lower.indexOf('id'), + x: lower.indexOf('x_mm'), + y: lower.indexOf('y_mm'), + z: lower.indexOf('z_mm') + }; + // If any of these are missing, show a helpful message + if (ids.id === -1 || ids.x === -1 || ids.y === -1 || ids.z === -1) { + el.innerHTML = `CSV does not contain required columns: id, x, y, z ${csvUrl}`; + return; + } + + // Build table + const table = document.createElement('table'); + table.className = 'csv-table'; + const thead = table.createTHead(); + const thr = thead.insertRow(); + ['id', 'x [mm]', 'y [mm]', 'z [mm]'].forEach(h => { + const th = document.createElement('th'); + th.textContent = h; + thr.appendChild(th); + }); + const tbody = table.createTBody(); + + for (let i = 1; i < lines.length; i++) { + const row = lines[i].split(',').map(c => c.trim()); + // Skip if row doesn't have enough columns + if (row.length < headers.length) continue; + const tr = tbody.insertRow(); + ['id', 'x', 'y', 'z'].forEach(k => { + const td = tr.insertCell(); + td.textContent = row[ids[k]] ?? ''; + }); + } + + el.innerHTML = ''; // clear + el.appendChild(table); + } catch (err) { + console.error('readCSV error', err); + el.innerHTML = `Error loading CSV`; + } + } + + window.readCSV = { renderCSV }; +})(); diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765974554630.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765974554630.jpg new file mode 100644 index 0000000..b35b56b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765974554630.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.csv new file mode 100644 index 0000000..f7dea01 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.csv @@ -0,0 +1,9 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,461.226,163.150,208.814,-115.601,2.852,108.987 +camera2,368.003,-324.025,849.279,-147.633,-3.697,60.975 +20,-27.787,-370.901,-104.452,-0.238,-4.375,143.811 +25,-67.077,-165.677,-12.623,-2.256,0.110,87.366 +50,0.002,-0.008,-0.007,-0.557,-0.254,0.228 +71,140.418,0.009,0.093,0.905,-2.137,1.508 +76,-204.436,-90.385,-94.522,-52.679,39.273,-87.214 +101,0.016,-80.028,-0.025,1.056,-2.213,0.260 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.json new file mode 100644 index 0000000..3d31956 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam.json @@ -0,0 +1,123 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:29:14", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.01816248951344627, + "rms_refs_px_cam2": 0.49688754115479944, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 461.2260243096291, + 163.15047116357306, + 208.81423321244827 + ], + "orientation_deg": { + "roll": -115.60069066047194, + "pitch": 2.8518474088280343, + "yaw": 108.98699397077662 + } + }, + { + "id": "camera2", + "position_mm": [ + 368.0032092105987, + -324.02483230064206, + 849.2788823044326 + ], + "orientation_deg": { + "roll": -147.6328488975886, + "pitch": -3.697144586874371, + "yaw": 60.97510432458154 + } + } + ], + "markers": [ + { + "id": 20, + "position_mm": [ + -27.78722965547953, + -370.90144636184993, + -104.45169497289619 + ], + "orientation_deg": { + "roll": -0.23809413256188228, + "pitch": -4.374834208590023, + "yaw": 143.81085305206332 + } + }, + { + "id": 25, + "position_mm": [ + -67.07681274414062, + -165.6768341064453, + -12.623200416564941 + ], + "orientation_deg": { + "roll": -2.2561967939168364, + "pitch": 0.10968211192904707, + "yaw": 87.36599578819637 + } + }, + { + "id": 50, + "position_mm": [ + 0.0022646484430879354, + -0.007531278766691685, + -0.006839004810899496 + ], + "orientation_deg": { + "roll": -0.5572651387919108, + "pitch": -0.2540478856154707, + "yaw": 0.22792865561204573 + } + }, + { + "id": 71, + "position_mm": [ + 140.41845703125, + 0.009271804243326187, + 0.092652328312397 + ], + "orientation_deg": { + "roll": 0.9053221063108222, + "pitch": -2.1366085994661774, + "yaw": 1.5077277441713781 + } + }, + { + "id": 76, + "position_mm": [ + -204.43634100254326, + -90.3850951365776, + -94.52184634518557 + ], + "orientation_deg": { + "roll": -52.67872835725091, + "pitch": 39.27299014262584, + "yaw": -87.21449748201128 + } + }, + { + "id": 101, + "position_mm": [ + 0.01583130471408367, + -80.02842712402344, + -0.02530261129140854 + ], + "orientation_deg": { + "roll": 1.0558520137504372, + "pitch": -2.2130377151018776, + "yaw": 0.2601617066921372 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_annotated.jpg new file mode 100644 index 0000000..8ee083c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_overlay.png new file mode 100644 index 0000000..2f63349 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765974554630_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975245635.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975245635.jpg new file mode 100644 index 0000000..95abf3f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975245635.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.csv new file mode 100644 index 0000000..c891594 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.csv @@ -0,0 +1,7 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,744.393,-11.882,212.666,-115.660,2.222,96.551 +camera2,527.995,-443.448,881.443,-149.405,-0.614,30.363 +25,146.987,-219.644,-14.453,-1.475,-0.713,75.762 +50,-1.518,0.089,-0.276,-0.596,-1.297,0.062 +71,139.840,0.042,-0.031,0.036,-1.975,-0.196 +101,-2.288,-80.358,-0.673,0.487,-1.568,-0.808 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.json new file mode 100644 index 0000000..d66e42f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam.json @@ -0,0 +1,97 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:40:45", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.45907110184149624, + "rms_refs_px_cam2": 1.8220535514255254, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 744.3932024096008, + -11.882499535240939, + 212.66641344590275 + ], + "orientation_deg": { + "roll": -115.66036055568036, + "pitch": 2.2216915445453633, + "yaw": 96.55059294849401 + } + }, + { + "id": "camera2", + "position_mm": [ + 527.9947219168113, + -443.4476403624862, + 881.4430227800225 + ], + "orientation_deg": { + "roll": -149.4054202299282, + "pitch": -0.6136995548592902, + "yaw": 30.363222205495898 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 146.98660278320312, + -219.6441650390625, + -14.453299522399902 + ], + "orientation_deg": { + "roll": -1.4751980332876062, + "pitch": -0.7130443690892287, + "yaw": 75.76221922077491 + } + }, + { + "id": 50, + "position_mm": [ + -1.5184317827224731, + 0.08936363458633423, + -0.27635297179222107 + ], + "orientation_deg": { + "roll": -0.5960699180502376, + "pitch": -1.296579669039671, + "yaw": 0.06174649369085999 + } + }, + { + "id": 71, + "position_mm": [ + 139.83982849121094, + 0.04223456606268883, + -0.03088134340941906 + ], + "orientation_deg": { + "roll": 0.03560029736445153, + "pitch": -1.9746336879120467, + "yaw": -0.1957084044000817 + } + }, + { + "id": 101, + "position_mm": [ + -2.2875027656555176, + -80.35816192626953, + -0.673177182674408 + ], + "orientation_deg": { + "roll": 0.4866379194238045, + "pitch": -1.5677675033219693, + "yaw": -0.8081315765533771 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_annotated.jpg new file mode 100644 index 0000000..fdbf341 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_overlay.png new file mode 100644 index 0000000..0d50ffa Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975245635_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975263688.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975263688.jpg new file mode 100644 index 0000000..7b0448f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975263688.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975271097.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975271097.jpg new file mode 100644 index 0000000..5ad7ed8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975271097.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975298025.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975298025.jpg new file mode 100644 index 0000000..8512766 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975298025.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975307378.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975307378.jpg new file mode 100644 index 0000000..939e942 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975307378.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975311865.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975311865.jpg new file mode 100644 index 0000000..00b9b5e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975311865.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975406077.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975406077.jpg new file mode 100644 index 0000000..b29883c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975406077.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.csv new file mode 100644 index 0000000..1bd04e5 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,498.210,88.623,206.052,-119.838,2.196,102.110 +camera2,334.074,-396.876,854.525,-147.250,-0.513,39.282 +25,-93.825,-211.994,-12.439,-1.046,-0.406,84.805 +50,-0.004,0.003,0.012,-0.106,-0.397,-0.042 +71,140.045,-0.037,-0.014,0.502,-1.471,0.890 +76,-347.458,-82.554,-72.496,-4.794,0.320,-131.339 +101,-0.044,-80.081,-0.025,1.333,-0.936,-0.171 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.json new file mode 100644 index 0000000..bbc306b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:43:26", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.0689596563850227, + "rms_refs_px_cam2": 0.15658089852267823, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 498.210011232767, + 88.62307649604217, + 206.05227415389444 + ], + "orientation_deg": { + "roll": -119.83827305973767, + "pitch": 2.1955471129077124, + "yaw": 102.10968938445795 + } + }, + { + "id": "camera2", + "position_mm": [ + 334.0739312137807, + -396.87615758651145, + 854.5248655333136 + ], + "orientation_deg": { + "roll": -147.24989987242014, + "pitch": -0.5126818772143938, + "yaw": 39.28200265150137 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -93.8246078491211, + -211.99365234375, + -12.43923568725586 + ], + "orientation_deg": { + "roll": -1.0455208006289969, + "pitch": -0.405997221444331, + "yaw": 84.80479451113972 + } + }, + { + "id": 50, + "position_mm": [ + -0.004142458084970713, + 0.0031922683119773865, + 0.011907931417226791 + ], + "orientation_deg": { + "roll": -0.10642453044301076, + "pitch": -0.3968296567842359, + "yaw": -0.04171026817406525 + } + }, + { + "id": 71, + "position_mm": [ + 140.0451202392578, + -0.037084344774484634, + -0.014320459216833115 + ], + "orientation_deg": { + "roll": 0.5023078026002353, + "pitch": -1.4710306891384899, + "yaw": 0.8898461679228588 + } + }, + { + "id": 76, + "position_mm": [ + -347.4584356767253, + -82.55446010770595, + -72.49557614124402 + ], + "orientation_deg": { + "roll": -4.793917356113556, + "pitch": 0.3203544844260641, + "yaw": -131.3390863237459 + } + }, + { + "id": 101, + "position_mm": [ + -0.043663639575242996, + -80.08061218261719, + -0.024777762591838837 + ], + "orientation_deg": { + "roll": 1.3330315657696694, + "pitch": -0.9363310058749773, + "yaw": -0.17089002041329374 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_annotated.jpg new file mode 100644 index 0000000..48d6464 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_overlay.png new file mode 100644 index 0000000..61392c3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975406077_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975550136.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975550136.jpg new file mode 100644 index 0000000..2aa7ec3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975550136.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.csv new file mode 100644 index 0000000..7cb46d7 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,499.822,88.859,207.627,-119.927,2.190,102.072 +camera2,324.617,-392.143,862.639,-147.982,-0.790,39.250 +25,-93.860,-212.481,-12.595,-1.949,-0.269,83.807 +50,-0.004,0.003,0.012,-0.258,-0.650,0.428 +71,140.046,-0.037,-0.013,0.306,-2.118,0.609 +76,-340.361,-86.238,-67.321,-4.926,2.286,-131.705 +101,-0.043,-80.081,-0.024,1.357,-1.022,-0.205 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.json new file mode 100644 index 0000000..f601256 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:45:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.06868263740095656, + "rms_refs_px_cam2": 0.15630357297595754, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 499.822142506545, + 88.85939416980528, + 207.62721199733437 + ], + "orientation_deg": { + "roll": -119.92745477596469, + "pitch": 2.190488293707874, + "yaw": 102.07241332921645 + } + }, + { + "id": "camera2", + "position_mm": [ + 324.6169326616307, + -392.1429491628629, + 862.638817313126 + ], + "orientation_deg": { + "roll": -147.98179815319492, + "pitch": -0.7895678131424055, + "yaw": 39.24991008226242 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -93.85962677001953, + -212.4806365966797, + -12.594773292541504 + ], + "orientation_deg": { + "roll": -1.9485429121680113, + "pitch": -0.2687673923849189, + "yaw": 83.80737730916069 + } + }, + { + "id": 50, + "position_mm": [ + -0.003994773142039776, + 0.003109264886006713, + 0.012178612872958183 + ], + "orientation_deg": { + "roll": -0.25790734082294964, + "pitch": -0.6498026480254269, + "yaw": 0.428441829560328 + } + }, + { + "id": 71, + "position_mm": [ + 140.04592895507812, + -0.03738624230027199, + -0.01319770235568285 + ], + "orientation_deg": { + "roll": 0.3055486706690755, + "pitch": -2.1177898361268723, + "yaw": 0.6091614832951404 + } + }, + { + "id": 76, + "position_mm": [ + -340.36073770675137, + -86.23836578004335, + -67.32056820469123 + ], + "orientation_deg": { + "roll": -4.926387915431779, + "pitch": 2.2860961549797616, + "yaw": -131.70545931002823 + } + }, + { + "id": 101, + "position_mm": [ + -0.04275330901145935, + -80.08077239990234, + -0.023683607578277588 + ], + "orientation_deg": { + "roll": 1.356930847634746, + "pitch": -1.0223328395484648, + "yaw": -0.20516192462359795 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_annotated.jpg new file mode 100644 index 0000000..0657be2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_overlay.png new file mode 100644 index 0000000..f20088e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975550136_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975572393.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975572393.jpg new file mode 100644 index 0000000..c72fba1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975572393.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975586723.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975586723.jpg new file mode 100644 index 0000000..31935bb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975586723.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975609404.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975609404.jpg new file mode 100644 index 0000000..26ab22d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975609404.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975626213.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975626213.jpg new file mode 100644 index 0000000..b81969f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975626213.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975638033.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975638033.jpg new file mode 100644 index 0000000..d8febd3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975638033.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975818850.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975818850.jpg new file mode 100644 index 0000000..0616881 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975818850.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975871414.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975871414.jpg new file mode 100644 index 0000000..367beaa Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975871414.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.csv new file mode 100644 index 0000000..db13164 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,395.016,274.958,206.045,-119.984,2.814,119.358 +camera2,359.471,-267.295,863.813,-147.768,-2.538,55.530 +25,-78.352,-188.494,-11.881,-1.886,0.748,102.089 +50,0.003,-0.035,-0.029,-0.393,-0.996,1.561 +71,140.373,-0.216,-0.009,0.798,-1.562,1.944 +76,-459.707,-170.694,-97.767,-2.463,3.181,-112.929 +101,0.061,-80.295,0.055,0.729,-1.048,0.758 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.json new file mode 100644 index 0000000..c1e1904 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:51:11", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.6323697652065153, + "rms_refs_px_cam2": 0.6489014675423443, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 395.01563676863606, + 274.9583596464833, + 206.04475397752364 + ], + "orientation_deg": { + "roll": -119.98431855701496, + "pitch": 2.8142321507417067, + "yaw": 119.35809543020302 + } + }, + { + "id": "camera2", + "position_mm": [ + 359.47129678000016, + -267.2947756235871, + 863.8126650240622 + ], + "orientation_deg": { + "roll": -147.76809010492943, + "pitch": -2.5376982238056183, + "yaw": 55.52992636638746 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -78.35247802734375, + -188.4938201904297, + -11.880936622619629 + ], + "orientation_deg": { + "roll": -1.885989573087267, + "pitch": 0.7475050867613423, + "yaw": 102.08882951321951 + } + }, + { + "id": 50, + "position_mm": [ + 0.002867116592824459, + -0.034943774342536926, + -0.02899026684463024 + ], + "orientation_deg": { + "roll": -0.39255711964707385, + "pitch": -0.9959750123875623, + "yaw": 1.5614975288119828 + } + }, + { + "id": 71, + "position_mm": [ + 140.3726043701172, + -0.21625664830207825, + -0.00919211097061634 + ], + "orientation_deg": { + "roll": 0.7984134246053606, + "pitch": -1.562078718233375, + "yaw": 1.9439997964972604 + } + }, + { + "id": 76, + "position_mm": [ + -459.70712987851766, + -170.69410468938494, + -97.76705043570367 + ], + "orientation_deg": { + "roll": -2.4626449410414946, + "pitch": 3.1808466940482707, + "yaw": -112.9286987372601 + } + }, + { + "id": 101, + "position_mm": [ + 0.06145252659916878, + -80.29531860351562, + 0.055326566100120544 + ], + "orientation_deg": { + "roll": 0.7289847565857819, + "pitch": -1.0475664492494143, + "yaw": 0.7580539936823688 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_annotated.jpg new file mode 100644 index 0000000..f39af98 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_overlay.png new file mode 100644 index 0000000..47bf35b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975871414_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975946434.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975946434.jpg new file mode 100644 index 0000000..39c076b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975946434.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975953050.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975953050.jpg new file mode 100644 index 0000000..31bcf7f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975953050.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975975116.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975975116.jpg new file mode 100644 index 0000000..ca22a0f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975975116.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975977082.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975977082.jpg new file mode 100644 index 0000000..d750392 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975977082.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.csv new file mode 100644 index 0000000..c5845d9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,536.560,19.088,206.377,-106.622,2.737,89.850 +camera2,265.697,-417.719,863.004,-147.946,-0.838,27.172 +25,-105.950,-153.015,-13.182,-0.890,-0.149,73.247 +50,-0.040,-0.018,-0.033,-0.879,-1.449,-0.958 +71,140.010,-0.012,-0.131,0.402,-1.339,-0.189 +76,-426.751,36.837,-80.533,-2.174,0.185,-140.318 +101,-0.154,-80.157,-0.149,1.401,-1.417,-0.671 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.json new file mode 100644 index 0000000..212c355 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:52:57", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.24427057867694885, + "rms_refs_px_cam2": 0.27827582635161247, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 536.5599698999005, + 19.08812610913911, + 206.37737338942568 + ], + "orientation_deg": { + "roll": -106.62238029916044, + "pitch": 2.73698636164054, + "yaw": 89.84958179049634 + } + }, + { + "id": "camera2", + "position_mm": [ + 265.696908061668, + -417.71859377662963, + 863.0037755691174 + ], + "orientation_deg": { + "roll": -147.94607328148066, + "pitch": -0.8376675719210364, + "yaw": 27.17235921730388 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -105.95045471191406, + -153.015380859375, + -13.182010650634766 + ], + "orientation_deg": { + "roll": -0.8902363626829162, + "pitch": -0.14934531032116036, + "yaw": 73.24720041399077 + } + }, + { + "id": 50, + "position_mm": [ + -0.040261898189783096, + -0.018160216510295868, + -0.032540079206228256 + ], + "orientation_deg": { + "roll": -0.8788475817184255, + "pitch": -1.4493986331576718, + "yaw": -0.9580865386218039 + } + }, + { + "id": 71, + "position_mm": [ + 140.0104522705078, + -0.011823506094515324, + -0.13130724430084229 + ], + "orientation_deg": { + "roll": 0.40245628021742036, + "pitch": -1.339452511723197, + "yaw": -0.18891338256930315 + } + }, + { + "id": 76, + "position_mm": [ + -426.75066384529714, + 36.836556193528715, + -80.53298420815302 + ], + "orientation_deg": { + "roll": -2.1735863467636007, + "pitch": 0.18540893221631718, + "yaw": -140.3178431469828 + } + }, + { + "id": 101, + "position_mm": [ + -0.15381859242916107, + -80.15699005126953, + -0.14876669645309448 + ], + "orientation_deg": { + "roll": 1.401434331782987, + "pitch": -1.417352777188989, + "yaw": -0.6705647440036173 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_annotated.jpg new file mode 100644 index 0000000..fe99833 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_overlay.png new file mode 100644 index 0000000..92929d4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975977082_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975992301.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975992301.jpg new file mode 100644 index 0000000..81f6a71 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975992301.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.csv new file mode 100644 index 0000000..0824910 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,536.132,19.475,207.265,-106.720,2.751,89.881 +camera2,268.384,-412.214,863.776,-148.162,-0.584,27.306 +25,-106.039,-153.152,-13.340,148.790,18.375,132.294 +50,-0.040,-0.018,-0.032,-0.891,-1.547,-0.922 +71,140.010,-0.012,-0.133,0.607,-1.246,0.187 +76,-427.186,35.671,-80.653,-2.018,-0.109,-140.186 +101,-0.155,-80.158,-0.149,1.389,-1.515,-0.634 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.json new file mode 100644 index 0000000..c827be7 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:53:12", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.246809770178914, + "rms_refs_px_cam2": 0.27880768692475444, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 536.1318738587609, + 19.474736168499103, + 207.26462795091985 + ], + "orientation_deg": { + "roll": -106.7203897853097, + "pitch": 2.7507012808548144, + "yaw": 89.88105336644603 + } + }, + { + "id": "camera2", + "position_mm": [ + 268.3843515238169, + -412.2144214770623, + 863.7760290780072 + ], + "orientation_deg": { + "roll": -148.1621979629559, + "pitch": -0.5838459897877972, + "yaw": 27.306333846282612 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.03853607177734, + -153.15234375, + -13.33987045288086 + ], + "orientation_deg": { + "roll": 148.7903066118052, + "pitch": 18.37471840944555, + "yaw": 132.29369679166456 + } + }, + { + "id": 50, + "position_mm": [ + -0.04027938097715378, + -0.018168868497014046, + -0.03249623626470566 + ], + "orientation_deg": { + "roll": -0.8911896876960713, + "pitch": -1.5474788147950507, + "yaw": -0.9216004257713646 + } + }, + { + "id": 71, + "position_mm": [ + 140.00997924804688, + -0.011874680407345295, + -0.13304609060287476 + ], + "orientation_deg": { + "roll": 0.6066041335238053, + "pitch": -1.2456305272454657, + "yaw": 0.1873499158076866 + } + }, + { + "id": 76, + "position_mm": [ + -427.1856256100377, + 35.67064810704457, + -80.65343499481803 + ], + "orientation_deg": { + "roll": -2.0175816127635513, + "pitch": -0.10919350640776791, + "yaw": -140.1864457356773 + } + }, + { + "id": 101, + "position_mm": [ + -0.15468710660934448, + -80.15770721435547, + -0.1492648720741272 + ], + "orientation_deg": { + "roll": 1.3886002098868537, + "pitch": -1.5153698095294952, + "yaw": -0.6340729479437016 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_annotated.jpg new file mode 100644 index 0000000..5828cb9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_overlay.png new file mode 100644 index 0000000..0fa31a8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765975992301_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976004900.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976004900.jpg new file mode 100644 index 0000000..a073859 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976004900.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.csv new file mode 100644 index 0000000..2d8be69 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,536.611,18.820,206.461,-106.626,2.661,89.850 +camera2,268.384,-412.214,863.776,-148.162,-0.584,27.306 +25,-105.905,-153.052,-13.330,148.800,18.245,132.261 +50,-0.040,-0.018,-0.032,-0.803,-1.452,-0.960 +71,140.010,-0.012,-0.132,1.207,-1.367,-0.158 +76,-427.186,35.671,-80.653,-2.018,-0.109,-140.186 +101,-0.155,-80.158,-0.149,0.999,-1.889,-0.671 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.json new file mode 100644 index 0000000..26bf7f2 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:53:25", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.2441583102735186, + "rms_refs_px_cam2": 0.27880768692475444, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 536.6112531658491, + 18.81997611440784, + 206.46065124784747 + ], + "orientation_deg": { + "roll": -106.6257561255132, + "pitch": 2.6610643225108683, + "yaw": 89.84975075090361 + } + }, + { + "id": "camera2", + "position_mm": [ + 268.3843515238169, + -412.2144214770623, + 863.7760290780072 + ], + "orientation_deg": { + "roll": -148.1621979629559, + "pitch": -0.5838459897877972, + "yaw": 27.306333846282612 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -105.90450286865234, + -153.0524444580078, + -13.329595565795898 + ], + "orientation_deg": { + "roll": 148.80013975261303, + "pitch": 18.24478302172668, + "yaw": 132.26101573505235 + } + }, + { + "id": 50, + "position_mm": [ + -0.04021511226892471, + -0.018157418817281723, + -0.032385922968387604 + ], + "orientation_deg": { + "roll": -0.8028611672479457, + "pitch": -1.4516990130367182, + "yaw": -0.9596821440114531 + } + }, + { + "id": 71, + "position_mm": [ + 140.010009765625, + -0.011915921233594418, + -0.13167670369148254 + ], + "orientation_deg": { + "roll": 1.20741490711664, + "pitch": -1.3669496548399305, + "yaw": -0.1576632529292416 + } + }, + { + "id": 76, + "position_mm": [ + -427.1856256100377, + 35.67064810704457, + -80.65343499481803 + ], + "orientation_deg": { + "roll": -2.0175816127635513, + "pitch": -0.10919350640776791, + "yaw": -140.1864457356773 + } + }, + { + "id": 101, + "position_mm": [ + -0.15451067686080933, + -80.15750122070312, + -0.14881648123264313 + ], + "orientation_deg": { + "roll": 0.9986347088612523, + "pitch": -1.8894700986904136, + "yaw": -0.6714546601080824 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_annotated.jpg new file mode 100644 index 0000000..1bc1654 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_overlay.png new file mode 100644 index 0000000..d299efa Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976004900_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976061325.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976061325.jpg new file mode 100644 index 0000000..7931420 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976061325.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976068034.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976068034.jpg new file mode 100644 index 0000000..7c0de3e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976068034.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.csv new file mode 100644 index 0000000..e85438d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,536.485,18.839,206.779,-106.660,2.662,89.850 +camera2,270.078,-416.213,861.643,-147.875,-0.599,27.290 +25,-106.002,-152.845,-13.395,-1.656,-0.260,74.773 +50,-0.040,-0.018,-0.033,-0.803,-1.486,-0.958 +71,140.010,-0.012,-0.132,0.125,-0.986,-0.226 +76,-427.338,36.154,-79.282,-2.295,-0.032,-140.199 +101,-0.155,-80.157,-0.149,0.998,-1.924,-0.670 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.json new file mode 100644 index 0000000..bde66f3 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:54:28", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.24499340599673408, + "rms_refs_px_cam2": 0.27883589939730147, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 536.4845116439085, + 18.839229807721747, + 206.77874626303299 + ], + "orientation_deg": { + "roll": -106.65991480567813, + "pitch": 2.6616683186812895, + "yaw": 89.84996530221618 + } + }, + { + "id": "camera2", + "position_mm": [ + 270.0780494525769, + -416.21266285199596, + 861.643153883761 + ], + "orientation_deg": { + "roll": -147.87452698748913, + "pitch": -0.598847887585048, + "yaw": 27.289970873393735 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.00161743164062, + -152.84478759765625, + -13.39499282836914 + ], + "orientation_deg": { + "roll": -1.6559759933266671, + "pitch": -0.2604845235747343, + "yaw": 74.7725286291638 + } + }, + { + "id": 50, + "position_mm": [ + -0.040440429002046585, + -0.018118301406502724, + -0.03263949975371361 + ], + "orientation_deg": { + "roll": -0.8029835843019023, + "pitch": -1.4858259759073, + "yaw": -0.9578783681599231 + } + }, + { + "id": 71, + "position_mm": [ + 140.0098114013672, + -0.011588250286877155, + -0.13215307891368866 + ], + "orientation_deg": { + "roll": 0.12497030142085656, + "pitch": -0.9856255500173754, + "yaw": -0.2263123773485252 + } + }, + { + "id": 76, + "position_mm": [ + -427.3379087741667, + 36.154104540318976, + -79.28241714985451 + ], + "orientation_deg": { + "roll": -2.2951599547424033, + "pitch": -0.03224401177592252, + "yaw": -140.19949710822343 + } + }, + { + "id": 101, + "position_mm": [ + -0.1550489366054535, + -80.1570816040039, + -0.14949001371860504 + ], + "orientation_deg": { + "roll": 0.9983404931317552, + "pitch": -1.9235960141180923, + "yaw": -0.6696442337381485 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_annotated.jpg new file mode 100644 index 0000000..212670b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_overlay.png new file mode 100644 index 0000000..56737b5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976068034_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976069357.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976069357.jpg new file mode 100644 index 0000000..3eff617 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976069357.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976152890.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976152890.jpg new file mode 100644 index 0000000..e512d93 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976152890.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976162193.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976162193.jpg new file mode 100644 index 0000000..0ca9087 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976162193.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976193421.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976193421.jpg new file mode 100644 index 0000000..72126ca Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976193421.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.csv new file mode 100644 index 0000000..92808da --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.143,-126.269,207.847,-108.968,2.548,85.122 +camera2,270.078,-416.213,861.643,-147.875,-0.599,27.290 +25,-106.269,-152.549,-13.850,-1.588,-0.375,72.807 +50,-0.060,0.071,-0.102,-0.330,-0.119,-0.470 +71,139.927,0.527,-0.717,0.185,-1.331,-0.473 +76,-427.338,36.154,-79.282,-2.295,-0.032,-140.199 +101,-0.131,-80.113,-0.116,2.341,-2.488,-1.552 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.json new file mode 100644 index 0000000..6c5af4d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:56:33", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6352803769089361, + "rms_refs_px_cam2": 0.27883589939730147, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.1434070874974, + -126.26880184835102, + 207.84717134607124 + ], + "orientation_deg": { + "roll": -108.96805282221369, + "pitch": 2.5480630503117383, + "yaw": 85.1220631505837 + } + }, + { + "id": "camera2", + "position_mm": [ + 270.0780494525769, + -416.21266285199596, + 861.643153883761 + ], + "orientation_deg": { + "roll": -147.87452698748913, + "pitch": -0.598847887585048, + "yaw": 27.289970873393735 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.2688980102539, + -152.54945373535156, + -13.849575996398926 + ], + "orientation_deg": { + "roll": -1.5884234657772047, + "pitch": -0.3745665819559331, + "yaw": 72.80694636666057 + } + }, + { + "id": 50, + "position_mm": [ + -0.0595768541097641, + 0.07062801718711853, + -0.10162462294101715 + ], + "orientation_deg": { + "roll": -0.32981134855001165, + "pitch": -0.11945304564632257, + "yaw": -0.4700373514560054 + } + }, + { + "id": 71, + "position_mm": [ + 139.9272918701172, + 0.5273333787918091, + -0.7168083786964417 + ], + "orientation_deg": { + "roll": 0.18548532711350751, + "pitch": -1.3314171147799696, + "yaw": -0.4728166142447713 + } + }, + { + "id": 76, + "position_mm": [ + -427.3379087741667, + 36.154104540318976, + -79.28241714985451 + ], + "orientation_deg": { + "roll": -2.2951599547424033, + "pitch": -0.03224401177592252, + "yaw": -140.19949710822343 + } + }, + { + "id": 101, + "position_mm": [ + -0.13059137761592865, + -80.11270904541016, + -0.1164691299200058 + ], + "orientation_deg": { + "roll": 2.3411360398909618, + "pitch": -2.4881518135413483, + "yaw": -1.55157097952814 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_annotated.jpg new file mode 100644 index 0000000..778e330 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_overlay.png new file mode 100644 index 0000000..66d6dde Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976193421_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976371308.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976371308.jpg new file mode 100644 index 0000000..6289e69 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976371308.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.csv new file mode 100644 index 0000000..035d6ea --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.045,-125.440,208.438,-109.022,2.699,85.139 +camera2,266.610,-418.486,860.306,-147.821,-0.848,27.232 +25,-140.292,-125.449,-97.313,2.157,-0.941,71.251 +50,-0.060,0.071,-0.102,-0.757,-0.797,-0.990 +71,139.929,0.526,-0.716,-0.325,-1.431,0.182 +76,-433.531,41.246,-90.204,-2.749,1.515,-141.240 +101,-0.131,-80.112,-0.117,1.895,-2.234,-2.024 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.json new file mode 100644 index 0000000..8a79439 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:59:31", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6293581246511548, + "rms_refs_px_cam2": 0.2788366800146409, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.04506476827214, + -125.43959602101629, + 208.43800067135305 + ], + "orientation_deg": { + "roll": -109.02184112523827, + "pitch": 2.698848284001251, + "yaw": 85.13910561624756 + } + }, + { + "id": "camera2", + "position_mm": [ + 266.6103702868428, + -418.48644100540105, + 860.3060088273107 + ], + "orientation_deg": { + "roll": -147.82070047743667, + "pitch": -0.8481476074566079, + "yaw": 27.231785358346894 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -140.29239613974138, + -125.4489603029717, + -97.31344559021105 + ], + "orientation_deg": { + "roll": 2.1567827057244413, + "pitch": -0.9412219288956468, + "yaw": 71.25097767397922 + } + }, + { + "id": 50, + "position_mm": [ + -0.05961627885699272, + 0.07056063413619995, + -0.10187845677137375 + ], + "orientation_deg": { + "roll": -0.7565047680938701, + "pitch": -0.7966906440544459, + "yaw": -0.9895245611569333 + } + }, + { + "id": 71, + "position_mm": [ + 139.9290313720703, + 0.5259146094322205, + -0.7162161469459534 + ], + "orientation_deg": { + "roll": -0.32549591394932065, + "pitch": -1.4313243306475538, + "yaw": 0.18202150530705868 + } + }, + { + "id": 76, + "position_mm": [ + -433.53071815447515, + 41.246156509784306, + -90.20381677655665 + ], + "orientation_deg": { + "roll": -2.749193832463117, + "pitch": 1.5148995579585318, + "yaw": -141.24013438395986 + } + }, + { + "id": 101, + "position_mm": [ + -0.13099518418312073, + -80.1122055053711, + -0.11726970225572586 + ], + "orientation_deg": { + "roll": 1.8945374923981935, + "pitch": -2.233677355990763, + "yaw": -2.0235970532528627 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_annotated.jpg new file mode 100644 index 0000000..1fbe63c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_overlay.png new file mode 100644 index 0000000..5e80109 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976371308_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976374401.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976374401.jpg new file mode 100644 index 0000000..4a98c11 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976374401.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.csv new file mode 100644 index 0000000..8845f32 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,503.865,-126.022,208.384,-109.022,2.675,85.081 +camera2,266.610,-418.486,860.306,-147.821,-0.848,27.232 +25,-140.292,-125.449,-97.313,2.157,-0.941,71.251 +50,-0.059,0.071,-0.102,-0.733,-0.798,-1.047 +71,139.929,0.528,-0.718,0.055,-1.375,-0.508 +76,-427.113,37.241,-81.727,-2.294,0.223,-140.257 +101,-0.131,-80.112,-0.117,1.918,-2.235,-2.082 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.json new file mode 100644 index 0000000..bf5558a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 12:59:34", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6351827813311057, + "rms_refs_px_cam2": 0.2788366800146409, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 503.86535377102757, + -126.0217865863354, + 208.3841414025093 + ], + "orientation_deg": { + "roll": -109.02178853785225, + "pitch": 2.6749295016696792, + "yaw": 85.08147015056912 + } + }, + { + "id": "camera2", + "position_mm": [ + 266.6103702868428, + -418.48644100540105, + 860.3060088273107 + ], + "orientation_deg": { + "roll": -147.82070047743667, + "pitch": -0.8481476074566079, + "yaw": 27.231785358346894 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -140.29239613974138, + -125.4489603029717, + -97.31344559021105 + ], + "orientation_deg": { + "roll": 2.1567827057244413, + "pitch": -0.9412219288956468, + "yaw": 71.25097767397922 + } + }, + { + "id": 50, + "position_mm": [ + -0.05949229747056961, + 0.07056579738855362, + -0.10178429633378983 + ], + "orientation_deg": { + "roll": -0.7326347017887312, + "pitch": -0.7982530830682991, + "yaw": -1.0474947170476723 + } + }, + { + "id": 71, + "position_mm": [ + 139.9291534423828, + 0.5281545519828796, + -0.7181304693222046 + ], + "orientation_deg": { + "roll": 0.054832054132430294, + "pitch": -1.3751877946904352, + "yaw": -0.5078755386026013 + } + }, + { + "id": 76, + "position_mm": [ + -427.1134884927447, + 37.24098158486472, + -81.7265624325304 + ], + "orientation_deg": { + "roll": -2.2936996824272757, + "pitch": 0.22279528833380796, + "yaw": -140.257000521589 + } + }, + { + "id": 101, + "position_mm": [ + -0.13077759742736816, + -80.11217498779297, + -0.11710629612207413 + ], + "orientation_deg": { + "roll": 1.9184477394460142, + "pitch": -2.2348086743383244, + "yaw": -2.0821671254702734 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_annotated.jpg new file mode 100644 index 0000000..fe3b79f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_overlay.png new file mode 100644 index 0000000..730fc96 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976374401_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976443318.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976443318.jpg new file mode 100644 index 0000000..eba17c1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976443318.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.csv new file mode 100644 index 0000000..e8b5dcb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.045,-125.440,208.438,-109.022,2.699,85.139 +camera2,270.026,-416.227,861.637,-147.885,-0.610,27.284 +25,-146.564,-122.019,-110.046,2.948,-3.094,70.681 +50,-0.060,0.070,-0.102,-0.757,-0.797,-0.990 +71,139.926,0.525,-0.717,-0.325,-1.431,0.182 +76,-433.546,40.124,-87.968,-2.734,1.269,-141.188 +101,-0.131,-80.113,-0.117,1.895,-2.234,-2.024 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.json new file mode 100644 index 0000000..619bcea --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:00:43", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6293581246511548, + "rms_refs_px_cam2": 0.27874697491884515, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.04506476827214, + -125.43959602101629, + 208.43800067135305 + ], + "orientation_deg": { + "roll": -109.02184112523827, + "pitch": 2.698848284001251, + "yaw": 85.13910561624756 + } + }, + { + "id": "camera2", + "position_mm": [ + 270.0255615833945, + -416.2266954181255, + 861.6372832306015 + ], + "orientation_deg": { + "roll": -147.88471453889258, + "pitch": -0.6104471798882228, + "yaw": 27.284260513873207 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -146.56390653875772, + -122.01936830680177, + -110.04647490641418 + ], + "orientation_deg": { + "roll": 2.9478733960652317, + "pitch": -3.094005209248501, + "yaw": 70.68106227703957 + } + }, + { + "id": 50, + "position_mm": [ + -0.05994195118546486, + 0.07033900171518326, + -0.10183054953813553 + ], + "orientation_deg": { + "roll": -0.7565047680938701, + "pitch": -0.7966906440544459, + "yaw": -0.9895245611569333 + } + }, + { + "id": 71, + "position_mm": [ + 139.92623901367188, + 0.5254115462303162, + -0.7173581123352051 + ], + "orientation_deg": { + "roll": -0.32549591394932065, + "pitch": -1.4313243306475538, + "yaw": 0.18202150530705868 + } + }, + { + "id": 76, + "position_mm": [ + -433.54618946861825, + 40.12437978999722, + -87.96843536493381 + ], + "orientation_deg": { + "roll": -2.7339747255490496, + "pitch": 1.2692023064376108, + "yaw": -141.18810429430917 + } + }, + { + "id": 101, + "position_mm": [ + -0.1314823478460312, + -80.11257934570312, + -0.11714237183332443 + ], + "orientation_deg": { + "roll": 1.8945374923981935, + "pitch": -2.233677355990763, + "yaw": -2.0235970532528627 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_annotated.jpg new file mode 100644 index 0000000..8f803ab Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_overlay.png new file mode 100644 index 0000000..5e80109 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976443318_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976445845.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976445845.jpg new file mode 100644 index 0000000..3029e2a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976445845.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.csv new file mode 100644 index 0000000..ff1f946 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.346,-126.088,208.972,-109.059,2.680,85.086 +camera2,264.187,-418.808,860.711,-147.871,-0.997,27.225 +25,-146.381,-120.960,-112.426,2.692,-3.384,70.637 +50,-0.059,0.071,-0.102,-0.740,-0.835,-1.041 +71,139.932,0.527,-0.717,-0.104,-1.611,-0.287 +76,-433.323,41.407,-91.498,-2.671,1.651,-141.245 +101,-0.130,-80.112,-0.117,1.765,-2.090,-1.611 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.json new file mode 100644 index 0000000..73f1b24 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:00:46", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6322619128484837, + "rms_refs_px_cam2": 0.27891317247078307, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.3455544730708, + -126.08836092695347, + 208.97212985670578 + ], + "orientation_deg": { + "roll": -109.05897102015024, + "pitch": 2.6798363329030015, + "yaw": 85.08587585610263 + } + }, + { + "id": "camera2", + "position_mm": [ + 264.18741185869976, + -418.8076518770778, + 860.7107237997933 + ], + "orientation_deg": { + "roll": -147.87053756474188, + "pitch": -0.9967164816589582, + "yaw": 27.225288127020352 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -146.38069430769912, + -120.96003565972013, + -112.42579787439388 + ], + "orientation_deg": { + "roll": 2.6923433615306704, + "pitch": -3.3843807163200768, + "yaw": 70.63672737874518 + } + }, + { + "id": 50, + "position_mm": [ + -0.05914720147848129, + 0.07060958445072174, + -0.10182428359985352 + ], + "orientation_deg": { + "roll": -0.7400391639105726, + "pitch": -0.8349788551011907, + "yaw": -1.041246608486316 + } + }, + { + "id": 71, + "position_mm": [ + 139.931640625, + 0.5272786021232605, + -0.7172355651855469 + ], + "orientation_deg": { + "roll": -0.10435540248426062, + "pitch": -1.6112172635894972, + "yaw": -0.28703867176603404 + } + }, + { + "id": 76, + "position_mm": [ + -433.3229711848545, + 41.40696043873204, + -91.49844947506591 + ], + "orientation_deg": { + "roll": -2.670645648451487, + "pitch": 1.650511846955434, + "yaw": -141.24526443651283 + } + }, + { + "id": 101, + "position_mm": [ + -0.13022156059741974, + -80.1122055053711, + -0.11703384667634964 + ], + "orientation_deg": { + "roll": 1.764660977086649, + "pitch": -2.090428969194846, + "yaw": -1.6105724321001378 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_annotated.jpg new file mode 100644 index 0000000..13bd5c5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_overlay.png new file mode 100644 index 0000000..edb387c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976445845_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976495904.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976495904.jpg new file mode 100644 index 0000000..d1663e4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976495904.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.csv new file mode 100644 index 0000000..d479aa3 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.274,-125.421,208.038,-108.984,2.641,85.170 +camera2,263.878,-413.788,865.140,-148.233,-0.840,27.182 +25,-147.036,-121.390,-112.171,6.442,-4.982,69.632 +50,-0.058,0.070,-0.101,-0.696,-0.763,-0.962 +71,139.935,0.519,-0.709,-0.489,-1.163,-0.158 +76,-426.418,36.499,-82.012,-1.893,0.125,-140.312 +101,-0.130,-80.113,-0.116,2.376,-2.677,-1.947 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.json new file mode 100644 index 0000000..01177bf --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:01:36", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6245055926073846, + "rms_refs_px_cam2": 0.278832396834227, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.27431986771165, + -125.42139468012584, + 208.03784733754605 + ], + "orientation_deg": { + "roll": -108.98423816059554, + "pitch": 2.6405808944061833, + "yaw": 85.16958065172916 + } + }, + { + "id": "camera2", + "position_mm": [ + 263.87845253528576, + -413.78822478509414, + 865.1404125791126 + ], + "orientation_deg": { + "roll": -148.23340567731228, + "pitch": -0.839630205401846, + "yaw": 27.182039752587464 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -147.03627839622246, + -121.38963611944858, + -112.1706024225141 + ], + "orientation_deg": { + "roll": 6.441739640710501, + "pitch": -4.982096863310886, + "yaw": 69.63247132329899 + } + }, + { + "id": 50, + "position_mm": [ + -0.0584297850728035, + 0.06957601755857468, + -0.10077428072690964 + ], + "orientation_deg": { + "roll": -0.6958293982162046, + "pitch": -0.7631468591028222, + "yaw": -0.961626910653193 + } + }, + { + "id": 71, + "position_mm": [ + 139.9346160888672, + 0.5189080834388733, + -0.7089385390281677 + ], + "orientation_deg": { + "roll": -0.48924402278605317, + "pitch": -1.1630519362635283, + "yaw": -0.15756567408554 + } + }, + { + "id": 76, + "position_mm": [ + -426.41843705188467, + 36.498682396519875, + -82.01192295215198 + ], + "orientation_deg": { + "roll": -1.8926776139424322, + "pitch": 0.1251018751932863, + "yaw": -140.31160702344877 + } + }, + { + "id": 101, + "position_mm": [ + -0.12956561148166656, + -80.11343383789062, + -0.1155543327331543 + ], + "orientation_deg": { + "roll": 2.3760695955706534, + "pitch": -2.677028882500984, + "yaw": -1.9465300125030265 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_annotated.jpg new file mode 100644 index 0000000..38a02f7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_overlay.png new file mode 100644 index 0000000..4523a76 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976495904_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976505906.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976505906.jpg new file mode 100644 index 0000000..aa4c324 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976505906.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.csv new file mode 100644 index 0000000..4973d05 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.093,-126.283,208.024,-109.008,2.479,85.137 +camera2,268.334,-422.390,858.173,-147.536,-0.859,27.216 +25,-105.842,-152.605,-14.023,-1.696,-0.813,71.878 +50,-0.060,0.071,-0.102,-0.536,-0.798,-0.995 +71,139.927,0.530,-0.716,-0.105,-1.437,0.174 +76,-433.706,41.753,-88.786,-3.026,1.582,-141.259 +101,-0.132,-80.112,-0.118,2.445,-2.695,-1.892 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.json new file mode 100644 index 0000000..b8fae37 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:01:46", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6293576251279118, + "rms_refs_px_cam2": 0.27886544119492895, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.0934068087054, + -126.28329367515842, + 208.02402256836555 + ], + "orientation_deg": { + "roll": -109.00776467635264, + "pitch": 2.478792361767782, + "yaw": 85.13693715572468 + } + }, + { + "id": "camera2", + "position_mm": [ + 268.33380839431544, + -422.3900515679469, + 858.1728097516028 + ], + "orientation_deg": { + "roll": -147.53642587072537, + "pitch": -0.8590190959122861, + "yaw": 27.215904801377054 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -105.84246063232422, + -152.60511779785156, + -14.022727966308594 + ], + "orientation_deg": { + "roll": -1.695780640310634, + "pitch": -0.8133892330228661, + "yaw": 71.87820185031751 + } + }, + { + "id": 50, + "position_mm": [ + -0.0600588396191597, + 0.07106141000986099, + -0.10189452022314072 + ], + "orientation_deg": { + "roll": -0.5359801899167488, + "pitch": -0.797510975145324, + "yaw": -0.9953966789912412 + } + }, + { + "id": 71, + "position_mm": [ + 139.9269561767578, + 0.5298624038696289, + -0.7156455516815186 + ], + "orientation_deg": { + "roll": -0.1049863696464444, + "pitch": -1.4366481715488217, + "yaw": 0.17369894227031907 + } + }, + { + "id": 76, + "position_mm": [ + -433.7064606498042, + 41.75268192381465, + -88.7862797018979 + ], + "orientation_deg": { + "roll": -3.0256330394548976, + "pitch": 1.5823494941617136, + "yaw": -141.2592508812439 + } + }, + { + "id": 101, + "position_mm": [ + -0.1315535604953766, + -80.11157989501953, + -0.11791004240512848 + ], + "orientation_deg": { + "roll": 2.4453678950040403, + "pitch": -2.6951584653517657, + "yaw": -1.8924720116134814 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_annotated.jpg new file mode 100644 index 0000000..9de5577 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_overlay.png new file mode 100644 index 0000000..45ea68a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976505906_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976510318.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976510318.jpg new file mode 100644 index 0000000..c523f25 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976510318.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.csv new file mode 100644 index 0000000..607d193 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.078,-126.003,208.163,-109.013,2.552,85.138 +camera2,260.431,-416.119,863.749,-148.165,-1.081,27.129 +25,-143.584,-123.068,-105.850,3.274,-6.022,69.919 +50,-0.058,0.070,-0.101,-0.609,-0.797,-0.993 +71,139.937,0.522,-0.709,-0.178,-1.435,0.176 +76,-432.776,41.597,-92.797,-2.365,1.674,-141.338 +101,-0.129,-80.113,-0.116,1.964,-2.216,-1.956 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.json new file mode 100644 index 0000000..9d51127 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:01:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6293577922273652, + "rms_refs_px_cam2": 0.27892097550272943, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.0778399424594, + -126.00273760845553, + 208.16315581839478 + ], + "orientation_deg": { + "roll": -109.01250970216289, + "pitch": 2.552126010706852, + "yaw": 85.1376339307348 + } + }, + { + "id": "camera2", + "position_mm": [ + 260.43120263663246, + -416.11905379058913, + 863.7487098088126 + ], + "orientation_deg": { + "roll": -148.16547775040436, + "pitch": -1.0808411388268302, + "yaw": 27.129188303530235 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -143.58404128053297, + -123.06792952254081, + -105.84975515838468 + ], + "orientation_deg": { + "roll": 3.2743133514710934, + "pitch": -6.022051857685719, + "yaw": 69.91887753713497 + } + }, + { + "id": 50, + "position_mm": [ + -0.05797994136810303, + 0.06982465088367462, + -0.10064714401960373 + ], + "orientation_deg": { + "roll": -0.6094736910337024, + "pitch": -0.7972933232165795, + "yaw": -0.993468852064801 + } + }, + { + "id": 71, + "position_mm": [ + 139.93748474121094, + 0.5216041803359985, + -0.70941561460495 + ], + "orientation_deg": { + "roll": -0.1784760762614983, + "pitch": -1.4349306860423678, + "yaw": 0.17644537614751823 + } + }, + { + "id": 76, + "position_mm": [ + -432.7764352647697, + 41.59703501512746, + -92.79699548440735 + ], + "orientation_deg": { + "roll": -2.3647606734140236, + "pitch": 1.6739890438703076, + "yaw": -141.3378382456698 + } + }, + { + "id": 101, + "position_mm": [ + -0.12891621887683868, + -80.11300659179688, + -0.11559303104877472 + ], + "orientation_deg": { + "roll": 1.9636589833194162, + "pitch": -2.216295898160902, + "yaw": -1.9564332368842674 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_annotated.jpg new file mode 100644 index 0000000..a5decc8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_overlay.png new file mode 100644 index 0000000..c51d507 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976510318_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976511638.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976511638.jpg new file mode 100644 index 0000000..34d4cf7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976511638.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.csv new file mode 100644 index 0000000..5d5b787 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.011,-125.157,208.755,-109.055,2.708,85.166 +camera2,273.476,-413.962,862.924,-147.947,-0.371,27.337 +25,-106.542,-152.744,-13.748,-1.794,-0.601,71.910 +50,-0.060,0.070,-0.102,-0.768,-0.829,-0.961 +71,139.923,0.525,-0.719,0.280,-1.966,-0.218 +76,-433.557,39.017,-85.725,-2.721,1.022,-141.136 +101,-0.132,-80.113,-0.117,1.884,-2.266,-1.995 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.json new file mode 100644 index 0000000..304b2fb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:01:51", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6284211334949419, + "rms_refs_px_cam2": 0.27866067351114204, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.0113743473861, + -125.15683693861426, + 208.7551517328191 + ], + "orientation_deg": { + "roll": -109.05487493690511, + "pitch": 2.707669529585417, + "yaw": 85.16552378291799 + } + }, + { + "id": "camera2", + "position_mm": [ + 273.47559086571636, + -413.9621299990215, + 862.9242149620329 + ], + "orientation_deg": { + "roll": -147.9468491115545, + "pitch": -0.3712618496328017, + "yaw": 27.33677639445699 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.54240417480469, + -152.74412536621094, + -13.74763011932373 + ], + "orientation_deg": { + "roll": -1.7940821621841627, + "pitch": -0.6014036602220213, + "yaw": 71.9101336252395 + } + }, + { + "id": 50, + "position_mm": [ + -0.06037868559360504, + 0.0701504647731781, + -0.10190878808498383 + ], + "orientation_deg": { + "roll": -0.7675353317647795, + "pitch": -0.8290166541894428, + "yaw": -0.9613919269264777 + } + }, + { + "id": 71, + "position_mm": [ + 139.9230499267578, + 0.5247005820274353, + -0.7192102670669556 + ], + "orientation_deg": { + "roll": 0.2799212197935416, + "pitch": -1.9663937843565766, + "yaw": -0.21822701810262546 + } + }, + { + "id": 76, + "position_mm": [ + -433.5569901085664, + 39.01660298096121, + -85.72520944091289 + ], + "orientation_deg": { + "roll": -2.7208914298636153, + "pitch": 1.0224252117493264, + "yaw": -141.13585909118484 + } + }, + { + "id": 101, + "position_mm": [ + -0.13216792047023773, + -80.11292266845703, + -0.11724794656038284 + ], + "orientation_deg": { + "roll": 1.8840850921846892, + "pitch": -2.266197126799241, + "yaw": -1.99521055619918 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_annotated.jpg new file mode 100644 index 0000000..1352406 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_overlay.png new file mode 100644 index 0000000..284810e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976511638_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976533542.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976533542.jpg new file mode 100644 index 0000000..f76c613 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976533542.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.csv new file mode 100644 index 0000000..1410ddd --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,503.988,-126.013,208.094,-108.989,2.678,85.084 +camera2,280.549,-414.508,861.028,-147.697,-0.050,27.490 +25,-106.900,-152.633,-13.859,-1.504,-0.469,72.140 +50,-0.061,0.070,-0.102,-0.734,-0.765,-1.047 +71,139.916,0.529,-0.723,0.393,-1.715,-0.488 +76,-434.311,37.774,-82.071,-3.030,0.757,-140.986 +101,-0.133,-80.113,-0.118,1.917,-2.202,-2.081 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.json new file mode 100644 index 0000000..e3761d6 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:02:13", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6332172308004111, + "rms_refs_px_cam2": 0.2786520819950864, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 503.9883219285542, + -126.01305611443264, + 208.09392140616941 + ], + "orientation_deg": { + "roll": -108.98878546582125, + "pitch": 2.6781244733335727, + "yaw": 85.0838760297254 + } + }, + { + "id": "camera2", + "position_mm": [ + 280.54886904363997, + -414.5083584371921, + 861.0282102053575 + ], + "orientation_deg": { + "roll": -147.69705090343567, + "pitch": -0.049874072849571516, + "yaw": 27.490128789338254 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.89995574951172, + -152.63323974609375, + -13.859172821044922 + ], + "orientation_deg": { + "roll": -1.5037226825597365, + "pitch": -0.4690935157225362, + "yaw": 72.14040717369096 + } + }, + { + "id": 50, + "position_mm": [ + -0.06123243644833565, + 0.07045385986566544, + -0.10214414447546005 + ], + "orientation_deg": { + "roll": -0.7335972780465582, + "pitch": -0.7651455449860776, + "yaw": -1.0466168574175132 + } + }, + { + "id": 71, + "position_mm": [ + 139.91624450683594, + 0.5293574333190918, + -0.7232520580291748 + ], + "orientation_deg": { + "roll": 0.3928871432917858, + "pitch": -1.7147211038645238, + "yaw": -0.4875704163213823 + } + }, + { + "id": 76, + "position_mm": [ + -434.310973157048, + 37.77409686495808, + -82.07121199042233 + ], + "orientation_deg": { + "roll": -3.0299024639926673, + "pitch": 0.7574278024347812, + "yaw": -140.9863880953474 + } + }, + { + "id": 101, + "position_mm": [ + -0.13290373980998993, + -80.11270141601562, + -0.11753848195075989 + ], + "orientation_deg": { + "roll": 1.9168864153543101, + "pitch": -2.2017239138320623, + "yaw": -2.0812419648747005 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_annotated.jpg new file mode 100644 index 0000000..336fa08 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_overlay.png new file mode 100644 index 0000000..47b2bd8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976533542_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976536997.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976536997.jpg new file mode 100644 index 0000000..e7f1a64 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976536997.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.csv new file mode 100644 index 0000000..ee19e76 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.062,-125.722,208.301,-109.017,2.625,85.138 +camera2,271.043,-414.254,863.388,-148.000,-0.519,27.331 +25,-146.258,-122.815,-108.825,2.927,-2.949,70.727 +50,-0.060,0.070,-0.101,-0.683,-0.797,-0.992 +71,139.927,0.524,-0.716,-0.252,-1.433,0.179 +76,-433.357,39.158,-87.012,-2.640,1.157,-141.141 +101,-0.131,-80.113,-0.117,2.390,-2.711,-1.977 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.json new file mode 100644 index 0000000..12e936c --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:02:17", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6293579558138553, + "rms_refs_px_cam2": 0.2787365015806279, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.06172890850587, + -125.72150619863379, + 208.3011536231886 + ], + "orientation_deg": { + "roll": -109.01720217435452, + "pitch": 2.6254780277150043, + "yaw": 85.13835656757807 + } + }, + { + "id": "camera2", + "position_mm": [ + 271.04295022439686, + -414.25352630880263, + 863.3875996437604 + ], + "orientation_deg": { + "roll": -147.99953462931296, + "pitch": -0.5192878339749551, + "yaw": 27.33050908689374 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -146.25763720348112, + -122.81457523005956, + -108.8251443737368 + ], + "orientation_deg": { + "roll": 2.927049412752695, + "pitch": -2.9488847003261287, + "yaw": 70.72727650692146 + } + }, + { + "id": 50, + "position_mm": [ + -0.05969664826989174, + 0.06999973207712173, + -0.10139262676239014 + ], + "orientation_deg": { + "roll": -0.6829819495112311, + "pitch": -0.7970202003488717, + "yaw": -0.9915115784903589 + } + }, + { + "id": 71, + "position_mm": [ + 139.9265899658203, + 0.524118185043335, + -0.7160006165504456 + ], + "orientation_deg": { + "roll": -0.25197933078780654, + "pitch": -1.4331563911968832, + "yaw": 0.1792194664992506 + } + }, + { + "id": 76, + "position_mm": [ + -433.35668011734464, + 39.15824148432595, + -87.0120337276309 + ], + "orientation_deg": { + "roll": -2.6396732473236817, + "pitch": 1.1569364831977949, + "yaw": -141.14099128341329 + } + }, + { + "id": 101, + "position_mm": [ + -0.1311531513929367, + -80.11304473876953, + -0.11656071990728378 + ], + "orientation_deg": { + "roll": 2.389511191091972, + "pitch": -2.7106763519928343, + "yaw": -1.9768715126950103 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_annotated.jpg new file mode 100644 index 0000000..1a52ca3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_overlay.png new file mode 100644 index 0000000..2d9144c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976536997_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976569915.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976569915.jpg new file mode 100644 index 0000000..6d9b763 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976569915.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.csv new file mode 100644 index 0000000..3357811 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,504.347,-124.848,208.201,-108.989,2.726,85.199 +camera2,271.710,-420.176,859.501,-147.599,-0.625,27.268 +25,-146.814,-121.470,-109.976,3.146,-3.300,70.657 +50,-0.061,0.071,-0.103,-0.781,-0.762,-0.931 +71,139.923,0.526,-0.716,0.068,-0.982,0.236 +76,-433.712,40.636,-86.571,-3.011,1.340,-141.208 +101,-0.133,-80.112,-0.118,1.869,-2.199,-1.964 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.json new file mode 100644 index 0000000..73a76b5 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:02:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6216126871304202, + "rms_refs_px_cam2": 0.27877574550922213, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 504.3467177651968, + -124.84839969748379, + 208.20052635157322 + ], + "orientation_deg": { + "roll": -108.98881539719824, + "pitch": 2.7258915071953442, + "yaw": 85.19916483251545 + } + }, + { + "id": "camera2", + "position_mm": [ + 271.7103984732562, + -420.1762310785873, + 859.5007485322551 + ], + "orientation_deg": { + "roll": -147.59946157702038, + "pitch": -0.624503409956644, + "yaw": 27.268090703738505 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -146.81402334074255, + -121.4697456929491, + -109.97633012271702 + ], + "orientation_deg": { + "roll": 3.1457948756796936, + "pitch": -3.3001758973110524, + "yaw": 70.65692830937577 + } + }, + { + "id": 50, + "position_mm": [ + -0.06081688031554222, + 0.07085692137479782, + -0.1025189533829689 + ], + "orientation_deg": { + "roll": -0.7812616513834034, + "pitch": -0.7619515845530636, + "yaw": -0.9306914661403207 + } + }, + { + "id": 71, + "position_mm": [ + 139.92327880859375, + 0.5257957577705383, + -0.7162370681762695 + ], + "orientation_deg": { + "roll": 0.06801858674436598, + "pitch": -0.9818994185879205, + "yaw": 0.23606813123376177 + } + }, + { + "id": 76, + "position_mm": [ + -433.71232450894894, + 40.636401855403456, + -86.57061914576603 + ], + "orientation_deg": { + "roll": -3.0107221692955366, + "pitch": 1.3399691183257774, + "yaw": -141.20750081197778 + } + }, + { + "id": 101, + "position_mm": [ + -0.13263513147830963, + -80.11198425292969, + -0.11833488196134567 + ], + "orientation_deg": { + "roll": 1.8691411868116445, + "pitch": -2.199390557025395, + "yaw": -1.964118452243027 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_annotated.jpg new file mode 100644 index 0000000..85449fe Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_overlay.png new file mode 100644 index 0000000..6121c5b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976569915_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976630411.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976630411.jpg new file mode 100644 index 0000000..b517184 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976630411.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.csv new file mode 100644 index 0000000..95b52a6 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,503.955,-125.731,208.411,-109.022,2.687,85.110 +camera2,262.893,-415.781,863.358,-148.116,-0.930,27.136 +25,-106.055,-152.575,-13.570,-1.538,-0.468,72.169 +50,-0.059,0.070,-0.101,-0.745,-0.797,-1.019 +71,139.934,0.523,-0.714,-0.108,-1.574,-0.264 +76,-432.990,41.430,-91.485,-2.443,1.536,-141.333 +101,-0.130,-80.113,-0.116,1.906,-2.234,-2.053 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.json new file mode 100644 index 0000000..1fc70bc --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:03:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.632261773350004, + "rms_refs_px_cam2": 0.27884448522024036, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 503.9553274562514, + -125.73077129018331, + 208.41117557782678 + ], + "orientation_deg": { + "roll": -109.02182298272318, + "pitch": 2.686887498233234, + "yaw": 85.11028451099297 + } + }, + { + "id": "camera2", + "position_mm": [ + 262.89332824060756, + -415.78070335239164, + 863.3583110986948 + ], + "orientation_deg": { + "roll": -148.11604663154188, + "pitch": -0.9299671848346116, + "yaw": 27.135841989364135 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.05467987060547, + -152.57540893554688, + -13.570466041564941 + ], + "orientation_deg": { + "roll": -1.5378494336152493, + "pitch": -0.4679445530157586, + "yaw": 72.16864091716799 + } + }, + { + "id": 50, + "position_mm": [ + -0.05859305337071419, + 0.0699530839920044, + -0.10119388997554779 + ], + "orientation_deg": { + "roll": -0.7445688954340823, + "pitch": -0.7974800989114033, + "yaw": -1.018512562475088 + } + }, + { + "id": 71, + "position_mm": [ + 139.9341278076172, + 0.5233048796653748, + -0.7138124704360962 + ], + "orientation_deg": { + "roll": -0.1083922281096603, + "pitch": -1.5736621355347988, + "yaw": -0.26425697130920717 + } + }, + { + "id": 76, + "position_mm": [ + -432.9899622166887, + 41.430193108568936, + -91.4846999408362 + ], + "orientation_deg": { + "roll": -2.4433800510271833, + "pitch": 1.53604167231849, + "yaw": -141.33251926842 + } + }, + { + "id": 101, + "position_mm": [ + -0.12975601851940155, + -80.11288452148438, + -0.11611907184123993 + ], + "orientation_deg": { + "roll": 1.906493601978138, + "pitch": -2.234251265268926, + "yaw": -2.052885061880487 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_annotated.jpg new file mode 100644 index 0000000..124d424 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_overlay.png new file mode 100644 index 0000000..ec18356 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976630411_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976649818.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976649818.jpg new file mode 100644 index 0000000..b611045 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976649818.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.csv new file mode 100644 index 0000000..96b5c36 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,503.922,-125.448,208.728,-109.055,2.696,85.137 +camera2,262.893,-415.781,863.358,-148.116,-0.930,27.136 +25,-106.131,-152.533,-13.606,-1.572,-0.467,72.197 +50,-0.059,0.070,-0.101,-0.756,-0.830,-0.990 +71,139.934,0.523,-0.715,0.083,-1.839,0.162 +76,-432.990,41.430,-91.485,-2.443,1.536,-141.333 +101,-0.130,-80.113,-0.116,1.896,-2.267,-2.025 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.json new file mode 100644 index 0000000..826de85 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:04:10", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.6313243928150438, + "rms_refs_px_cam2": 0.27884448476230234, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 503.92187994434846, + -125.44822895222019, + 208.72843167100618 + ], + "orientation_deg": { + "roll": -109.0548662748313, + "pitch": 2.6956873080866326, + "yaw": 85.13669720523785 + } + }, + { + "id": "camera2", + "position_mm": [ + 262.89332830346603, + -415.7807033077657, + 863.3583111024947 + ], + "orientation_deg": { + "roll": -148.11604663223085, + "pitch": -0.9299671806877696, + "yaw": 27.135841991108922 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -106.1310806274414, + -152.53330993652344, + -13.606334686279297 + ], + "orientation_deg": { + "roll": -1.5719897714946716, + "pitch": -0.46675988979777105, + "yaw": 72.19688361857689 + } + }, + { + "id": 50, + "position_mm": [ + -0.058696914464235306, + 0.06998306512832642, + -0.10131727159023285 + ], + "orientation_deg": { + "roll": -0.7555786377867904, + "pitch": -0.8298173617693388, + "yaw": -0.9903919926466094 + } + }, + { + "id": 71, + "position_mm": [ + 139.93373107910156, + 0.5230897665023804, + -0.7145028114318848 + ], + "orientation_deg": { + "roll": 0.0830396884628772, + "pitch": -1.8392009859383351, + "yaw": 0.16166387639387395 + } + }, + { + "id": 76, + "position_mm": [ + -432.9899622239293, + 41.43019309040302, + -91.4846999160156 + ], + "orientation_deg": { + "roll": -2.443380051181272, + "pitch": 1.5360416681176448, + "yaw": -141.3325192666905 + } + }, + { + "id": 101, + "position_mm": [ + -0.12994331121444702, + -80.11286926269531, + -0.11634586751461029 + ], + "orientation_deg": { + "roll": 1.896062405523817, + "pitch": -2.266781965881273, + "yaw": -2.0245112136453645 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_annotated.jpg new file mode 100644 index 0000000..278ca26 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_overlay.png new file mode 100644 index 0000000..a9018e7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976649818_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976679114.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976679114.jpg new file mode 100644 index 0000000..6f362f6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976679114.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976686196.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976686196.jpg new file mode 100644 index 0000000..87b2b4a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976686196.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.csv new file mode 100644 index 0000000..97d2155 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,666.482,181.711,214.938,-109.414,2.531,113.021 +camera2,556.096,-198.618,894.975,-149.783,-2.111,54.390 +25,176.405,-131.289,-15.920,-1.973,-0.595,69.607 +50,-0.591,-0.235,-0.261,0.445,-1.264,1.277 +71,139.891,-0.116,-0.103,-0.198,-1.428,0.546 +76,-250.151,-81.718,-90.003,-79.497,21.921,-89.986 +101,-1.415,-80.936,-0.662,1.056,-0.959,0.546 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.json new file mode 100644 index 0000000..633c6cf --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:04:46", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.0993891231747583, + "rms_refs_px_cam2": 1.361054038151648, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 666.4815661094116, + 181.71116771645234, + 214.93828431909753 + ], + "orientation_deg": { + "roll": -109.41391326061476, + "pitch": 2.5308411146160994, + "yaw": 113.0213137521841 + } + }, + { + "id": "camera2", + "position_mm": [ + 556.0961354808068, + -198.61767177335702, + 894.9751222958868 + ], + "orientation_deg": { + "roll": -149.78326937626036, + "pitch": -2.1108914774322316, + "yaw": 54.38960505742331 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 176.40476989746094, + -131.28948974609375, + -15.920320510864258 + ], + "orientation_deg": { + "roll": -1.97335779553217, + "pitch": -0.5948595663864729, + "yaw": 69.60731785479211 + } + }, + { + "id": 50, + "position_mm": [ + -0.5905055999755859, + -0.235235795378685, + -0.26055318117141724 + ], + "orientation_deg": { + "roll": 0.4454764160921107, + "pitch": -1.2635575663968608, + "yaw": 1.277202953673086 + } + }, + { + "id": 71, + "position_mm": [ + 139.89149475097656, + -0.11590918898582458, + -0.10313072055578232 + ], + "orientation_deg": { + "roll": -0.19798653592932233, + "pitch": -1.4282857239320974, + "yaw": 0.5456653879304562 + } + }, + { + "id": 76, + "position_mm": [ + -250.1508858241932, + -81.71834726866415, + -90.00309065047895 + ], + "orientation_deg": { + "roll": -79.4967644284469, + "pitch": 21.920882237477716, + "yaw": -89.98558293825445 + } + }, + { + "id": 101, + "position_mm": [ + -1.4146373271942139, + -80.93620300292969, + -0.6616266369819641 + ], + "orientation_deg": { + "roll": 1.055935135700186, + "pitch": -0.9593757495981492, + "yaw": 0.5461186707866093 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_annotated.jpg new file mode 100644 index 0000000..b980dbe Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_overlay.png new file mode 100644 index 0000000..f31001a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976686196_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976698396.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976698396.jpg new file mode 100644 index 0000000..a3df8d2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976698396.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.csv new file mode 100644 index 0000000..adfca8c --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,398.621,-418.715,879.797,-149.071,-0.346,22.334 +25,85.631,-165.209,-15.569,0.046,-0.067,32.565 +50,-0.881,0.026,-0.355,-0.435,-0.734,-0.219 +71,139.917,0.032,-0.084,-0.854,-1.688,0.420 +76,-255.171,107.894,-84.112,-81.217,20.892,-122.654 +101,-1.554,-80.259,-0.666,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.json new file mode 100644 index 0000000..4af6ee3 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:04:58", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1047218084009319, + "rms_refs_px_cam2": 1.4996788508428351, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.46706493398216, + 205.9099946362136 + ], + "orientation_deg": { + "roll": -108.87869927249052, + "pitch": 2.5018378536570323, + "yaw": 80.26418393527955 + } + }, + { + "id": "camera2", + "position_mm": [ + 398.62070698691923, + -418.71540144962506, + 879.796668182724 + ], + "orientation_deg": { + "roll": -149.071078025882, + "pitch": -0.34567269297701614, + "yaw": 22.33394637896775 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.63091278076172, + -165.2091827392578, + -15.56919002532959 + ], + "orientation_deg": { + "roll": 0.04614386037654547, + "pitch": -0.06744280728791145, + "yaw": 32.56489296449069 + } + }, + { + "id": 50, + "position_mm": [ + -0.8813304901123047, + 0.026284625753760338, + -0.35532423853874207 + ], + "orientation_deg": { + "roll": -0.4352064147948927, + "pitch": -0.7339874186860661, + "yaw": -0.2187468052744248 + } + }, + { + "id": 71, + "position_mm": [ + 139.91677856445312, + 0.03194146975874901, + -0.08386741578578949 + ], + "orientation_deg": { + "roll": -0.8540009699523268, + "pitch": -1.687690658466286, + "yaw": 0.41964522999376647 + } + }, + { + "id": 76, + "position_mm": [ + -255.17104771846866, + 107.8940495967653, + -84.11236225517172 + ], + "orientation_deg": { + "roll": -81.21691653905542, + "pitch": 20.892140936369337, + "yaw": -122.65386488988948 + } + }, + { + "id": 101, + "position_mm": [ + -1.5537110567092896, + -80.25931549072266, + -0.6656734347343445 + ], + "orientation_deg": { + "roll": 0.8918130679867812, + "pitch": -0.5991361653788677, + "yaw": -1.3253533967175322 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_annotated.jpg new file mode 100644 index 0000000..2309cc7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_overlay.png new file mode 100644 index 0000000..b72c0b6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765976698396_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765977934726.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765977934726.jpg new file mode 100644 index 0000000..2113572 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765977934726.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.csv new file mode 100644 index 0000000..2d0613b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.953,-161.991,206.488,-108.921,2.533,80.383 +camera2,389.333,-428.117,880.200,-148.864,-0.932,21.985 +25,85.059,-165.541,-15.963,-0.005,-0.078,32.686 +50,-0.879,0.029,-0.357,-0.473,-0.770,-0.098 +71,139.917,0.033,-0.084,0.143,-1.745,-0.398 +76,-273.097,126.270,-114.544,-77.036,28.184,-125.289 +101,-1.541,-80.252,-0.665,0.855,-0.636,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.json new file mode 100644 index 0000000..b3cac14 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:25:35", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10363352848252134, + "rms_refs_px_cam2": 1.4912826388568254, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.9526950599894, + -161.99081939560324, + 206.48768461778934 + ], + "orientation_deg": { + "roll": -108.9208311627796, + "pitch": 2.5330904927971045, + "yaw": 80.38299323886413 + } + }, + { + "id": "camera2", + "position_mm": [ + 389.3332290835119, + -428.1171474492448, + 880.2001321224058 + ], + "orientation_deg": { + "roll": -148.86395256133093, + "pitch": -0.9321056859637223, + "yaw": 21.985352767667194 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.05927276611328, + -165.54110717773438, + -15.962555885314941 + ], + "orientation_deg": { + "roll": -0.005299820632561677, + "pitch": -0.07753987647758409, + "yaw": 32.68561795245102 + } + }, + { + "id": 50, + "position_mm": [ + -0.8791269659996033, + 0.029027190059423447, + -0.3568425476551056 + ], + "orientation_deg": { + "roll": -0.47299232664358193, + "pitch": -0.7703311916667298, + "yaw": -0.09759087823246036 + } + }, + { + "id": 71, + "position_mm": [ + 139.9174041748047, + 0.03268476575613022, + -0.083976149559021 + ], + "orientation_deg": { + "roll": 0.14307512950326273, + "pitch": -1.745117555374437, + "yaw": -0.3980525510268973 + } + }, + { + "id": 76, + "position_mm": [ + -273.0970739641448, + 126.26991428975887, + -114.54418689056212 + ], + "orientation_deg": { + "roll": -77.03649701468808, + "pitch": 28.184287332783338, + "yaw": -125.28892406117707 + } + }, + { + "id": 101, + "position_mm": [ + -1.5409455299377441, + -80.25204467773438, + -0.6652438044548035 + ], + "orientation_deg": { + "roll": 0.8547372329466377, + "pitch": -0.6362028772592411, + "yaw": -1.2042938125419977 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_annotated.jpg new file mode 100644 index 0000000..28c123f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_overlay.png new file mode 100644 index 0000000..464a713 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765977934726_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978354760.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978354760.jpg new file mode 100644 index 0000000..385fdf2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978354760.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.csv new file mode 100644 index 0000000..3a4763c --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,392.983,-426.458,880.180,-148.877,-0.693,22.043 +25,85.080,-165.810,-15.859,-1.622,0.341,34.321 +50,-0.877,0.029,-0.355,-0.473,-0.727,-0.098 +71,139.917,0.033,-0.084,-0.416,-1.205,-0.342 +76,-268.204,121.014,-104.362,-1.993,1.126,-101.258 +101,-1.540,-80.252,-0.662,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.json new file mode 100644 index 0000000..ee6b32f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:32:35", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058826038, + "rms_refs_px_cam2": 1.4852899199298324, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752434, + 205.98860705019186 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.5403854998735294, + "yaw": 80.384970419323 + } + }, + { + "id": "camera2", + "position_mm": [ + 392.98349454623514, + -426.45849139079894, + 880.1798850727823 + ], + "orientation_deg": { + "roll": -148.87664066407604, + "pitch": -0.6930399020546993, + "yaw": 22.043057337569802 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.0802001953125, + -165.80984497070312, + -15.85876750946045 + ], + "orientation_deg": { + "roll": -1.6220526544821876, + "pitch": 0.3405555368169938, + "yaw": 34.32062830280033 + } + }, + { + "id": 50, + "position_mm": [ + -0.8769957423210144, + 0.028586216270923615, + -0.35472431778907776 + ], + "orientation_deg": { + "roll": -0.4730902775008555, + "pitch": -0.7268008659703239, + "yaw": -0.09751368982894933 + } + }, + { + "id": 71, + "position_mm": [ + 139.9174346923828, + 0.03257105499505997, + -0.08356358855962753 + ], + "orientation_deg": { + "roll": -0.41609041234852523, + "pitch": -1.2046252614391746, + "yaw": -0.34177017054524156 + } + }, + { + "id": 76, + "position_mm": [ + -268.20418540662547, + 121.01368373108845, + -104.36187382568518 + ], + "orientation_deg": { + "roll": -1.9930136063778485, + "pitch": 1.126030111945969, + "yaw": -101.25848096688556 + } + }, + { + "id": 101, + "position_mm": [ + -1.5395259857177734, + -80.25227355957031, + -0.6622897386550903 + ], + "orientation_deg": { + "roll": 0.8537984955837707, + "pitch": -0.5926825633642847, + "yaw": -1.204207836951622 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_annotated.jpg new file mode 100644 index 0000000..8729b0f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_overlay.png new file mode 100644 index 0000000..fc31907 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978354760_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978364728.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978364728.jpg new file mode 100644 index 0000000..26acb20 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978364728.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.csv new file mode 100644 index 0000000..326380e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,394.503,-422.168,881.087,-149.085,-0.526,22.084 +25,85.108,-165.520,-15.939,-0.229,-0.175,32.838 +50,-0.879,0.028,-0.355,-0.473,-0.727,-0.098 +71,139.917,0.032,-0.083,-0.416,-1.205,-0.342 +76,-273.943,124.917,-113.676,-77.075,27.723,-125.212 +101,-1.543,-80.255,-0.662,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.json new file mode 100644 index 0000000..2a25e4c --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:32:45", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4886137378685818, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 394.50315874149305, + -422.1679009187397, + 881.0871258250953 + ], + "orientation_deg": { + "roll": -149.08450891422558, + "pitch": -0.526036544386297, + "yaw": 22.083559659867177 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.1084976196289, + -165.5200653076172, + -15.939337730407715 + ], + "orientation_deg": { + "roll": -0.2286088518520129, + "pitch": -0.17518163211099821, + "yaw": 32.837999850067234 + } + }, + { + "id": 50, + "position_mm": [ + -0.8794412016868591, + 0.027748126536607742, + -0.3545858860015869 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91734313964844, + 0.03223132714629173, + -0.08325827866792679 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -273.94280351626605, + 124.91694386877994, + -113.67583537375414 + ], + "orientation_deg": { + "roll": -77.07488817860515, + "pitch": 27.723441189164376, + "yaw": -125.21152003093003 + } + }, + { + "id": 101, + "position_mm": [ + -1.5434532165527344, + -80.25487518310547, + -0.6616359353065491 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_annotated.jpg new file mode 100644 index 0000000..1c2dafd Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_overlay.png new file mode 100644 index 0000000..69c772a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978364728_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978420185.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978420185.jpg new file mode 100644 index 0000000..3eafcb7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978420185.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.csv new file mode 100644 index 0000000..3cae79a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,399.930,-427.541,875.567,-148.565,-0.419,22.248 +25,85.812,-165.698,-15.592,-0.068,-0.436,32.063 +50,-0.882,0.031,-0.357,-0.435,-0.734,-0.219 +71,139.916,0.034,-0.084,-0.854,-1.688,0.420 +76,-275.245,125.191,-111.500,-77.635,27.913,-125.305 +101,-1.554,-80.249,-0.669,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.json new file mode 100644 index 0000000..0912e7f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:33:40", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10472180840108743, + "rms_refs_px_cam2": 1.4897811522451436, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.4670649339818, + 205.9099946362141 + ], + "orientation_deg": { + "roll": -108.87869927249056, + "pitch": 2.5018378536570647, + "yaw": 80.26418393527958 + } + }, + { + "id": "camera2", + "position_mm": [ + 399.9299778767819, + -427.541471678453, + 875.5665112187837 + ], + "orientation_deg": { + "roll": -148.56472235386858, + "pitch": -0.41866790947472887, + "yaw": 22.24786893119825 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.81160736083984, + -165.6979522705078, + -15.591692924499512 + ], + "orientation_deg": { + "roll": -0.06837624625466492, + "pitch": -0.43622642542972256, + "yaw": 32.063317092577606 + } + }, + { + "id": 50, + "position_mm": [ + -0.8819465041160583, + 0.03136468306183815, + -0.35683512687683105 + ], + "orientation_deg": { + "roll": -0.4352064147949305, + "pitch": -0.7339874186860947, + "yaw": -0.21874680527440576 + } + }, + { + "id": 71, + "position_mm": [ + 139.9163360595703, + 0.03365320712327957, + -0.08447983860969543 + ], + "orientation_deg": { + "roll": -0.8540009699523651, + "pitch": -1.6876906584663214, + "yaw": 0.4196452299937873 + } + }, + { + "id": 76, + "position_mm": [ + -275.2453447107583, + 125.19095362163618, + -111.50001674105015 + ], + "orientation_deg": { + "roll": -77.6354799205662, + "pitch": 27.912821417594703, + "yaw": -125.30453700394301 + } + }, + { + "id": 101, + "position_mm": [ + -1.5538606643676758, + -80.24870300292969, + -0.6686796545982361 + ], + "orientation_deg": { + "roll": 0.8918130679867433, + "pitch": -0.5991361653788996, + "yaw": -1.3253533967175124 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_annotated.jpg new file mode 100644 index 0000000..80cad3f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_overlay.png new file mode 100644 index 0000000..e337ddc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978420185_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978422903.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978422903.jpg new file mode 100644 index 0000000..df008e4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978422903.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.csv new file mode 100644 index 0000000..1c59962 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,400.029,-424.197,877.739,-148.796,-0.298,22.187 +25,85.491,-165.556,-15.761,0.046,-0.067,32.565 +50,-0.882,0.031,-0.356,-0.435,-0.734,-0.219 +71,139.917,0.033,-0.084,-0.854,-1.688,0.420 +76,-274.970,124.783,-111.539,-77.488,27.687,-125.298 +101,-1.552,-80.250,-0.666,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.json new file mode 100644 index 0000000..847550d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:33:43", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10472180840108743, + "rms_refs_px_cam2": 1.4878937891673878, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.4670649339818, + 205.9099946362141 + ], + "orientation_deg": { + "roll": -108.87869927249056, + "pitch": 2.5018378536570647, + "yaw": 80.26418393527958 + } + }, + { + "id": "camera2", + "position_mm": [ + 400.02932028411874, + -424.19729752883944, + 877.7390908263537 + ], + "orientation_deg": { + "roll": -148.79611737981867, + "pitch": -0.2978436661361828, + "yaw": 22.18731859916674 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.49146270751953, + -165.55581665039062, + -15.76115894317627 + ], + "orientation_deg": { + "roll": 0.04614386037649777, + "pitch": -0.06744280728791623, + "yaw": 32.564892964490724 + } + }, + { + "id": 50, + "position_mm": [ + -0.8819009065628052, + 0.030530910938978195, + -0.3558298647403717 + ], + "orientation_deg": { + "roll": -0.4352064147949305, + "pitch": -0.7339874186860947, + "yaw": -0.21874680527440576 + } + }, + { + "id": 71, + "position_mm": [ + 139.9165496826172, + 0.03337714448571205, + -0.08404399454593658 + ], + "orientation_deg": { + "roll": -0.8540009699523651, + "pitch": -1.6876906584663214, + "yaw": 0.4196452299937873 + } + }, + { + "id": 76, + "position_mm": [ + -274.970060165044, + 124.78318550988638, + -111.53915439275708 + ], + "orientation_deg": { + "roll": -77.48816970973628, + "pitch": 27.686635929646595, + "yaw": -125.29783112227334 + } + }, + { + "id": 101, + "position_mm": [ + -1.5516290664672852, + -80.2503433227539, + -0.6656925678253174 + ], + "orientation_deg": { + "roll": 0.8918130679867433, + "pitch": -0.5991361653788996, + "yaw": -1.3253533967175124 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_annotated.jpg new file mode 100644 index 0000000..1e8f105 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_overlay.png new file mode 100644 index 0000000..b72c0b6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978422903_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978427264.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978427264.jpg new file mode 100644 index 0000000..d1ae1c3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978427264.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.csv new file mode 100644 index 0000000..3075d72 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.290,-161.497,206.014,-108.878,2.553,80.425 +camera2,389.333,-428.117,880.200,-148.864,-0.932,21.985 +25,85.285,-165.663,-15.860,-1.261,0.237,33.528 +50,-0.879,0.028,-0.356,-0.486,-0.724,-0.057 +71,139.917,0.032,-0.084,-0.592,-1.368,0.005 +76,-273.097,126.270,-114.544,-77.036,28.184,-125.289 +101,-1.541,-80.253,-0.664,0.841,-0.590,-1.164 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.json new file mode 100644 index 0000000..dcfcb7b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:33:47", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10314231132724402, + "rms_refs_px_cam2": 1.4912826388390292, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.2896277448373, + -161.49680135448872, + 206.0141381748754 + ], + "orientation_deg": { + "roll": -108.87756174705868, + "pitch": 2.5532384478781482, + "yaw": 80.42524903597868 + } + }, + { + "id": "camera2", + "position_mm": [ + 389.3332290883851, + -428.1171474456579, + 880.2001321214082 + ], + "orientation_deg": { + "roll": -148.86395256138124, + "pitch": -0.9321056856587137, + "yaw": 21.985352767811538 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.2854995727539, + -165.66329956054688, + -15.859580039978027 + ], + "orientation_deg": { + "roll": -1.2609175134770405, + "pitch": 0.23708474112498523, + "yaw": 33.52830062889529 + } + }, + { + "id": 50, + "position_mm": [ + -0.8788771629333496, + 0.028428908437490463, + -0.3560209572315216 + ], + "orientation_deg": { + "roll": -0.48571569455719926, + "pitch": -0.7243677316503169, + "yaw": -0.05708907740516809 + } + }, + { + "id": 71, + "position_mm": [ + 139.91744995117188, + 0.03237084671854973, + -0.08365382999181747 + ], + "orientation_deg": { + "roll": -0.5923462530765837, + "pitch": -1.3683553550730023, + "yaw": 0.004526389837570288 + } + }, + { + "id": 76, + "position_mm": [ + -273.0970739652437, + 126.26991428889394, + -114.54418689006386 + ], + "orientation_deg": { + "roll": -77.03649701482715, + "pitch": 28.184287332499547, + "yaw": -125.28892406109924 + } + }, + { + "id": 101, + "position_mm": [ + -1.5405128002166748, + -80.25296783447266, + -0.6637934446334839 + ], + "orientation_deg": { + "roll": 0.841128775746463, + "pitch": -0.5904937171094051, + "yaw": -1.1638122918819924 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_annotated.jpg new file mode 100644 index 0000000..e93cef4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_overlay.png new file mode 100644 index 0000000..7ef6da0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978427264_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978512243.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978512243.jpg new file mode 100644 index 0000000..398b2a7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978512243.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.csv new file mode 100644 index 0000000..2f97f5b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,396.557,-428.160,878.175,-148.672,-0.600,22.147 +25,85.667,-165.820,-15.643,-1.224,0.201,33.367 +50,-0.882,0.031,-0.357,-0.435,-0.734,-0.219 +71,139.916,0.033,-0.085,-0.854,-1.688,0.420 +76,-240.260,97.045,-61.741,-85.044,21.778,-126.019 +101,-1.550,-80.250,-0.667,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.json new file mode 100644 index 0000000..178d483 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:35:12", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1047218084009319, + "rms_refs_px_cam2": 1.4905742859153104, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.46706493398216, + 205.9099946362136 + ], + "orientation_deg": { + "roll": -108.87869927249052, + "pitch": 2.5018378536570323, + "yaw": 80.26418393527955 + } + }, + { + "id": "camera2", + "position_mm": [ + 396.55697205594964, + -428.15997298840966, + 878.1748125905327 + ], + "orientation_deg": { + "roll": -148.67236913999432, + "pitch": -0.600050223662007, + "yaw": 22.146597355169206 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.6673355102539, + -165.81951904296875, + -15.643328666687012 + ], + "orientation_deg": { + "roll": -1.2241649302408877, + "pitch": 0.20113227309760437, + "yaw": 33.36742624017477 + } + }, + { + "id": 50, + "position_mm": [ + -0.8821107149124146, + 0.030719362199306488, + -0.35711562633514404 + ], + "orientation_deg": { + "roll": -0.4352064147948927, + "pitch": -0.7339874186860661, + "yaw": -0.2187468052744248 + } + }, + { + "id": 71, + "position_mm": [ + 139.91639709472656, + 0.033435896039009094, + -0.08452612161636353 + ], + "orientation_deg": { + "roll": -0.8540009699523268, + "pitch": -1.687690658466286, + "yaw": 0.41964522999376647 + } + }, + { + "id": 76, + "position_mm": [ + -240.25967077291233, + 97.04547037328337, + -61.74097971273574 + ], + "orientation_deg": { + "roll": -85.04413351410004, + "pitch": 21.7775275895944, + "yaw": -126.01855594151559 + } + }, + { + "id": 101, + "position_mm": [ + -1.5502642393112183, + -80.2496337890625, + -0.6674761176109314 + ], + "orientation_deg": { + "roll": 0.8918130679867812, + "pitch": -0.5991361653788677, + "yaw": -1.3253533967175322 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_annotated.jpg new file mode 100644 index 0000000..06d108c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_overlay.png new file mode 100644 index 0000000..87a14da Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978512243_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978528964.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978528964.jpg new file mode 100644 index 0000000..766affe Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978528964.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.csv new file mode 100644 index 0000000..280cdcf --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,396.557,-428.160,878.175,-148.672,-0.600,22.147 +25,85.597,-165.684,-15.769,-0.097,-0.410,32.184 +50,-0.883,0.030,-0.357,-0.473,-0.727,-0.098 +71,139.916,0.033,-0.084,-0.416,-1.205,-0.342 +76,-251.164,106.267,-78.101,-84.260,21.193,-124.672 +101,-1.551,-80.251,-0.668,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.json new file mode 100644 index 0000000..c7cf3d7 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:35:29", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4905742859153104, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 396.55697205594964, + -428.15997298840966, + 878.1748125905327 + ], + "orientation_deg": { + "roll": -148.67236913999432, + "pitch": -0.600050223662007, + "yaw": 22.146597355169206 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.5965347290039, + -165.68418884277344, + -15.768712043762207 + ], + "orientation_deg": { + "roll": -0.09656434453923476, + "pitch": -0.4099191103099073, + "yaw": 32.18427542523384 + } + }, + { + "id": 50, + "position_mm": [ + -0.8827373385429382, + 0.029821297153830528, + -0.3572579026222229 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91622924804688, + 0.03283580392599106, + -0.0842922031879425 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -251.1638502188519, + 106.26687337937778, + -78.10058240905737 + ], + "orientation_deg": { + "roll": -84.25994072415034, + "pitch": 21.192993708019305, + "yaw": -124.67195941109712 + } + }, + { + "id": 101, + "position_mm": [ + -1.5514910221099854, + -80.25122833251953, + -0.6678730845451355 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_annotated.jpg new file mode 100644 index 0000000..5db8fa0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_overlay.png new file mode 100644 index 0000000..d47e87c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978528964_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978536535.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978536535.jpg new file mode 100644 index 0000000..1f33a3c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978536535.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.csv new file mode 100644 index 0000000..427bfdf --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,402.987,-424.677,872.728,-148.563,-0.190,22.324 +25,86.063,-165.415,-15.433,-0.201,-0.202,32.717 +50,-0.885,0.032,-0.358,-0.435,-0.734,-0.219 +71,139.916,0.034,-0.084,-0.854,-1.688,0.420 +76,-276.576,125.692,-112.647,-77.776,27.721,-125.294 +101,-1.563,-80.250,-0.671,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.json new file mode 100644 index 0000000..d4b6fb3 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:35:36", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10472180840108743, + "rms_refs_px_cam2": 1.4965149767482901, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.4670649339818, + 205.9099946362141 + ], + "orientation_deg": { + "roll": -108.87869927249056, + "pitch": 2.5018378536570647, + "yaw": 80.26418393527958 + } + }, + { + "id": "camera2", + "position_mm": [ + 402.98741113770006, + -424.6766911166422, + 872.7281296568589 + ], + "orientation_deg": { + "roll": -148.56290936086853, + "pitch": -0.1899021452396405, + "yaw": 22.323936594136764 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.06256866455078, + -165.414794921875, + -15.43289852142334 + ], + "orientation_deg": { + "roll": -0.20072338343339066, + "pitch": -0.20180886363998096, + "yaw": 32.71715791760586 + } + }, + { + "id": 50, + "position_mm": [ + -0.8854264616966248, + 0.03174865245819092, + -0.35751163959503174 + ], + "orientation_deg": { + "roll": -0.4352064147949305, + "pitch": -0.7339874186860947, + "yaw": -0.21874680527440576 + } + }, + { + "id": 71, + "position_mm": [ + 139.91615295410156, + 0.03367307782173157, + -0.08436405658721924 + ], + "orientation_deg": { + "roll": -0.8540009699523651, + "pitch": -1.6876906584663214, + "yaw": 0.4196452299937873 + } + }, + { + "id": 76, + "position_mm": [ + -276.5756647194486, + 125.69190905013905, + -112.64672830838185 + ], + "orientation_deg": { + "roll": -77.77586101402827, + "pitch": 27.720671587001178, + "yaw": -125.29396798918707 + } + }, + { + "id": 101, + "position_mm": [ + -1.5631128549575806, + -80.24964904785156, + -0.6712360978126526 + ], + "orientation_deg": { + "roll": 0.8918130679867433, + "pitch": -0.5991361653788996, + "yaw": -1.3253533967175124 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_annotated.jpg new file mode 100644 index 0000000..1ef76f1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_overlay.png new file mode 100644 index 0000000..292ef79 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978536535_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978552974.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978552974.jpg new file mode 100644 index 0000000..ed228e3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978552974.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.csv new file mode 100644 index 0000000..a7c5fd4 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,396.557,-428.160,878.175,-148.672,-0.600,22.147 +25,85.570,-165.626,-15.808,-0.229,-0.175,32.838 +50,-0.883,0.030,-0.357,-0.473,-0.727,-0.098 +71,139.916,0.033,-0.084,-0.416,-1.205,-0.342 +76,-251.164,106.267,-78.101,-84.260,21.193,-124.672 +101,-1.551,-80.251,-0.668,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.json new file mode 100644 index 0000000..7f3ed55 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:35:53", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4905742859153104, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 396.55697205594964, + -428.15997298840966, + 878.1748125905327 + ], + "orientation_deg": { + "roll": -148.67236913999432, + "pitch": -0.600050223662007, + "yaw": 22.146597355169206 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.5704574584961, + -165.6255340576172, + -15.807857513427734 + ], + "orientation_deg": { + "roll": -0.2286088518520129, + "pitch": -0.17518163211099821, + "yaw": 32.837999850067234 + } + }, + { + "id": 50, + "position_mm": [ + -0.8827373385429382, + 0.029821297153830528, + -0.3572579026222229 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91622924804688, + 0.03283580392599106, + -0.0842922031879425 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -251.1638502188519, + 106.26687337937778, + -78.10058240905737 + ], + "orientation_deg": { + "roll": -84.25994072415034, + "pitch": 21.192993708019305, + "yaw": -124.67195941109712 + } + }, + { + "id": 101, + "position_mm": [ + -1.5514910221099854, + -80.25122833251953, + -0.6678730845451355 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_annotated.jpg new file mode 100644 index 0000000..b7f3e30 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_overlay.png new file mode 100644 index 0000000..69c772a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765978552974_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979039260.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979039260.jpg new file mode 100644 index 0000000..f40f89d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979039260.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.csv new file mode 100644 index 0000000..0d17ced --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,403.206,-426.949,873.141,-148.462,-0.260,22.338 +25,86.086,-165.485,-15.553,0.157,-0.276,32.019 +50,-0.887,0.031,-0.359,-0.473,-0.727,-0.098 +71,139.915,0.033,-0.085,-0.416,-1.205,-0.342 +76,-261.387,113.191,-90.574,-80.370,22.242,-123.097 +101,-1.566,-80.250,-0.673,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.json new file mode 100644 index 0000000..b35e0f1 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:43:59", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4958014268965474, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 403.2058313170833, + -426.9488725969016, + 873.1408461291827 + ], + "orientation_deg": { + "roll": -148.46207522684398, + "pitch": -0.25987066280574933, + "yaw": 22.33762537862971 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.08554077148438, + -165.48483276367188, + -15.553363800048828 + ], + "orientation_deg": { + "roll": 0.15728110118853308, + "pitch": -0.2756500646898289, + "yaw": 32.019429992171816 + } + }, + { + "id": 50, + "position_mm": [ + -0.8872020244598389, + 0.03128548711538315, + -0.35859349370002747 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91546630859375, + 0.0331987589597702, + -0.08455745130777359 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -261.3866144836756, + 113.19096808114149, + -90.57359380357033 + ], + "orientation_deg": { + "roll": -80.37001568832487, + "pitch": 22.241891169942825, + "yaw": -123.09655191704742 + } + }, + { + "id": 101, + "position_mm": [ + -1.5657693147659302, + -80.25023651123047, + -0.673183262348175 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_annotated.jpg new file mode 100644 index 0000000..f8e0ae7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_overlay.png new file mode 100644 index 0000000..ca5c9b7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979039260_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979096358.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979096358.jpg new file mode 100644 index 0000000..b8c7ff1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979096358.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.csv new file mode 100644 index 0000000..f63530b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,400.822,-418.886,878.434,-149.019,-0.205,22.336 +25,85.619,-165.500,-15.631,-0.226,-0.156,32.867 +50,-0.882,0.027,-0.355,-0.473,-0.727,-0.098 +71,139.917,0.032,-0.083,-0.416,-1.205,-0.342 +76,-244.243,98.785,-67.543,-82.126,21.474,-124.098 +101,-1.556,-80.258,-0.666,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.json new file mode 100644 index 0000000..bcc4990 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:44:56", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4946536535115844, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 400.82219327120487, + -418.8856350199214, + 878.4340406596931 + ], + "orientation_deg": { + "roll": -149.0187968194168, + "pitch": -0.20456338861245066, + "yaw": 22.33601560353088 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.6185302734375, + -165.50035095214844, + -15.631163597106934 + ], + "orientation_deg": { + "roll": -0.22552596082693432, + "pitch": -0.1555341972251732, + "yaw": 32.86746639452312 + } + }, + { + "id": 50, + "position_mm": [ + -0.8823607563972473, + 0.027041854336857796, + -0.3551765978336334 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91661071777344, + 0.0319083146750927, + -0.0834699422121048 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -244.2430572570355, + 98.78546515947274, + -67.54270395023897 + ], + "orientation_deg": { + "roll": -82.12590732984967, + "pitch": 21.47371722533385, + "yaw": -124.09834355740088 + } + }, + { + "id": 101, + "position_mm": [ + -1.555521845817566, + -80.25770568847656, + -0.6655595302581787 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_annotated.jpg new file mode 100644 index 0000000..4a91b33 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_overlay.png new file mode 100644 index 0000000..cd0c867 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979096358_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979173960.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979173960.jpg new file mode 100644 index 0000000..73e1d27 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979173960.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.csv new file mode 100644 index 0000000..d63681b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.152,-162.344,205.771,-108.865,2.451,80.384 +camera2,400.638,-416.585,877.989,-149.120,-0.132,22.323 +25,85.084,-165.201,-16.080,-2.740,-0.018,35.872 +50,-0.881,0.027,-0.354,-0.383,-0.728,-0.100 +71,139.917,0.032,-0.083,-0.326,-1.206,-0.345 +76,-250.088,103.263,-76.296,-80.800,22.447,-124.407 +101,-1.553,-80.259,-0.663,1.483,-1.196,-1.125 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.json new file mode 100644 index 0000000..1c0fb52 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:46:14", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353518758385725, + "rms_refs_px_cam2": 1.4953678927523888, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1518541849574, + -162.34393649614083, + 205.77062739813692 + ], + "orientation_deg": { + "roll": -108.86458750904792, + "pitch": 2.4510552445839373, + "yaw": 80.38410468824381 + } + }, + { + "id": "camera2", + "position_mm": [ + 400.63838379752104, + -416.5849303296082, + 877.9893149286722 + ], + "orientation_deg": { + "roll": -149.12019727514823, + "pitch": -0.13249473857069546, + "yaw": 22.32275408036658 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.08399200439453, + -165.20066833496094, + -16.08040428161621 + ], + "orientation_deg": { + "roll": -2.740047025811349, + "pitch": -0.01847313520853178, + "yaw": 35.87154351446472 + } + }, + { + "id": 50, + "position_mm": [ + -0.880856990814209, + 0.026666248217225075, + -0.3537614941596985 + ], + "orientation_deg": { + "roll": -0.38278747059529616, + "pitch": -0.7284787654137109, + "yaw": -0.10010477791418171 + } + }, + { + "id": 71, + "position_mm": [ + 139.91725158691406, + 0.031759146600961685, + -0.08283130824565887 + ], + "orientation_deg": { + "roll": -0.32576856300809315, + "pitch": -1.2059176162435097, + "yaw": -0.3451143363345687 + } + }, + { + "id": 76, + "position_mm": [ + -250.08847920037314, + 103.26304471152159, + -76.29561185691746 + ], + "orientation_deg": { + "roll": -80.79951323405994, + "pitch": 22.44684447161427, + "yaw": -124.40701894743988 + } + }, + { + "id": 101, + "position_mm": [ + -1.5534437894821167, + -80.25852966308594, + -0.6631629467010498 + ], + "orientation_deg": { + "roll": 1.4827116171797827, + "pitch": -1.1964807147242504, + "yaw": -1.125133701560211 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_annotated.jpg new file mode 100644 index 0000000..8ce5378 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_overlay.png new file mode 100644 index 0000000..2207f05 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979173960_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979387494.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979387494.jpg new file mode 100644 index 0000000..0cb094b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979387494.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.csv new file mode 100644 index 0000000..f8eaceb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.929,-162.483,205.963,-108.878,2.528,80.345 +camera2,405.972,-421.956,872.460,-148.609,-0.030,22.488 +25,86.426,-165.413,-15.145,-0.741,0.380,32.815 +50,-0.884,0.030,-0.357,-0.460,-0.729,-0.138 +71,139.916,0.033,-0.084,-0.215,-1.373,-0.977 +76,-262.664,112.680,-91.527,-80.380,21.969,-122.950 +101,-1.565,-80.253,-0.671,0.866,-0.595,-1.245 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.json new file mode 100644 index 0000000..5a24ba4 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:49:47", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1039263543054746, + "rms_refs_px_cam2": 1.4957526441206537, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.9291582161287, + -162.48263822555913, + 205.96274419767525 + ], + "orientation_deg": { + "roll": -108.87816846142353, + "pitch": 2.5275341250845176, + "yaw": 80.34469940091888 + } + }, + { + "id": "camera2", + "position_mm": [ + 405.9717408389173, + -421.95573056025347, + 872.4604195005218 + ], + "orientation_deg": { + "roll": -148.60881898727635, + "pitch": -0.029978265649823206, + "yaw": 22.488220616803055 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.42604064941406, + -165.41339111328125, + -15.145471572875977 + ], + "orientation_deg": { + "roll": -0.7406379814249779, + "pitch": 0.37985089540133943, + "yaw": 32.81478991375663 + } + }, + { + "id": 50, + "position_mm": [ + -0.8843511343002319, + 0.029944177716970444, + -0.35656803846359253 + ], + "orientation_deg": { + "roll": -0.46046337865993414, + "pitch": -0.7292156934030202, + "yaw": -0.1379321354402208 + } + }, + { + "id": 71, + "position_mm": [ + 139.916015625, + 0.032910484820604324, + -0.08406136929988861 + ], + "orientation_deg": { + "roll": -0.21456699848946073, + "pitch": -1.3728894168113193, + "yaw": -0.9772634345536703 + } + }, + { + "id": 76, + "position_mm": [ + -262.6636726143039, + 112.67967237631038, + -91.52679931575169 + ], + "orientation_deg": { + "roll": -80.38035613015047, + "pitch": 21.96932503799784, + "yaw": -122.95021912829023 + } + }, + { + "id": 101, + "position_mm": [ + -1.5652594566345215, + -80.25299835205078, + -0.6711070537567139 + ], + "orientation_deg": { + "roll": 0.8664693403908715, + "pitch": -0.5948530840944998, + "yaw": -1.244597155909977 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_annotated.jpg new file mode 100644 index 0000000..d661fbe Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_overlay.png new file mode 100644 index 0000000..71ad92a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979387494_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979423620.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979423620.jpg new file mode 100644 index 0000000..7fcb135 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979423620.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.csv new file mode 100644 index 0000000..79d5cb2 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.152,-162.344,205.771,-108.865,2.451,80.384 +camera2,409.575,-420.357,872.429,-148.628,0.189,22.536 +25,86.472,-165.385,-15.413,-0.675,0.338,32.854 +50,-0.888,0.030,-0.357,-0.383,-0.728,-0.100 +71,139.915,0.033,-0.084,-0.326,-1.206,-0.345 +76,-245.733,98.509,-65.821,-82.709,21.360,-124.111 +101,-1.571,-80.253,-0.672,1.483,-1.196,-1.125 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.json new file mode 100644 index 0000000..5bd0843 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:50:23", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353518758385848, + "rms_refs_px_cam2": 1.4957602781180475, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1518541849575, + -162.34393649614074, + 205.7706273981369 + ], + "orientation_deg": { + "roll": -108.86458750904792, + "pitch": 2.451055244583937, + "yaw": 80.38410468824381 + } + }, + { + "id": "camera2", + "position_mm": [ + 409.5751459779732, + -420.3569905095055, + 872.4292309300839 + ], + "orientation_deg": { + "roll": -148.62835287531212, + "pitch": 0.1892058498204359, + "yaw": 22.53585146314528 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.47209167480469, + -165.38522338867188, + -15.413246154785156 + ], + "orientation_deg": { + "roll": -0.6750622433486004, + "pitch": 0.33822031662755686, + "yaw": 32.85401626136167 + } + }, + { + "id": 50, + "position_mm": [ + -0.8875361084938049, + 0.030060553923249245, + -0.35676196217536926 + ], + "orientation_deg": { + "roll": -0.38278747059529405, + "pitch": -0.7284787654137013, + "yaw": -0.10010477791416736 + } + }, + { + "id": 71, + "position_mm": [ + 139.91543579101562, + 0.03272334486246109, + -0.08389882743358612 + ], + "orientation_deg": { + "roll": -0.3257685630080919, + "pitch": -1.2059176162434997, + "yaw": -0.34511433633455274 + } + }, + { + "id": 76, + "position_mm": [ + -245.7331194474962, + 98.50887259054191, + -65.8211834675414 + ], + "orientation_deg": { + "roll": -82.70901362583129, + "pitch": 21.36047320114761, + "yaw": -124.11138099270572 + } + }, + { + "id": 101, + "position_mm": [ + -1.5713545083999634, + -80.25341033935547, + -0.671654462814331 + ], + "orientation_deg": { + "roll": 1.482711617179783, + "pitch": -1.196480714724244, + "yaw": -1.1251337015601963 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_annotated.jpg new file mode 100644 index 0000000..26a2184 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_overlay.png new file mode 100644 index 0000000..1c96b2a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979423620_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979473565.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979473565.jpg new file mode 100644 index 0000000..847592f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979473565.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.csv new file mode 100644 index 0000000..4d9bdaa --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,406.328,-420.900,875.010,-148.738,0.023,22.441 +25,86.026,-165.529,-15.379,-0.750,0.389,32.855 +50,-0.886,0.029,-0.357,-0.473,-0.727,-0.098 +71,139.916,0.033,-0.084,-0.416,-1.205,-0.342 +76,-256.064,107.541,-82.170,-81.723,20.808,-122.751 +101,-1.565,-80.254,-0.670,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.json new file mode 100644 index 0000000..5fd7f4e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:51:13", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4931384551535318, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 406.32802383728773, + -420.8995292628549, + 875.0104299148135 + ], + "orientation_deg": { + "roll": -148.7376119236304, + "pitch": 0.02272775185817831, + "yaw": 22.44147822120346 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.02629852294922, + -165.5294189453125, + -15.378560066223145 + ], + "orientation_deg": { + "roll": -0.7499192939937913, + "pitch": 0.38874501362400343, + "yaw": 32.85498567276838 + } + }, + { + "id": 50, + "position_mm": [ + -0.8856806755065918, + 0.029255174100399017, + -0.35655614733695984 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91567993164062, + 0.03256473317742348, + -0.08397412300109863 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -256.0635423094547, + 107.54071962221478, + -82.16970079111996 + ], + "orientation_deg": { + "roll": -81.72321829912345, + "pitch": 20.807739165992363, + "yaw": -122.75126002176101 + } + }, + { + "id": 101, + "position_mm": [ + -1.5648744106292725, + -80.25413513183594, + -0.6698047518730164 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_annotated.jpg new file mode 100644 index 0000000..7c73692 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_overlay.png new file mode 100644 index 0000000..dcba85d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979473565_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979612483.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979612483.jpg new file mode 100644 index 0000000..1f4ac5d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979612483.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.csv new file mode 100644 index 0000000..4cd70ff --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,401.022,-424.419,873.903,-148.630,-0.309,22.332 +25,85.877,-165.446,-15.511,-0.338,-0.537,32.341 +50,-0.884,0.030,-0.357,-0.473,-0.727,-0.098 +71,139.916,0.033,-0.084,-0.416,-1.205,-0.342 +76,-244.864,99.861,-67.865,-82.413,21.776,-124.206 +101,-1.560,-80.253,-0.670,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.json new file mode 100644 index 0000000..678e315 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:53:32", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058826038, + "rms_refs_px_cam2": 1.496524980382731, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752434, + 205.98860705019186 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.5403854998735294, + "yaw": 80.384970419323 + } + }, + { + "id": "camera2", + "position_mm": [ + 401.02191385584763, + -424.4185395095302, + 873.9029754041527 + ], + "orientation_deg": { + "roll": -148.6298142495902, + "pitch": -0.3091031560162798, + "yaw": 22.33187057128552 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.87738037109375, + -165.44627380371094, + -15.511290550231934 + ], + "orientation_deg": { + "roll": -0.33803267118888586, + "pitch": -0.5373961790446242, + "yaw": 32.34116421486173 + } + }, + { + "id": 50, + "position_mm": [ + -0.8837301731109619, + 0.0297453161329031, + -0.35697343945503235 + ], + "orientation_deg": { + "roll": -0.4730902775008555, + "pitch": -0.7268008659703239, + "yaw": -0.09751368982894933 + } + }, + { + "id": 71, + "position_mm": [ + 139.91635131835938, + 0.03276587277650833, + -0.08401913940906525 + ], + "orientation_deg": { + "roll": -0.41609041234852523, + "pitch": -1.2046252614391746, + "yaw": -0.34177017054524156 + } + }, + { + "id": 76, + "position_mm": [ + -244.8635774424489, + 99.86128495454888, + -67.86511947541108 + ], + "orientation_deg": { + "roll": -82.41268366759759, + "pitch": 21.775647148414738, + "yaw": -124.20642976264583 + } + }, + { + "id": 101, + "position_mm": [ + -1.5600517988204956, + -80.25281524658203, + -0.6702276468276978 + ], + "orientation_deg": { + "roll": 0.8537984955837707, + "pitch": -0.5926825633642847, + "yaw": -1.204207836951622 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_annotated.jpg new file mode 100644 index 0000000..12861a7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_overlay.png new file mode 100644 index 0000000..4f24036 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979612483_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979663973.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979663973.jpg new file mode 100644 index 0000000..b0261b2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979663973.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.csv new file mode 100644 index 0000000..2dbef07 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.608,-163.821,205.689,-108.865,2.413,80.263 +camera2,404.298,-423.836,871.372,-148.523,-0.141,22.427 +25,86.218,-165.411,-15.422,-0.647,0.312,32.733 +50,-0.885,0.031,-0.357,-0.345,-0.735,-0.221 +71,139.916,0.034,-0.084,-1.098,-1.699,1.264 +76,-237.803,93.253,-55.775,-86.656,20.461,-125.666 +101,-1.565,-80.251,-0.672,1.521,-1.203,-1.247 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.json new file mode 100644 index 0000000..029df1a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:54:24", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1047223195358695, + "rms_refs_px_cam2": 1.4991458300325986, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.6076336095916, + -163.82067788294125, + 205.68927903010368 + ], + "orientation_deg": { + "roll": -108.86520788773284, + "pitch": 2.4125843097402044, + "yaw": 80.26332383883566 + } + }, + { + "id": "camera2", + "position_mm": [ + 404.2977300285423, + -423.8360285852627, + 871.3724070693338 + ], + "orientation_deg": { + "roll": -148.5233912315892, + "pitch": -0.1409518328601045, + "yaw": 22.42671719085975 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.21788787841797, + -165.41070556640625, + -15.422182083129883 + ], + "orientation_deg": { + "roll": -0.6471029475009771, + "pitch": 0.311787383636167, + "yaw": 32.73342033005578 + } + }, + { + "id": 50, + "position_mm": [ + -0.884934663772583, + 0.03142569214105606, + -0.357009619474411 + ], + "orientation_deg": { + "roll": -0.3449452453435258, + "pitch": -0.7354498985579441, + "yaw": -0.22134273272600405 + } + }, + { + "id": 71, + "position_mm": [ + 139.91627502441406, + 0.03351694718003273, + -0.08416899293661118 + ], + "orientation_deg": { + "roll": -1.0980338179244093, + "pitch": -1.6990368166487229, + "yaw": 1.2643371640968073 + } + }, + { + "id": 76, + "position_mm": [ + -237.80264027701247, + 93.25291361681987, + -55.774932431734925 + ], + "orientation_deg": { + "roll": -86.65645567769572, + "pitch": 20.460980982857503, + "yaw": -125.66644467230789 + } + }, + { + "id": 101, + "position_mm": [ + -1.5652331113815308, + -80.25052642822266, + -0.6716192960739136 + ], + "orientation_deg": { + "roll": 1.5206777456243747, + "pitch": -1.202773718175469, + "yaw": -1.2466830836453262 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_annotated.jpg new file mode 100644 index 0000000..48170d9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_overlay.png new file mode 100644 index 0000000..69fb4ac Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979663973_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979986834.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979986834.jpg new file mode 100644 index 0000000..a008bcc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979986834.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.csv new file mode 100644 index 0000000..e8ee438 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,400.822,-418.886,878.434,-149.019,-0.205,22.336 +25,85.592,-165.442,-15.670,0.034,-0.013,32.707 +50,-0.882,0.027,-0.355,-0.473,-0.727,-0.098 +71,139.917,0.032,-0.083,-0.416,-1.205,-0.342 +76,-244.243,98.785,-67.543,-82.126,21.474,-124.098 +101,-1.556,-80.258,-0.666,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.json new file mode 100644 index 0000000..b4867cc --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 13:59:47", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.494653661488378, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 400.8221911027453, + -418.8856366356949, + 878.4340411846117 + ], + "orientation_deg": { + "roll": -149.01879679885857, + "pitch": -0.20456352602768232, + "yaw": 22.33601553926593 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.59249114990234, + -165.44204711914062, + -15.66993236541748 + ], + "orientation_deg": { + "roll": 0.0337043726490696, + "pitch": -0.013382636070021754, + "yaw": 32.70703072633354 + } + }, + { + "id": 50, + "position_mm": [ + -0.8823606967926025, + 0.027041858062148094, + -0.35517656803131104 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91661071777344, + 0.031908322125673294, + -0.0834699496626854 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -244.24305687595626, + 98.78546544257871, + -67.5427041247284 + ], + "orientation_deg": { + "roll": -82.12590726661455, + "pitch": 21.473717351201895, + "yaw": -124.09834359844368 + } + }, + { + "id": 101, + "position_mm": [ + -1.555521845817566, + -80.25770568847656, + -0.6655595302581787 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_annotated.jpg new file mode 100644 index 0000000..e48085a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_overlay.png new file mode 100644 index 0000000..e3a64e6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765979986834_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980180276.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980180276.jpg new file mode 100644 index 0000000..7e96d92 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980180276.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.csv new file mode 100644 index 0000000..ba35e81 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,408.897,-413.631,873.964,-148.988,0.309,22.567 +25,85.869,-165.277,-15.498,-0.097,-0.410,32.184 +50,-0.887,0.027,-0.356,-0.473,-0.727,-0.098 +71,139.916,0.032,-0.083,-0.416,-1.205,-0.342 +76,-263.300,111.994,-92.498,-80.252,21.476,-122.823 +101,-1.570,-80.259,-0.669,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.json new file mode 100644 index 0000000..80cf48e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:03:00", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.500628359074336, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 408.8972366445136, + -413.63074962130264, + 873.9643461160174 + ], + "orientation_deg": { + "roll": -148.98751257429856, + "pitch": 0.30859978760395573, + "yaw": 22.567030041185536 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.86893463134766, + -165.27664184570312, + -15.498498916625977 + ], + "orientation_deg": { + "roll": -0.09656434453923476, + "pitch": -0.4099191103099073, + "yaw": 32.18427542523384 + } + }, + { + "id": 50, + "position_mm": [ + -0.8867223858833313, + 0.02736051380634308, + -0.35550299286842346 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.9160614013672, + 0.031885869801044464, + -0.08331634849309921 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -263.3002496865243, + 111.9935938940051, + -92.4979020408222 + ], + "orientation_deg": { + "roll": -80.25163651874392, + "pitch": 21.475620994729574, + "yaw": -122.82284790570084 + } + }, + { + "id": 101, + "position_mm": [ + -1.5704842805862427, + -80.25934600830078, + -0.6691275835037231 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_annotated.jpg new file mode 100644 index 0000000..f681ae8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_overlay.png new file mode 100644 index 0000000..d47e87c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980180276_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980184630.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980184630.jpg new file mode 100644 index 0000000..eda70bb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980184630.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.csv new file mode 100644 index 0000000..fd1a871 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,402.732,-419.209,877.279,-148.941,-0.090,22.325 +25,85.450,-165.500,-15.640,-0.616,0.135,32.170 +50,-0.884,0.028,-0.356,-0.473,-0.727,-0.098 +71,139.916,0.032,-0.084,-0.416,-1.205,-0.342 +76,-261.321,112.526,-91.468,-80.049,21.830,-122.990 +101,-1.560,-80.257,-0.667,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.json new file mode 100644 index 0000000..79f7edb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:03:04", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4954419209235128, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 402.73165716993907, + -419.2088887828551, + 877.2792517072108 + ], + "orientation_deg": { + "roll": -148.94105516518, + "pitch": -0.08951276809341838, + "yaw": 22.325420314117824 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.44984436035156, + -165.49989318847656, + -15.639813423156738 + ], + "orientation_deg": { + "roll": -0.6160596729147897, + "pitch": 0.13464455253681978, + "yaw": 32.17036267136837 + } + }, + { + "id": 50, + "position_mm": [ + -0.8844965100288391, + 0.02785586379468441, + -0.3559194505214691 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91622924804688, + 0.032118868082761765, + -0.0836484432220459 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -261.3212349761901, + 112.52610727989287, + -91.4680520993838 + ], + "orientation_deg": { + "roll": -80.04923725970639, + "pitch": 21.829547281227175, + "yaw": -122.98986521550958 + } + }, + { + "id": 101, + "position_mm": [ + -1.5600095987319946, + -80.25669860839844, + -0.6673087477684021 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_annotated.jpg new file mode 100644 index 0000000..d96657d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_overlay.png new file mode 100644 index 0000000..0fcc9ac Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980184630_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980205019.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980205019.jpg new file mode 100644 index 0000000..1087f1e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980205019.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.csv new file mode 100644 index 0000000..25e71b1 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,401.061,-421.122,876.085,-148.851,-0.192,22.269 +25,85.247,-165.416,-15.846,-0.113,0.219,33.381 +50,-0.883,0.029,-0.356,-0.473,-0.727,-0.098 +71,139.917,0.032,-0.084,-0.416,-1.205,-0.342 +76,-245.007,99.620,-67.679,-82.383,21.588,-124.323 +101,-1.558,-80.255,-0.668,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.json new file mode 100644 index 0000000..0aa161b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:03:25", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058826038, + "rms_refs_px_cam2": 1.4954242361356227, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752434, + 205.98860705019186 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.5403854998735294, + "yaw": 80.384970419323 + } + }, + { + "id": "camera2", + "position_mm": [ + 401.0610144503407, + -421.12186937469176, + 876.0847826329002 + ], + "orientation_deg": { + "roll": -148.8511244532498, + "pitch": -0.19194439640315938, + "yaw": 22.269239060062407 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.24683380126953, + -165.41636657714844, + -15.845930099487305 + ], + "orientation_deg": { + "roll": -0.11265912897392334, + "pitch": 0.21889798296835722, + "yaw": 33.38082509944973 + } + }, + { + "id": 50, + "position_mm": [ + -0.8834935426712036, + 0.028622059151530266, + -0.35601556301116943 + ], + "orientation_deg": { + "roll": -0.4730902775008555, + "pitch": -0.7268008659703239, + "yaw": -0.09751368982894933 + } + }, + { + "id": 71, + "position_mm": [ + 139.91651916503906, + 0.032394640147686005, + -0.08364447951316833 + ], + "orientation_deg": { + "roll": -0.41609041234852523, + "pitch": -1.2046252614391746, + "yaw": -0.34177017054524156 + } + }, + { + "id": 76, + "position_mm": [ + -245.00698067946692, + 99.61996819003804, + -67.67878163466511 + ], + "orientation_deg": { + "roll": -82.38334294169644, + "pitch": 21.588004490455535, + "yaw": -124.32287778076376 + } + }, + { + "id": 101, + "position_mm": [ + -1.5579978227615356, + -80.2550277709961, + -0.6675418615341187 + ], + "orientation_deg": { + "roll": 0.8537984955837707, + "pitch": -0.5926825633642847, + "yaw": -1.204207836951622 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_annotated.jpg new file mode 100644 index 0000000..00f5733 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_overlay.png new file mode 100644 index 0000000..527c3b8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980205019_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980305410.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980305410.jpg new file mode 100644 index 0000000..7320bcb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980305410.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.csv new file mode 100644 index 0000000..577859e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.003,-162.440,205.263,-108.845,2.523,80.342 +camera2,394.838,-429.991,874.466,-148.515,-0.649,21.992 +25,85.141,-165.601,-15.803,-0.582,0.147,32.126 +50,-0.888,0.032,-0.359,-0.620,-0.846,0.259 +71,139.916,0.034,-0.085,-0.869,-1.651,0.496 +76,-261.395,116.752,-93.989,-1.167,2.831,-107.910 +101,-1.560,-80.249,-0.672,0.876,-0.563,-1.249 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.json new file mode 100644 index 0000000..d39cfd2 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:05:05", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10473996800442288, + "rms_refs_px_cam2": 1.503084159168468, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.0026360469576, + -162.43953807250716, + 205.26288566001492 + ], + "orientation_deg": { + "roll": -108.84533976387718, + "pitch": 2.523176293370596, + "yaw": 80.34164617141832 + } + }, + { + "id": "camera2", + "position_mm": [ + 394.83765384655715, + -429.99139302129794, + 874.466294164263 + ], + "orientation_deg": { + "roll": -148.51486619243008, + "pitch": -0.6488387085210512, + "yaw": 21.99198155220545 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.14118194580078, + -165.60081481933594, + -15.803156852722168 + ], + "orientation_deg": { + "roll": -0.5815698009764485, + "pitch": 0.14741326129708182, + "yaw": 32.125686154219366 + } + }, + { + "id": 50, + "position_mm": [ + -0.8880972862243652, + 0.03191085159778595, + -0.3593723177909851 + ], + "orientation_deg": { + "roll": -0.6197498557015815, + "pitch": -0.845900151908839, + "yaw": 0.25901480554753487 + } + }, + { + "id": 71, + "position_mm": [ + 139.91607666015625, + 0.033720713108778, + -0.0847693383693695 + ], + "orientation_deg": { + "roll": -0.8691355668545409, + "pitch": -1.6511231101031163, + "yaw": 0.49608597870582244 + } + }, + { + "id": 76, + "position_mm": [ + -261.3952057443599, + 116.75202975005882, + -93.98911851024161 + ], + "orientation_deg": { + "roll": -1.1670468297815346, + "pitch": 2.830518970818272, + "yaw": -107.91001016746046 + } + }, + { + "id": 101, + "position_mm": [ + -1.5601330995559692, + -80.2494888305664, + -0.6717017292976379 + ], + "orientation_deg": { + "roll": 0.8755774604772073, + "pitch": -0.563046286217224, + "yaw": -1.2491888990528872 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_annotated.jpg new file mode 100644 index 0000000..ac1839c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_overlay.png new file mode 100644 index 0000000..c6c943e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980305410_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980351368.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980351368.jpg new file mode 100644 index 0000000..b0c8a32 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980351368.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.csv new file mode 100644 index 0000000..cac1498 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,655.971,-159.947,204.691,-108.811,2.583,80.539 +camera2,396.492,-428.105,875.628,-148.604,-0.539,22.054 +25,84.972,-165.426,-16.101,0.413,-0.070,32.014 +50,-0.887,0.029,-0.358,-0.834,-0.945,0.843 +71,139.916,0.033,-0.084,-0.447,-1.132,-0.190 +76,-243.854,100.973,-67.398,-82.400,22.014,-124.543 +101,-1.560,-80.254,-0.669,0.822,-0.520,-1.053 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.json new file mode 100644 index 0000000..fd89a2e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:05:51", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10357045066767606, + "rms_refs_px_cam2": 1.4996786332597782, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 655.9706058815526, + -159.94687863649887, + 204.69149712189545 + ], + "orientation_deg": { + "roll": -108.81097413996349, + "pitch": 2.582625442076755, + "yaw": 80.5393139437445 + } + }, + { + "id": "camera2", + "position_mm": [ + 396.49223792062105, + -428.1049596869546, + 875.6278859451019 + ], + "orientation_deg": { + "roll": -148.60353092055422, + "pitch": -0.5394377874434967, + "yaw": 22.053625589432347 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 84.97183227539062, + -165.42626953125, + -16.10089111328125 + ], + "orientation_deg": { + "roll": 0.41266621248270846, + "pitch": -0.0704016338136236, + "yaw": 32.01379540707346 + } + }, + { + "id": 50, + "position_mm": [ + -0.8872646689414978, + 0.029469069093465805, + -0.3578740358352661 + ], + "orientation_deg": { + "roll": -0.8336233253611195, + "pitch": -0.9454183502199326, + "yaw": 0.8430878647084477 + } + }, + { + "id": 71, + "position_mm": [ + 139.91583251953125, + 0.03273714333772659, + -0.08428692072629929 + ], + "orientation_deg": { + "roll": -0.44701651399244463, + "pitch": -1.131859394225994, + "yaw": -0.1897860041735158 + } + }, + { + "id": 76, + "position_mm": [ + -243.85375723306478, + 100.973430353139, + -67.39843640416233 + ], + "orientation_deg": { + "roll": -82.39989606375987, + "pitch": 22.014402565146668, + "yaw": -124.54305864585757 + } + }, + { + "id": 101, + "position_mm": [ + -1.5598984956741333, + -80.25361633300781, + -0.6694598197937012 + ], + "orientation_deg": { + "roll": 0.821785355395858, + "pitch": -0.520390425616541, + "yaw": -1.0525432487634143 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_annotated.jpg new file mode 100644 index 0000000..c4ce044 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_overlay.png new file mode 100644 index 0000000..72ff510 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980351368_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980403972.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980403972.jpg new file mode 100644 index 0000000..c288ff8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980403972.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.csv new file mode 100644 index 0000000..c27a26e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.290,-161.497,206.014,-108.878,2.553,80.425 +camera2,388.057,-431.266,879.383,-148.719,-0.996,21.799 +25,84.466,-165.836,-16.139,-0.759,0.398,32.895 +50,-0.884,0.030,-0.359,-0.486,-0.724,-0.057 +71,139.917,0.033,-0.084,-0.592,-1.368,0.005 +76,-242.224,101.692,-68.228,-82.024,22.331,-124.657 +101,-1.547,-80.251,-0.668,0.841,-0.590,-1.164 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.json new file mode 100644 index 0000000..8bed7da --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:06:44", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10314231132713693, + "rms_refs_px_cam2": 1.497849971915959, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.2896277448374, + -161.49680135448878, + 206.0141381748751 + ], + "orientation_deg": { + "roll": -108.87756174705864, + "pitch": 2.553238447878135, + "yaw": 80.42524903597865 + } + }, + { + "id": "camera2", + "position_mm": [ + 388.0572725302585, + -431.2656769092566, + 879.3830895013897 + ], + "orientation_deg": { + "roll": -148.71899357878215, + "pitch": -0.9957260295457998, + "yaw": 21.799475153526892 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 84.46559143066406, + -165.83641052246094, + -16.139022827148438 + ], + "orientation_deg": { + "roll": -0.7591894552173374, + "pitch": 0.39765365518219603, + "yaw": 32.895186786143796 + } + }, + { + "id": 50, + "position_mm": [ + -0.8844746947288513, + 0.029942471534013748, + -0.35882073640823364 + ], + "orientation_deg": { + "roll": -0.48571569455718167, + "pitch": -0.7243677316502912, + "yaw": -0.057089077405168075 + } + }, + { + "id": 71, + "position_mm": [ + 139.9166717529297, + 0.0327073372900486, + -0.08427225798368454 + ], + "orientation_deg": { + "roll": -0.5923462530765657, + "pitch": -1.3683553550729735, + "yaw": 0.004526389837570287 + } + }, + { + "id": 76, + "position_mm": [ + -242.2238543823723, + 101.69211032927922, + -68.22826492610324 + ], + "orientation_deg": { + "roll": -82.02413924867868, + "pitch": 22.33133467435325, + "yaw": -124.65694341183115 + } + }, + { + "id": 101, + "position_mm": [ + -1.5474358797073364, + -80.25127410888672, + -0.6679258346557617 + ], + "orientation_deg": { + "roll": 0.8411287757464803, + "pitch": -0.5904937171093764, + "yaw": -1.1638122918819904 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_annotated.jpg new file mode 100644 index 0000000..41d382e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_overlay.png new file mode 100644 index 0000000..d545724 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980403972_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980539344.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980539344.jpg new file mode 100644 index 0000000..c9249f7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980539344.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.csv new file mode 100644 index 0000000..4d33012 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.566,-163.467,205.910,-108.879,2.502,80.264 +camera2,400.212,-412.004,879.967,-149.394,-0.081,22.371 +25,85.380,-165.398,-15.637,0.062,-0.040,32.586 +50,-0.881,0.026,-0.353,-0.435,-0.734,-0.219 +71,139.918,0.032,-0.083,-0.854,-1.688,0.420 +76,-233.681,89.826,-53.375,-82.623,21.728,-125.231 +101,-1.552,-80.261,-0.661,0.892,-0.599,-1.325 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.json new file mode 100644 index 0000000..c370ee4 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:08:59", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1047218084009319, + "rms_refs_px_cam2": 1.498728837463055, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.5662013501304, + -163.46706493398216, + 205.9099946362136 + ], + "orientation_deg": { + "roll": -108.87869927249052, + "pitch": 2.5018378536570323, + "yaw": 80.26418393527955 + } + }, + { + "id": "camera2", + "position_mm": [ + 400.21163421534334, + -412.0039290920886, + 879.9672133234423 + ], + "orientation_deg": { + "roll": -149.3935486757726, + "pitch": -0.08080503873011964, + "yaw": 22.371351447634357 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.38034057617188, + -165.3982391357422, + -15.636764526367188 + ], + "orientation_deg": { + "roll": 0.06165046768857214, + "pitch": -0.039946075849681274, + "yaw": 32.586267527497014 + } + }, + { + "id": 50, + "position_mm": [ + -0.8806939125061035, + 0.0255422405898571, + -0.35317686200141907 + ], + "orientation_deg": { + "roll": -0.4352064147948927, + "pitch": -0.7339874186860661, + "yaw": -0.2187468052744248 + } + }, + { + "id": 71, + "position_mm": [ + 139.9176025390625, + 0.03172346577048302, + -0.08282002061605453 + ], + "orientation_deg": { + "roll": -0.8540009699523268, + "pitch": -1.687690658466286, + "yaw": 0.41964522999376647 + } + }, + { + "id": 76, + "position_mm": [ + -233.68108757123196, + 89.8256008134266, + -53.37456435112764 + ], + "orientation_deg": { + "roll": -82.62281175614116, + "pitch": 21.72833387716138, + "yaw": -125.23144131994759 + } + }, + { + "id": 101, + "position_mm": [ + -1.5524524450302124, + -80.26133728027344, + -0.6613253355026245 + ], + "orientation_deg": { + "roll": 0.8918130679867812, + "pitch": -0.5991361653788677, + "yaw": -1.3253533967175322 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_annotated.jpg new file mode 100644 index 0000000..f61b7fb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_overlay.png new file mode 100644 index 0000000..3b8a012 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980539344_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980569984.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980569984.jpg new file mode 100644 index 0000000..05aba47 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980569984.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.csv new file mode 100644 index 0000000..cc7e939 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,406.022,-418.671,874.703,-148.832,0.079,22.420 +25,85.800,-165.418,-15.473,-0.500,0.537,32.698 +50,-0.887,0.029,-0.357,-0.473,-0.727,-0.098 +71,139.916,0.032,-0.084,-0.416,-1.205,-0.342 +76,-245.297,99.120,-66.913,-82.462,21.340,-124.137 +101,-1.567,-80.256,-0.670,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.json new file mode 100644 index 0000000..9088c0b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:09:30", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.4980626386405396, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 406.02226089483696, + -418.6712552660541, + 874.702961748364 + ], + "orientation_deg": { + "roll": -148.8316709719182, + "pitch": 0.07911041389364122, + "yaw": 22.41989560557773 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.79994201660156, + -165.41830444335938, + -15.473142623901367 + ], + "orientation_deg": { + "roll": -0.4998197265414741, + "pitch": 0.5373012621566272, + "yaw": 32.69800637401363 + } + }, + { + "id": 50, + "position_mm": [ + -0.8867393732070923, + 0.028607768937945366, + -0.3566032350063324 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.9158477783203, + 0.032305534929037094, + -0.08378536999225616 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -245.29719972871422, + 99.11987244897152, + -66.91259409991245 + ], + "orientation_deg": { + "roll": -82.46169506498732, + "pitch": 21.340471538342243, + "yaw": -124.13681893807534 + } + }, + { + "id": 101, + "position_mm": [ + -1.5671815872192383, + -80.25617980957031, + -0.6699967980384827 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_annotated.jpg new file mode 100644 index 0000000..14684fb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_overlay.png new file mode 100644 index 0000000..12e9c5b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980569984_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980901068.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980901068.jpg new file mode 100644 index 0000000..03b6bf5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980901068.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.csv new file mode 100644 index 0000000..f6fe0e7 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.374,-163.961,205.883,-108.880,2.486,80.214 +camera2,403.135,-415.019,875.566,-149.037,-0.068,22.509 +25,85.911,-165.238,-15.388,0.073,-0.051,32.536 +50,-0.887,0.027,-0.357,-0.249,-0.913,-0.964 +71,139.916,0.032,-0.084,-0.838,-1.691,0.369 +76,-246.053,99.134,-69.303,0.855,1.361,-106.652 +101,-1.569,-80.261,-0.670,1.120,-0.468,-1.870 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.json new file mode 100644 index 0000000..cd2d14e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:15:01", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10470444154512791, + "rms_refs_px_cam2": 1.5117158748544892, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.3742058152818, + -163.96146853159263, + 205.88282738680553 + ], + "orientation_deg": { + "roll": -108.87954389968016, + "pitch": 2.485936522198699, + "yaw": 80.21420245249449 + } + }, + { + "id": "camera2", + "position_mm": [ + 403.1352081976637, + -415.01910782595536, + 875.5658512547625 + ], + "orientation_deg": { + "roll": -149.03738895089663, + "pitch": -0.06763857015437422, + "yaw": 22.50909781133314 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.91093444824219, + -165.2383270263672, + -15.387611389160156 + ], + "orientation_deg": { + "roll": 0.07283931518706545, + "pitch": -0.05127630788240295, + "yaw": 32.53631388975194 + } + }, + { + "id": 50, + "position_mm": [ + -0.887089729309082, + 0.02691514417529106, + -0.35678625106811523 + ], + "orientation_deg": { + "roll": -0.2489849258628278, + "pitch": -0.9129397394588651, + "yaw": -0.9639371995105751 + } + }, + { + "id": 71, + "position_mm": [ + 139.91641235351562, + 0.031903062015771866, + -0.08380557596683502 + ], + "orientation_deg": { + "roll": -0.8384907924978738, + "pitch": -1.6913249253490417, + "yaw": 0.36924320962655793 + } + }, + { + "id": 76, + "position_mm": [ + -246.05295786036697, + 99.13392592804621, + -69.3028493990564 + ], + "orientation_deg": { + "roll": 0.8547595646452077, + "pitch": 1.360885695684419, + "yaw": -106.65170294205193 + } + }, + { + "id": 101, + "position_mm": [ + -1.5687179565429688, + -80.26070404052734, + -0.670390784740448 + ], + "orientation_deg": { + "roll": 1.1197133546107012, + "pitch": -0.46754437523895953, + "yaw": -1.8704866577937547 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_annotated.jpg new file mode 100644 index 0000000..67cf0eb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_overlay.png new file mode 100644 index 0000000..a765d85 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765980901068_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981040869.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981040869.jpg new file mode 100644 index 0000000..6d75787 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981040869.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.csv new file mode 100644 index 0000000..0dbe025 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,391.850,-423.184,880.046,-148.999,-0.745,22.114 +25,84.906,-165.458,-15.890,-0.226,-0.156,32.867 +50,-0.883,0.026,-0.357,-0.473,-0.727,-0.098 +71,139.917,0.032,-0.084,-0.416,-1.205,-0.342 +76,-266.497,119.614,-103.512,-2.377,2.212,-106.753 +101,-1.551,-80.259,-0.667,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.json new file mode 100644 index 0000000..49781d9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:17:21", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.5038758118993447, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 391.8502566523764, + -423.1840730268623, + 880.0464063751618 + ], + "orientation_deg": { + "roll": -148.99922962278575, + "pitch": -0.7447827472768946, + "yaw": 22.114486683205133 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 84.9063491821289, + -165.45848083496094, + -15.889650344848633 + ], + "orientation_deg": { + "roll": -0.22552596082693432, + "pitch": -0.1555341972251732, + "yaw": 32.86746639452312 + } + }, + { + "id": 50, + "position_mm": [ + -0.8825950026512146, + 0.026391368359327316, + -0.356945276260376 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.9169464111328, + 0.031658366322517395, + -0.08387154340744019 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -266.49737709603215, + 119.61353903543277, + -103.51213931223569 + ], + "orientation_deg": { + "roll": -2.3770366629355357, + "pitch": 2.212173477457601, + "yaw": -106.7532985815327 + } + }, + { + "id": 101, + "position_mm": [ + -1.5509835481643677, + -80.25885772705078, + -0.6668829917907715 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_annotated.jpg new file mode 100644 index 0000000..94626a6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_overlay.png new file mode 100644 index 0000000..cd0c867 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981040869_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981169256.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981169256.jpg new file mode 100644 index 0000000..e47b6b2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981169256.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.csv new file mode 100644 index 0000000..9c8b941 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.110,-161.990,205.989,-108.878,2.540,80.385 +camera2,381.230,-426.132,884.885,-149.189,-1.332,21.870 +25,84.496,-165.612,-16.108,-0.226,-0.156,32.867 +50,-0.877,0.025,-0.356,-0.473,-0.727,-0.098 +71,139.918,0.031,-0.084,-0.416,-1.205,-0.342 +76,-258.657,115.821,-97.107,-0.209,2.751,-107.997 +101,-1.534,-80.259,-0.662,0.854,-0.593,-1.204 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.json new file mode 100644 index 0000000..cb2c292 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:19:29", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10353467058818223, + "rms_refs_px_cam2": 1.501241552277118, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.1097075975559, + -161.98988993752445, + 205.98860705019194 + ], + "orientation_deg": { + "roll": -108.8778742476637, + "pitch": 2.540385499873529, + "yaw": 80.38497041932298 + } + }, + { + "id": "camera2", + "position_mm": [ + 381.22991511324875, + -426.1319388603484, + 884.8850726106757 + ], + "orientation_deg": { + "roll": -149.18943954134048, + "pitch": -1.331864410931766, + "yaw": 21.86954303963799 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 84.49616241455078, + -165.61181640625, + -16.10823631286621 + ], + "orientation_deg": { + "roll": -0.22552596082693432, + "pitch": -0.1555341972251732, + "yaw": 32.86746639452312 + } + }, + { + "id": 50, + "position_mm": [ + -0.8774264454841614, + 0.02505979873239994, + -0.3559706509113312 + ], + "orientation_deg": { + "roll": -0.47309027750085625, + "pitch": -0.7268008659703271, + "yaw": -0.09751368982895726 + } + }, + { + "id": 71, + "position_mm": [ + 139.91806030273438, + 0.03135458379983902, + -0.08362948894500732 + ], + "orientation_deg": { + "roll": -0.4160904123485259, + "pitch": -1.2046252614391775, + "yaw": -0.34177017054524955 + } + }, + { + "id": 76, + "position_mm": [ + -258.65659453329346, + 115.82064580196216, + -97.10702177672937 + ], + "orientation_deg": { + "roll": -0.20930229120339292, + "pitch": 2.7509450189520197, + "yaw": -107.99747641403283 + } + }, + { + "id": 101, + "position_mm": [ + -1.533939242362976, + -80.2593994140625, + -0.6616575717926025 + ], + "orientation_deg": { + "roll": 0.8537984955837697, + "pitch": -0.5926825633642909, + "yaw": -1.2042078369516316 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_annotated.jpg new file mode 100644 index 0000000..7c06974 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_overlay.png new file mode 100644 index 0000000..cd0c867 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981169256_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981186514.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981186514.jpg new file mode 100644 index 0000000..1281395 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981186514.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.csv new file mode 100644 index 0000000..384fe8a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,656.375,-160.969,205.837,-108.888,2.551,80.451 +camera2,383.908,-430.861,881.724,-148.850,-1.255,21.808 +25,84.481,-165.428,-16.129,-0.386,0.275,32.075 +50,-0.882,0.028,-0.359,-0.486,-0.735,-0.031 +71,139.917,0.032,-0.084,-0.054,-1.874,-0.007 +76,-258.848,116.583,-95.335,-0.486,2.962,-108.065 +101,-1.543,-80.255,-0.667,1.054,-0.467,-1.633 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.json new file mode 100644 index 0000000..8ece677 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:19:46", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10323081018486917, + "rms_refs_px_cam2": 1.5012882871732212, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 656.3753878404416, + -160.9692413612105, + 205.8365912335906 + ], + "orientation_deg": { + "roll": -108.88790489585088, + "pitch": 2.5513109119441495, + "yaw": 80.45054610598149 + } + }, + { + "id": "camera2", + "position_mm": [ + 383.9078901230887, + -430.86113128631496, + 881.7243312499074 + ], + "orientation_deg": { + "roll": -148.85023977421008, + "pitch": -1.2547944881189836, + "yaw": 21.80826207467175 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 84.48094940185547, + -165.4276123046875, + -16.129226684570312 + ], + "orientation_deg": { + "roll": -0.3860930018816559, + "pitch": 0.2750031723448617, + "yaw": 32.07495113396037 + } + }, + { + "id": 50, + "position_mm": [ + -0.8824436664581299, + 0.027733569964766502, + -0.35865268111228943 + ], + "orientation_deg": { + "roll": -0.4855232781357615, + "pitch": -0.7348771065631313, + "yaw": -0.031333868253007366 + } + }, + { + "id": 71, + "position_mm": [ + 139.9169921875, + 0.03204387426376343, + -0.08434148132801056 + ], + "orientation_deg": { + "roll": -0.05388393616219064, + "pitch": -1.8740209577044467, + "yaw": -0.006980379882228693 + } + }, + { + "id": 76, + "position_mm": [ + -258.84849820034503, + 116.58296531967771, + -95.33503698204349 + ], + "orientation_deg": { + "roll": -0.4861854394318444, + "pitch": 2.961809456083783, + "yaw": -108.06489913783622 + } + }, + { + "id": 101, + "position_mm": [ + -1.5429656505584717, + -80.25506591796875, + -0.6671175956726074 + ], + "orientation_deg": { + "roll": 1.0538093472619159, + "pitch": -0.46681453697329856, + "yaw": -1.633238224121325 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_annotated.jpg new file mode 100644 index 0000000..0e913da Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_overlay.png new file mode 100644 index 0000000..e183032 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765981186514_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982285131.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982285131.jpg new file mode 100644 index 0000000..e84d6ae Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982285131.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.csv new file mode 100644 index 0000000..aa58118 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.858,-162.525,206.666,-108.911,2.532,80.348 +camera2,331.292,-396.049,843.941,-139.098,-1.505,53.406 +25,80.384,-165.594,-17.670,154.835,34.225,140.233 +50,0.587,-0.233,0.145,-0.299,-0.937,-0.828 +71,143.656,-1.309,1.345,-0.577,-1.405,-0.072 +76,-270.542,121.240,-106.623,-8.213,2.395,-105.153 +101,0.817,-80.370,0.154,0.857,-0.627,-1.240 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.json new file mode 100644 index 0000000..b932057 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:38:05", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10312388094003495, + "rms_refs_px_cam2": 3.4091090732358307, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.8582387612205, + -162.52469757845313, + 206.6660099218064 + ], + "orientation_deg": { + "roll": -108.91110630232083, + "pitch": 2.531933243475713, + "yaw": 80.34782599321466 + } + }, + { + "id": "camera2", + "position_mm": [ + 331.29224268591304, + -396.04936848472653, + 843.9408091515312 + ], + "orientation_deg": { + "roll": -139.09834237920896, + "pitch": -1.504781149312902, + "yaw": 53.405566525591986 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 80.38442374195742, + -165.59439173168775, + -17.66955581053034 + ], + "orientation_deg": { + "roll": 154.83500288376072, + "pitch": 34.22483428834232, + "yaw": 140.23289425895962 + } + }, + { + "id": 50, + "position_mm": [ + 0.5868974328041077, + -0.23316505551338196, + 0.14529231190681458 + ], + "orientation_deg": { + "roll": -0.2992803779536093, + "pitch": -0.9370437101860315, + "yaw": -0.8281200665590198 + } + }, + { + "id": 71, + "position_mm": [ + 143.65597534179688, + -1.3087575435638428, + 1.3447026014328003 + ], + "orientation_deg": { + "roll": -0.5769106839185317, + "pitch": -1.40494520613725, + "yaw": -0.07178208083644935 + } + }, + { + "id": 76, + "position_mm": [ + -270.5423503466479, + 121.24013357730806, + -106.62331780105715 + ], + "orientation_deg": { + "roll": -8.212632655345013, + "pitch": 2.3951400271898007, + "yaw": -105.15321148451883 + } + }, + { + "id": 101, + "position_mm": [ + 0.8168091177940369, + -80.36953735351562, + 0.15403491258621216 + ], + "orientation_deg": { + "roll": 0.8573035303257104, + "pitch": -0.62676135153798, + "yaw": -1.2399190473190551 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_annotated.jpg new file mode 100644 index 0000000..dc5197c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_overlay.png new file mode 100644 index 0000000..61d4e4d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982285131_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982297163.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982297163.jpg new file mode 100644 index 0000000..eea6206 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982297163.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.csv new file mode 100644 index 0000000..3e27522 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.858,-162.525,206.666,-108.911,2.532,80.348 +camera2,237.830,-380.302,858.613,-147.768,-1.530,25.791 +25,86.601,-165.481,-15.184,-0.242,-0.186,32.832 +50,-0.048,-0.052,-0.044,-0.299,-0.937,-0.828 +71,140.106,-0.072,-0.024,-0.577,-1.405,-0.072 +76,-243.537,105.119,-80.246,-65.911,26.492,-121.570 +101,-0.164,-80.272,-0.155,0.857,-0.627,-1.240 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.json new file mode 100644 index 0000000..9d6a0bb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:38:17", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10312388094014413, + "rms_refs_px_cam2": 0.6236131242428091, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.8582387612204, + -162.5246975784529, + 206.66600992180682 + ], + "orientation_deg": { + "roll": -108.91110630232086, + "pitch": 2.531933243475726, + "yaw": 80.34782599321468 + } + }, + { + "id": "camera2", + "position_mm": [ + 237.8304925556231, + -380.30215719153216, + 858.6125067692692 + ], + "orientation_deg": { + "roll": -147.767683914076, + "pitch": -1.5295486666100127, + "yaw": 25.7913524137018 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.60076904296875, + -165.48101806640625, + -15.183961868286133 + ], + "orientation_deg": { + "roll": -0.24171481214180635, + "pitch": -0.1857264330462992, + "yaw": 32.83184069414053 + } + }, + { + "id": 50, + "position_mm": [ + -0.04816434904932976, + -0.052262961864471436, + -0.04368116706609726 + ], + "orientation_deg": { + "roll": -0.2992803779536264, + "pitch": -0.9370437101860569, + "yaw": -0.8281200665590154 + } + }, + { + "id": 71, + "position_mm": [ + 140.10589599609375, + -0.07167062163352966, + -0.023675216361880302 + ], + "orientation_deg": { + "roll": -0.5769106839185499, + "pitch": -1.4049452061372787, + "yaw": -0.0717820808364446 + } + }, + { + "id": 76, + "position_mm": [ + -243.5369981575593, + 105.1194008963044, + -80.2459803542237 + ], + "orientation_deg": { + "roll": -65.91147625752627, + "pitch": 26.492286114261592, + "yaw": -121.57038090901865 + } + }, + { + "id": 101, + "position_mm": [ + -0.16432878375053406, + -80.27195739746094, + -0.1551155000925064 + ], + "orientation_deg": { + "roll": 0.8573035303256928, + "pitch": -0.6267613515380054, + "yaw": -1.2399190473190507 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_annotated.jpg new file mode 100644 index 0000000..2274202 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_overlay.png new file mode 100644 index 0000000..e39dc60 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982297163_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982335864.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982335864.jpg new file mode 100644 index 0000000..bb8ee46 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982335864.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.csv new file mode 100644 index 0000000..006211e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,657.858,-162.525,206.666,-108.911,2.532,80.348 +camera2,233.953,-377.362,861.443,-148.075,-1.628,25.702 +25,86.298,-165.558,-15.216,-0.766,0.359,32.819 +50,-0.048,-0.053,-0.043,-0.299,-0.937,-0.828 +71,140.106,-0.072,-0.023,-0.577,-1.405,-0.072 +76,-242.943,105.042,-81.245,-65.564,26.409,-121.513 +101,-0.163,-80.273,-0.153,0.857,-0.627,-1.240 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.json new file mode 100644 index 0000000..c10f4f9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:38:56", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.10312388094014413, + "rms_refs_px_cam2": 0.6238313205076397, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 657.8582387612204, + -162.5246975784529, + 206.66600992180682 + ], + "orientation_deg": { + "roll": -108.91110630232086, + "pitch": 2.531933243475726, + "yaw": 80.34782599321468 + } + }, + { + "id": "camera2", + "position_mm": [ + 233.9533008967407, + -377.362257399947, + 861.4425770036903 + ], + "orientation_deg": { + "roll": -148.07463767208142, + "pitch": -1.628053516366978, + "yaw": 25.70201454421239 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.29761505126953, + -165.55772399902344, + -15.216022491455078 + ], + "orientation_deg": { + "roll": -0.7661017999648585, + "pitch": 0.3585492304115554, + "yaw": 32.81920622966542 + } + }, + { + "id": 50, + "position_mm": [ + -0.04786188527941704, + -0.05254834145307541, + -0.043247636407613754 + ], + "orientation_deg": { + "roll": -0.2992803779536264, + "pitch": -0.9370437101860569, + "yaw": -0.8281200665590154 + } + }, + { + "id": 71, + "position_mm": [ + 140.10617065429688, + -0.07203495502471924, + -0.023113617673516273 + ], + "orientation_deg": { + "roll": -0.5769106839185499, + "pitch": -1.4049452061372787, + "yaw": -0.0717820808364446 + } + }, + { + "id": 76, + "position_mm": [ + -242.94284547833678, + 105.04171052069422, + -81.24532804376716 + ], + "orientation_deg": { + "roll": -65.56365928955863, + "pitch": 26.40935014731267, + "yaw": -121.51324758469043 + } + }, + { + "id": 101, + "position_mm": [ + -0.1629466414451599, + -80.27310943603516, + -0.15339645743370056 + ], + "orientation_deg": { + "roll": 0.8573035303256928, + "pitch": -0.6267613515380054, + "yaw": -1.2399190473190507 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_annotated.jpg new file mode 100644 index 0000000..701cfbf Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_overlay.png new file mode 100644 index 0000000..50592e4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982335864_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982346945.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982346945.jpg new file mode 100644 index 0000000..8557c93 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982346945.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982356361.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982356361.jpg new file mode 100644 index 0000000..775af0b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982356361.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.csv new file mode 100644 index 0000000..734cb1d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera1,669.411,-155.709,208.255,-109.122,2.489,78.064 +camera2,247.384,-362.314,874.109,-148.772,-2.716,18.514 +25,85.788,-166.436,-15.350,154.928,34.024,139.968 +50,-0.444,-0.158,-0.228,-0.470,-1.001,0.014 +71,140.003,-0.108,-0.049,-0.595,-2.094,-0.325 +76,-244.073,104.729,-85.617,-2.152,6.215,-106.262 +101,-0.993,-80.602,-0.548,174.994,33.674,165.792 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.json new file mode 100644 index 0000000..370759e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:39:16", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028160531041196205, + "rms_refs_px_cam2": 1.713305518018814, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 669.4110681377601, + -155.70903220395354, + 208.2551352622202 + ], + "orientation_deg": { + "roll": -109.12181990698049, + "pitch": 2.4888060494924478, + "yaw": 78.06379631236706 + } + }, + { + "id": "camera2", + "position_mm": [ + 247.38402127252985, + -362.31401292454984, + 874.1087327481491 + ], + "orientation_deg": { + "roll": -148.77161390243043, + "pitch": -2.716120289443854, + "yaw": 18.514334322146507 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.78807830810547, + -166.43634033203125, + -15.350037574768066 + ], + "orientation_deg": { + "roll": 154.9279560734194, + "pitch": 34.02352822218062, + "yaw": 139.96834030876997 + } + }, + { + "id": 50, + "position_mm": [ + -0.443737655878067, + -0.15799662470817566, + -0.22829534113407135 + ], + "orientation_deg": { + "roll": -0.47048705505750094, + "pitch": -1.001304361044609, + "yaw": 0.0144415812186396 + } + }, + { + "id": 71, + "position_mm": [ + 140.00320434570312, + -0.10813112556934357, + -0.04866231605410576 + ], + "orientation_deg": { + "roll": -0.5952003155123011, + "pitch": -2.093577792492869, + "yaw": -0.3251166278212067 + } + }, + { + "id": 76, + "position_mm": [ + -244.07298520422864, + 104.72931400814711, + -85.6171447553673 + ], + "orientation_deg": { + "roll": -2.1523075775492013, + "pitch": 6.215309328191616, + "yaw": -106.26221889629241 + } + }, + { + "id": 101, + "position_mm": [ + -0.9927346706390381, + -80.60174560546875, + -0.54754638671875 + ], + "orientation_deg": { + "roll": 174.99406591247197, + "pitch": 33.67428953267793, + "yaw": 165.79231039496798 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_annotated.jpg new file mode 100644 index 0000000..1ac7602 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_overlay.png new file mode 100644 index 0000000..f5155c0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982356361_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982577214.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982577214.jpg new file mode 100644 index 0000000..27ffc3f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982577214.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.csv new file mode 100644 index 0000000..5af1dc0 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,669.63,-156.89,209.65,-109.217,2.535,77.944 +camera 1,247.37,-359.85,873.90,-148.905,-2.660,18.504 +25,85.767,-166.787,-14.960,0.375,-0.714,30.279 +50,-0.444,-0.158,-0.228,-0.352,-1.265,-0.827 +71,140.003,-0.108,-0.048,-0.342,-1.517,0.137 +76,-249.057,109.914,-96.879,-63.064,25.580,-119.376 +101,-0.993,-80.602,-0.547,1.529,-1.247,-1.254 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.json new file mode 100644 index 0000000..f71294d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:42:57", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02828368083708748, + "rms_refs_px_cam2": 1.7158242441351332, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 669.6257402092933, + -156.8878132999455, + 209.65210465373272 + ], + "orientation_deg": { + "roll": -109.21688451048371, + "pitch": 2.5347008301028904, + "yaw": 77.9443739125323 + } + }, + { + "id": "camera2", + "position_mm": [ + 247.36776211434957, + -359.84872623725937, + 873.8973548327978 + ], + "orientation_deg": { + "roll": -148.90542514807717, + "pitch": -2.659869251191552, + "yaw": 18.503880824316436 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.76654815673828, + -166.78660583496094, + -14.960233688354492 + ], + "orientation_deg": { + "roll": 0.374821497294804, + "pitch": -0.7139376423891195, + "yaw": 30.278816278757827 + } + }, + { + "id": 50, + "position_mm": [ + -0.4440278112888336, + -0.1576424390077591, + -0.22830656170845032 + ], + "orientation_deg": { + "roll": -0.3521922301993774, + "pitch": -1.265298828085867, + "yaw": -0.8273074422842888 + } + }, + { + "id": 71, + "position_mm": [ + 140.0033416748047, + -0.1077849343419075, + -0.048079777508974075 + ], + "orientation_deg": { + "roll": -0.3419157773389505, + "pitch": -1.5165235774214962, + "yaw": 0.13748015583606715 + } + }, + { + "id": 76, + "position_mm": [ + -249.05719846465985, + 109.91382372589092, + -96.87904295735417 + ], + "orientation_deg": { + "roll": -63.063569524222395, + "pitch": 25.579651031190995, + "yaw": -119.37591627524188 + } + }, + { + "id": 101, + "position_mm": [ + -0.9932578802108765, + -80.6019287109375, + -0.5472890734672546 + ], + "orientation_deg": { + "roll": 1.5288210573419594, + "pitch": -1.2470274620618738, + "yaw": -1.2544770090389683 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_annotated.jpg new file mode 100644 index 0000000..d051fd8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_overlay.png new file mode 100644 index 0000000..1908808 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982577214_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982614665.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982614665.jpg new file mode 100644 index 0000000..051dfc7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982614665.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.csv new file mode 100644 index 0000000..6088278 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.csv @@ -0,0 +1,9 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.04,-155.86,208.25,-109.150,2.548,78.007 +camera 1,248.92,-354.94,875.25,-149.168,-2.477,18.552 +25,85.64,-166.41,-15.08,0.294,-0.412,30.983 +50,-0.44,-0.16,-0.23,-0.830,-0.950,1.016 +71,140.00,-0.11,-0.05,-0.163,-1.291,-0.122 +76,-239.84,100.47,-78.73,-66.435,24.986,-117.547 +101,-0.99,-80.61,-0.54,1.286,-1.301,-0.664 +128,57.20,-110.14,344.08,10.048,-6.891,21.335 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.json new file mode 100644 index 0000000..c8c428b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam.json @@ -0,0 +1,123 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:43:35", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028400930233849448, + "rms_refs_px_cam2": 1.717865125038411, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.041884645862, + -155.85789645278658, + 208.25031945527604 + ], + "orientation_deg": { + "roll": -109.15041691608675, + "pitch": 2.5482091810235223, + "yaw": 78.00668092145145 + } + }, + { + "id": "camera2", + "position_mm": [ + 248.91865792649648, + -354.9433643207238, + 875.2505470149903 + ], + "orientation_deg": { + "roll": -149.16770206333888, + "pitch": -2.477388125174754, + "yaw": 18.552316659967406 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.64376831054688, + -166.4104461669922, + -15.076796531677246 + ], + "orientation_deg": { + "roll": 0.29437640678931765, + "pitch": -0.41238042775186573, + "yaw": 30.98331457951088 + } + }, + { + "id": 50, + "position_mm": [ + -0.443421870470047, + -0.15912683308124542, + -0.22590044140815735 + ], + "orientation_deg": { + "roll": -0.8298134847365337, + "pitch": -0.9503872672016913, + "yaw": 1.0164862255490184 + } + }, + { + "id": 71, + "position_mm": [ + 140.00369262695312, + -0.10814773291349411, + -0.04711497202515602 + ], + "orientation_deg": { + "roll": -0.16340456498223793, + "pitch": -1.29086548810585, + "yaw": -0.12151754343635246 + } + }, + { + "id": 76, + "position_mm": [ + -239.83633300278618, + 100.47100921057617, + -78.73376400200283 + ], + "orientation_deg": { + "roll": -66.43489120479188, + "pitch": 24.985520190072375, + "yaw": -117.54700128308383 + } + }, + { + "id": 101, + "position_mm": [ + -0.9931367635726929, + -80.60655212402344, + -0.5419047474861145 + ], + "orientation_deg": { + "roll": 1.285582741797992, + "pitch": -1.3011452936655432, + "yaw": -0.664253985921389 + } + }, + { + "id": 128, + "position_mm": [ + 57.19769397951702, + -110.14373451833941, + 344.0838373759899 + ], + "orientation_deg": { + "roll": 10.047561302244189, + "pitch": -6.8907814678227055, + "yaw": 21.334791935979464 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_annotated.jpg new file mode 100644 index 0000000..6caf2fc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_overlay.png new file mode 100644 index 0000000..70146c9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982614665_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982810098.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982810098.jpg new file mode 100644 index 0000000..a443805 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982810098.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.csv new file mode 100644 index 0000000..08032c9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.csv @@ -0,0 +1,9 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.88,-155.06,206.67,-109.040,2.409,78.115 +camera 1,243.15,-362.51,872.92,-148.807,-2.953,18.442 +25,85.59,-166.27,-15.71,0.472,-0.409,31.116 +50,-0.44,-0.16,-0.23,-0.376,-0.938,0.060 +71,140.00,-0.11,-0.05,-0.501,-2.030,-0.281 +76,-240.35,102.71,-81.80,-64.164,26.899,-120.963 +101,-0.99,-80.60,-0.55,0.368,-1.373,-1.173 +128,51.51,-108.83,333.74,11.861,-9.087,20.920 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.json new file mode 100644 index 0000000..22c8111 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam.json @@ -0,0 +1,123 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:46:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02820072803355657, + "rms_refs_px_cam2": 1.7188143396438864, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.8824265410371, + -155.05791470695195, + 206.67253443532093 + ], + "orientation_deg": { + "roll": -109.04013684175638, + "pitch": 2.4094256982158786, + "yaw": 78.11482280592192 + } + }, + { + "id": "camera2", + "position_mm": [ + 243.1456978533168, + -362.51407940486723, + 872.9182498432617 + ], + "orientation_deg": { + "roll": -148.8074275406204, + "pitch": -2.9533673692617586, + "yaw": 18.441702098851053 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.59168243408203, + -166.26568603515625, + -15.714176177978516 + ], + "orientation_deg": { + "roll": 0.47164858711455854, + "pitch": -0.4089869812302783, + "yaw": 31.115786276645597 + } + }, + { + "id": 50, + "position_mm": [ + -0.4436292350292206, + -0.15811839699745178, + -0.22791147232055664 + ], + "orientation_deg": { + "roll": -0.3759178758509323, + "pitch": -0.9378976507591612, + "yaw": 0.06037728989130563 + } + }, + { + "id": 71, + "position_mm": [ + 140.00326538085938, + -0.10792146623134613, + -0.0487079843878746 + ], + "orientation_deg": { + "roll": -0.5009621113617212, + "pitch": -2.029610352583838, + "yaw": -0.2809707376870065 + } + }, + { + "id": 76, + "position_mm": [ + -240.34880875114334, + 102.70765341415999, + -81.80364856684996 + ], + "orientation_deg": { + "roll": -64.16358692813562, + "pitch": 26.898761469977902, + "yaw": -120.96255905624004 + } + }, + { + "id": 101, + "position_mm": [ + -0.992073655128479, + -80.60246276855469, + -0.5464606285095215 + ], + "orientation_deg": { + "roll": 0.3675112364123164, + "pitch": -1.3732569193255735, + "yaw": -1.1732351833441987 + } + }, + { + "id": 128, + "position_mm": [ + 51.507748415450195, + -108.82808211353124, + 333.74447835592105 + ], + "orientation_deg": { + "roll": 11.860635800993276, + "pitch": -9.087007482769364, + "yaw": 20.92002888099015 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_annotated.jpg new file mode 100644 index 0000000..d7e357f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_overlay.png new file mode 100644 index 0000000..9e5ef47 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982810098_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982917583.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982917583.jpg new file mode 100644 index 0000000..d6b3446 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982917583.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.csv new file mode 100644 index 0000000..33fac05 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.88,-155.06,206.67,-109.040,2.409,78.115 +camera 1,248.35,-362.23,871.69,-148.719,-2.627,18.443 +25,85.59,-166.32,-15.73,-0.028,-0.635,31.466 +50,-0.45,-0.16,-0.23,-0.670,-0.874,1.117 +71,140.00,-0.11,-0.05,-0.501,-2.030,-0.281 +76,-240.81,102.61,-80.32,-64.476,26.707,-121.098 +101,-1.00,-80.60,-0.55,0.368,-1.373,-1.173 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.json new file mode 100644 index 0000000..a9d815d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:48:37", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028200728033638052, + "rms_refs_px_cam2": 1.7186398901566229, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.8824265410373, + -155.05791470695172, + 206.67253443532138 + ], + "orientation_deg": { + "roll": -109.04013684175641, + "pitch": 2.4094256982159132, + "yaw": 78.11482280592195 + } + }, + { + "id": "camera2", + "position_mm": [ + 248.35261552968075, + -362.2262016300951, + 871.6943970167135 + ], + "orientation_deg": { + "roll": -148.71943147381037, + "pitch": -2.6265487535027896, + "yaw": 18.443056551676264 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.59269714355469, + -166.32138061523438, + -15.730451583862305 + ], + "orientation_deg": { + "roll": -0.02794610568217826, + "pitch": -0.6350560385889537, + "yaw": 31.46566969274582 + } + }, + { + "id": 50, + "position_mm": [ + -0.44648274779319763, + -0.15719729661941528, + -0.22855515778064728 + ], + "orientation_deg": { + "roll": -0.6697742005346724, + "pitch": -0.8742707815216154, + "yaw": 1.1173102651199007 + } + }, + { + "id": 71, + "position_mm": [ + 140.0025177001953, + -0.10695965588092804, + -0.04864918068051338 + ], + "orientation_deg": { + "roll": -0.5009621113617622, + "pitch": -2.02961035258386, + "yaw": -0.2809707376869922 + } + }, + { + "id": 76, + "position_mm": [ + -240.8091067688117, + 102.61470008859396, + -80.32232943034067 + ], + "orientation_deg": { + "roll": -64.47636823823511, + "pitch": 26.70746067131459, + "yaw": -121.09796310433192 + } + }, + { + "id": 101, + "position_mm": [ + -0.998935878276825, + -80.60102844238281, + -0.5484001040458679 + ], + "orientation_deg": { + "roll": 0.36751123641227545, + "pitch": -1.3732569193255961, + "yaw": -1.1732351833441845 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_annotated.jpg new file mode 100644 index 0000000..b669a2f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_overlay.png new file mode 100644 index 0000000..b5f57fd Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982917583_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982930836.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982930836.jpg new file mode 100644 index 0000000..b039f10 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982930836.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.csv new file mode 100644 index 0000000..364d80e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.31,-155.72,207.36,-109.101,2.464,78.032 +camera 1,244.63,-360.04,874.58,-148.951,-2.840,18.497 +25,85.75,-166.12,-15.33,154.913,33.993,139.927 +50,-0.44,-0.16,-0.23,-0.442,-0.986,-0.019 +71,140.00,-0.11,-0.05,-0.071,-1.260,-0.101 +76,-236.24,98.16,-72.83,-65.722,26.482,-119.916 +101,-0.99,-80.60,-0.55,0.886,-2.045,-1.199 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.json new file mode 100644 index 0000000..28268f9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:48:51", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028425336484044744, + "rms_refs_px_cam2": 1.7188474889058696, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.3105155462462, + -155.71679762227694, + 207.3599191391916 + ], + "orientation_deg": { + "roll": -109.10117828836869, + "pitch": 2.4636585871972327, + "yaw": 78.03175058534644 + } + }, + { + "id": "camera2", + "position_mm": [ + 244.62699800271483, + -360.0393166521015, + 874.5811200344878 + ], + "orientation_deg": { + "roll": -148.95092330537156, + "pitch": -2.8402626266018096, + "yaw": 18.4968971890818 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.75117492675781, + -166.11581420898438, + -15.3258695602417 + ], + "orientation_deg": { + "roll": 154.91291323880768, + "pitch": 33.99349192100868, + "yaw": 139.9269890626268 + } + }, + { + "id": 50, + "position_mm": [ + -0.4435438811779022, + -0.15879465639591217, + -0.2274884432554245 + ], + "orientation_deg": { + "roll": -0.44161021992337984, + "pitch": -0.9863358880793744, + "yaw": -0.01899682213679084 + } + }, + { + "id": 71, + "position_mm": [ + 140.00352478027344, + -0.1083608865737915, + -0.04822985827922821 + ], + "orientation_deg": { + "roll": -0.07052079112691668, + "pitch": -1.2601166712788052, + "yaw": -0.10066829724302497 + } + }, + { + "id": 76, + "position_mm": [ + -236.24015724104, + 98.1622527280998, + -72.83367400167162 + ], + "orientation_deg": { + "roll": -65.7220501213767, + "pitch": 26.48206327479471, + "yaw": -119.91619359671647 + } + }, + { + "id": 101, + "position_mm": [ + -0.9918742775917053, + -80.60435485839844, + -0.545185923576355 + ], + "orientation_deg": { + "roll": 0.8860436957389345, + "pitch": -2.04480810992197, + "yaw": -1.1989209820876388 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_annotated.jpg new file mode 100644 index 0000000..589ed20 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_overlay.png new file mode 100644 index 0000000..7b55ded Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765982930836_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983044369.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983044369.jpg new file mode 100644 index 0000000..9c72d31 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983044369.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.csv new file mode 100644 index 0000000..3ef7c1f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.90,-156.75,208.76,-109.178,2.447,77.960 +camera 1,247.26,-359.90,873.96,-148.906,-2.676,18.498 +25,85.82,-166.59,-15.34,-0.150,-0.710,31.318 +50,-0.44,-0.16,-0.23,-1.742,-0.686,1.838 +71,140.00,-0.11,-0.05,-0.565,-2.157,-0.428 +76,-240.52,101.87,-80.26,-64.282,26.624,-120.965 +101,-0.99,-80.60,-0.55,0.305,-1.502,-1.321 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.json new file mode 100644 index 0000000..f7bf5ca --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:50:44", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028197296873898308, + "rms_refs_px_cam2": 1.7187607339405568, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.8960396574817, + -156.7548341914854, + 208.76126278964352 + ], + "orientation_deg": { + "roll": -109.1780978089365, + "pitch": 2.446748193640794, + "yaw": 77.9595692594307 + } + }, + { + "id": "camera2", + "position_mm": [ + 247.25500139925649, + -359.8970653985967, + 873.9604521957694 + ], + "orientation_deg": { + "roll": -148.90620669359643, + "pitch": -2.675732123354708, + "yaw": 18.497513991243796 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.82437133789062, + -166.58567810058594, + -15.344846725463867 + ], + "orientation_deg": { + "roll": -0.1497189761084762, + "pitch": -0.7096579626139773, + "yaw": 31.31768987846559 + } + }, + { + "id": 50, + "position_mm": [ + -0.44497746229171753, + -0.15805305540561676, + -0.22833649814128876 + ], + "orientation_deg": { + "roll": -1.741741295058746, + "pitch": -0.686176394309579, + "yaw": 1.8381904534027762 + } + }, + { + "id": 71, + "position_mm": [ + 140.00323486328125, + -0.10800918191671371, + -0.04803669825196266 + ], + "orientation_deg": { + "roll": -0.5652996892186938, + "pitch": -2.157118140174134, + "yaw": -0.428029382730114 + } + }, + { + "id": 76, + "position_mm": [ + -240.5178990757798, + 101.86860444706602, + -80.2628789074864 + ], + "orientation_deg": { + "roll": -64.28186346113972, + "pitch": 26.623694041567024, + "yaw": -120.96485451987267 + } + }, + { + "id": 101, + "position_mm": [ + -0.9949064254760742, + -80.60292053222656, + -0.5471529364585876 + ], + "orientation_deg": { + "roll": 0.30519125262200725, + "pitch": -1.5017508899466334, + "yaw": -1.3210805570761701 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_annotated.jpg new file mode 100644 index 0000000..1f42337 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_overlay.png new file mode 100644 index 0000000..bffc01a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983044369_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983168563.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983168563.jpg new file mode 100644 index 0000000..f82c7cf Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983168563.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.csv new file mode 100644 index 0000000..ab1da4f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.17,-152.77,206.90,-109.091,2.617,78.244 +camera 1,247.15,-360.02,873.97,-148.892,-2.683,18.495 +25,85.73,-166.18,-15.26,0.045,-0.411,31.416 +50,-0.45,-0.16,-0.23,-1.168,-0.308,0.110 +71,140.00,-0.11,-0.05,-0.715,-2.037,-0.142 +76,-234.44,96.35,-68.73,-64.463,28.103,-123.911 +101,-1.00,-80.61,-0.55,0.508,-0.932,-0.532 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.json new file mode 100644 index 0000000..af8c59e --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:52:48", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02818420679284156, + "rms_refs_px_cam2": 1.7211608992221252, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.1693433794841, + -152.7747635295629, + 206.90405673205674 + ], + "orientation_deg": { + "roll": -109.09086905713993, + "pitch": 2.6174193001935455, + "yaw": 78.24374154793622 + } + }, + { + "id": "camera2", + "position_mm": [ + 247.1523407382409, + -360.01780861467074, + 873.9738072572695 + ], + "orientation_deg": { + "roll": -148.8923316321762, + "pitch": -2.683334502482194, + "yaw": 18.494535488588696 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.726318359375, + -166.17922973632812, + -15.264066696166992 + ], + "orientation_deg": { + "roll": 0.04466407768260123, + "pitch": -0.41116683659611986, + "yaw": 31.4162610039604 + } + }, + { + "id": 50, + "position_mm": [ + -0.4466259181499481, + -0.15915727615356445, + -0.22871114313602448 + ], + "orientation_deg": { + "roll": -1.1684013051803115, + "pitch": -0.3081655962243212, + "yaw": 0.10987215187171864 + } + }, + { + "id": 71, + "position_mm": [ + 140.0024871826172, + -0.10800617933273315, + -0.04886769875884056 + ], + "orientation_deg": { + "roll": -0.7150348582255963, + "pitch": -2.037401642530865, + "yaw": -0.14223106018917261 + } + }, + { + "id": 76, + "position_mm": [ + -234.44402426045556, + 96.3548727011057, + -68.72828333876724 + ], + "orientation_deg": { + "roll": -64.46331130788438, + "pitch": 28.10260581656289, + "yaw": -123.91075493578425 + } + }, + { + "id": 101, + "position_mm": [ + -0.9997990131378174, + -80.6060562133789, + -0.548721194267273 + ], + "orientation_deg": { + "roll": 0.5077588194635522, + "pitch": -0.9316110212589096, + "yaw": -0.532379040723357 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_annotated.jpg new file mode 100644 index 0000000..91ac822 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_overlay.png new file mode 100644 index 0000000..6676dcc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983168563_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983229717.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983229717.jpg new file mode 100644 index 0000000..4f4439d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983229717.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.csv new file mode 100644 index 0000000..9aba21d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.57,-153.50,206.18,-108.993,2.464,78.260 +camera 1,247.86,-371.82,868.31,-148.133,-2.825,18.344 +25,85.54,-166.19,-15.96,-0.435,-0.737,31.885 +50,-0.45,-0.16,-0.23,-0.357,-0.865,0.101 +71,140.00,-0.11,-0.05,-0.183,-1.274,0.435 +76,-239.79,102.80,-76.64,-67.034,25.943,-117.960 +101,-1.01,-80.60,-0.56,0.346,-1.312,-1.072 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.json new file mode 100644 index 0000000..0bc432b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:53:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02803541351834978, + "rms_refs_px_cam2": 1.7192758374871324, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.5672227939564, + -153.5046162735614, + 206.18308769750794 + ], + "orientation_deg": { + "roll": -108.99344522279885, + "pitch": 2.4639889039392027, + "yaw": 78.25997654981533 + } + }, + { + "id": "camera2", + "position_mm": [ + 247.8563979355745, + -371.8194951831652, + 868.3060573585508 + ], + "orientation_deg": { + "roll": -148.13331665730658, + "pitch": -2.8247957467840585, + "yaw": 18.343838689233685 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.54365539550781, + -166.18804931640625, + -15.958940505981445 + ], + "orientation_deg": { + "roll": -0.4347973576405217, + "pitch": -0.7370621561657256, + "yaw": 31.885364875290794 + } + }, + { + "id": 50, + "position_mm": [ + -0.4502018392086029, + -0.15551365911960602, + -0.2330283373594284 + ], + "orientation_deg": { + "roll": -0.3567108484284237, + "pitch": -0.8647982967859644, + "yaw": 0.10068700169698892 + } + }, + { + "id": 71, + "position_mm": [ + 140.0011444091797, + -0.10625644773244858, + -0.05114489421248436 + ], + "orientation_deg": { + "roll": -0.18348516505284243, + "pitch": -1.2742612472562562, + "yaw": 0.43495375533225905 + } + }, + { + "id": 76, + "position_mm": [ + -239.78544099856651, + 102.80027148463262, + -76.6416779794139 + ], + "orientation_deg": { + "roll": -67.03385375868896, + "pitch": 25.9429396836321, + "yaw": -117.96025201934512 + } + }, + { + "id": 101, + "position_mm": [ + -1.0061451196670532, + -80.59558868408203, + -0.5591506958007812 + ], + "orientation_deg": { + "roll": 0.3455116612965378, + "pitch": -1.3124734804104838, + "yaw": -1.0716668989077738 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_annotated.jpg new file mode 100644 index 0000000..9c4b19b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_overlay.png new file mode 100644 index 0000000..6ca36c3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983229717_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983272872.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983272872.jpg new file mode 100644 index 0000000..c0ddfbb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983272872.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.csv new file mode 100644 index 0000000..da9033a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.96,-153.28,207.60,-109.124,2.613,78.218 +camera 1,250.74,-364.71,871.35,-148.529,-2.544,18.445 +25,85.77,-166.39,-15.22,0.026,-0.438,31.392 +50,-0.45,-0.16,-0.23,-1.489,-0.283,1.183 +71,140.00,-0.11,-0.05,-0.717,-2.070,-0.166 +76,-240.81,102.60,-78.22,-64.699,26.768,-121.188 +101,-1.01,-80.60,-0.56,0.854,-0.504,-1.002 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.json new file mode 100644 index 0000000..64b411a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:54:33", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02816581971389295, + "rms_refs_px_cam2": 1.721350192992551, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.961754353751, + -153.27503821427678, + 207.59576299383545 + ], + "orientation_deg": { + "roll": -109.12351403920687, + "pitch": 2.612535224391062, + "yaw": 78.21794416348459 + } + }, + { + "id": "camera2", + "position_mm": [ + 250.73833380398108, + -364.71450393448197, + 871.3465772229941 + ], + "orientation_deg": { + "roll": -148.52860745828627, + "pitch": -2.543720190908679, + "yaw": 18.444715810299137 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.77005004882812, + -166.39451599121094, + -15.224959373474121 + ], + "orientation_deg": { + "roll": 0.025912765178763293, + "pitch": -0.4382913338064064, + "yaw": 31.39209201885989 + } + }, + { + "id": 50, + "position_mm": [ + -0.45035842061042786, + -0.15727153420448303, + -0.23177272081375122 + ], + "orientation_deg": { + "roll": -1.4885162572985562, + "pitch": -0.28329993043916407, + "yaw": 1.183416593850456 + } + }, + { + "id": 71, + "position_mm": [ + 140.00146484375, + -0.10700147598981857, + -0.049946196377277374 + ], + "orientation_deg": { + "roll": -0.7168175410860705, + "pitch": -2.0703281799368605, + "yaw": -0.16647515639488097 + } + }, + { + "id": 76, + "position_mm": [ + -240.8116191680248, + 102.60459334571914, + -78.22364501339918 + ], + "orientation_deg": { + "roll": -64.69901550027167, + "pitch": 26.76798048350779, + "yaw": -121.18786763456227 + } + }, + { + "id": 101, + "position_mm": [ + -1.0076037645339966, + -80.60137939453125, + -0.5561686158180237 + ], + "orientation_deg": { + "roll": 0.8536642721160439, + "pitch": -0.5038253800188582, + "yaw": -1.001919865596246 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_annotated.jpg new file mode 100644 index 0000000..ec29394 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_overlay.png new file mode 100644 index 0000000..39a842f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983272872_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983284896.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983284896.jpg new file mode 100644 index 0000000..259fa31 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983284896.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983289679.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983289679.jpg new file mode 100644 index 0000000..25d34a1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983289679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.csv new file mode 100644 index 0000000..6fd1985 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.16,-156.60,207.85,-109.117,2.369,78.005 +camera 1,254.37,-359.04,871.66,-148.771,-2.254,18.606 +25,85.88,-166.27,-15.30,0.060,-0.829,33.070 +50,-0.45,-0.16,-0.23,-0.352,-1.022,-0.047 +71,140.00,-0.11,-0.05,0.019,-1.295,-0.129 +76,-241.68,101.66,-78.80,-64.703,26.391,-121.039 +101,-1.00,-80.60,-0.55,0.184,-1.572,-0.785 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.json new file mode 100644 index 0000000..a00e334 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:54:50", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02841600625549589, + "rms_refs_px_cam2": 1.7205881560483913, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.1564305295875, + -156.5961731202692, + 207.85229684685248 + ], + "orientation_deg": { + "roll": -109.11711490756946, + "pitch": 2.3685608193842413, + "yaw": 78.00451340200736 + } + }, + { + "id": "camera2", + "position_mm": [ + 254.37318761446315, + -359.03839203023114, + 871.6643232939423 + ], + "orientation_deg": { + "roll": -148.7705354991614, + "pitch": -2.254278173806264, + "yaw": 18.605632964055125 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.87989807128906, + -166.27001953125, + -15.304390907287598 + ], + "orientation_deg": { + "roll": 0.059869686797500786, + "pitch": -0.8294122174997887, + "yaw": 33.06965448902152 + } + }, + { + "id": 50, + "position_mm": [ + -0.44613268971443176, + -0.15766236186027527, + -0.22784166038036346 + ], + "orientation_deg": { + "roll": -0.3518557052785968, + "pitch": -1.02160216710634, + "yaw": -0.04713482123561387 + } + }, + { + "id": 71, + "position_mm": [ + 140.0032958984375, + -0.10765816271305084, + -0.04779952019453049 + ], + "orientation_deg": { + "roll": 0.019292585607727383, + "pitch": -1.2952546578713062, + "yaw": -0.12923630389561233 + } + }, + { + "id": 76, + "position_mm": [ + -241.67510111852408, + 101.65607597934529, + -78.80335332535515 + ], + "orientation_deg": { + "roll": -64.70266467778715, + "pitch": 26.390896231367144, + "yaw": -121.03870999097859 + } + }, + { + "id": 101, + "position_mm": [ + -1.000353217124939, + -80.6032943725586, + -0.5476805567741394 + ], + "orientation_deg": { + "roll": 0.18404662741157019, + "pitch": -1.57180183457683, + "yaw": -0.7850990063989828 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_annotated.jpg new file mode 100644 index 0000000..4779c60 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_overlay.png new file mode 100644 index 0000000..5e657c9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983289679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983300286.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983300286.jpg new file mode 100644 index 0000000..eaaec02 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983300286.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.csv new file mode 100644 index 0000000..3090068 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.92,-156.75,208.04,-109.134,2.445,77.964 +camera 1,250.83,-362.23,871.07,-148.660,-2.472,18.440 +25,85.67,-166.59,-15.23,0.122,-0.571,31.152 +50,-0.45,-0.16,-0.23,-0.430,-1.023,-0.085 +71,140.00,-0.11,-0.05,0.128,-1.476,-0.786 +76,-241.07,102.73,-79.48,-64.639,26.628,-121.171 +101,-1.00,-80.60,-0.55,0.803,-0.674,-0.762 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.json new file mode 100644 index 0000000..b6771b5 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:55:00", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02850954489474135, + "rms_refs_px_cam2": 1.7209535863565424, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.9191868209715, + -156.7453691637325, + 208.0377833648449 + ], + "orientation_deg": { + "roll": -109.13430384754392, + "pitch": 2.4450553465618627, + "yaw": 77.96406965629879 + } + }, + { + "id": "camera2", + "position_mm": [ + 250.82762984728558, + -362.2279209900859, + 871.0693542614655 + ], + "orientation_deg": { + "roll": -148.660266510794, + "pitch": -2.472409212397597, + "yaw": 18.440413699019743 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.67264556884766, + -166.59120178222656, + -15.230868339538574 + ], + "orientation_deg": { + "roll": 0.12199164063858535, + "pitch": -0.5708453315208712, + "yaw": 31.151591251827583 + } + }, + { + "id": 50, + "position_mm": [ + -0.4477851986885071, + -0.15659864246845245, + -0.22972334921360016 + ], + "orientation_deg": { + "roll": -0.4302609266674103, + "pitch": -1.022565766091668, + "yaw": -0.08545815237709921 + } + }, + { + "id": 71, + "position_mm": [ + 140.00254821777344, + -0.10683971643447876, + -0.04863251745700836 + ], + "orientation_deg": { + "roll": 0.12786948702582587, + "pitch": -1.4758741798264594, + "yaw": -0.7863426727456919 + } + }, + { + "id": 76, + "position_mm": [ + -241.07219496365616, + 102.73445235572531, + -79.47609737734595 + ], + "orientation_deg": { + "roll": -64.63856833195261, + "pitch": 26.628445951456357, + "yaw": -121.1707727515409 + } + }, + { + "id": 101, + "position_mm": [ + -1.0017588138580322, + -80.60014343261719, + -0.5511054396629333 + ], + "orientation_deg": { + "roll": 0.8025300719859428, + "pitch": -0.6742314744569283, + "yaw": -0.7623910484293689 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_annotated.jpg new file mode 100644 index 0000000..67d2429 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_overlay.png new file mode 100644 index 0000000..1f9f9ef Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983300286_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983308213.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983308213.jpg new file mode 100644 index 0000000..9c3515d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983308213.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.csv new file mode 100644 index 0000000..b463455 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.62,-155.20,207.56,-109.089,2.494,78.090 +camera 1,254.37,-359.04,871.66,-148.771,-2.254,18.606 +25,85.88,-166.24,-15.26,154.935,34.016,140.014 +50,-0.45,-0.16,-0.23,-0.469,-0.968,0.039 +71,140.00,-0.11,-0.05,-0.594,-2.061,-0.301 +76,-241.68,101.66,-78.80,-64.703,26.391,-121.039 +101,-1.00,-80.60,-0.55,0.763,-0.620,-0.638 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.json new file mode 100644 index 0000000..344438b --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:55:08", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02817892157092051, + "rms_refs_px_cam2": 1.7205881560483913, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.6174664090123, + -155.19924293833685, + 207.5607349216386 + ], + "orientation_deg": { + "roll": -109.08916320392417, + "pitch": 2.4939936318382974, + "yaw": 78.0898854927539 + } + }, + { + "id": "camera2", + "position_mm": [ + 254.37318761446315, + -359.03839203023114, + 871.6643232939423 + ], + "orientation_deg": { + "roll": -148.7705354991614, + "pitch": -2.254278173806264, + "yaw": 18.605632964055125 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.88031005859375, + -166.239990234375, + -15.26122760772705 + ], + "orientation_deg": { + "roll": 154.9351065862485, + "pitch": 34.015525456617965, + "yaw": 140.01430140511917 + } + }, + { + "id": 50, + "position_mm": [ + -0.44678908586502075, + -0.15793786942958832, + -0.22800377011299133 + ], + "orientation_deg": { + "roll": -0.4688065720873715, + "pitch": -0.9683114390511262, + "yaw": 0.03908231038636571 + } + }, + { + "id": 71, + "position_mm": [ + 140.00291442871094, + -0.1075807586312294, + -0.0480477511882782 + ], + "orientation_deg": { + "roll": -0.5937146697536041, + "pitch": -2.0605754918690535, + "yaw": -0.3005008612757036 + } + }, + { + "id": 76, + "position_mm": [ + -241.67510111852408, + 101.65607597934529, + -78.80335332535515 + ], + "orientation_deg": { + "roll": -64.70266467778715, + "pitch": 26.390896231367144, + "yaw": -121.03870999097859 + } + }, + { + "id": 101, + "position_mm": [ + -1.002105474472046, + -80.60404205322266, + -0.5482209324836731 + ], + "orientation_deg": { + "roll": 0.7633493423486187, + "pitch": -0.6204363377703108, + "yaw": -0.6380775730644446 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_annotated.jpg new file mode 100644 index 0000000..7869b27 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_overlay.png new file mode 100644 index 0000000..53fb674 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983308213_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983318221.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983318221.jpg new file mode 100644 index 0000000..3a98c7b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983318221.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.csv new file mode 100644 index 0000000..f623787 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.05,-153.65,206.70,-109.065,2.515,78.202 +camera 1,249.26,-367.11,869.71,-148.389,-2.655,18.390 +25,85.58,-166.22,-15.46,0.137,-0.463,31.372 +50,-0.45,-0.16,-0.23,-0.801,-1.204,0.911 +71,140.00,-0.11,-0.05,-0.290,-1.373,0.387 +76,-240.88,103.39,-79.02,-64.737,26.943,-121.253 +101,-1.01,-80.60,-0.56,0.748,-0.593,-0.527 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.json new file mode 100644 index 0000000..5821092 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:55:18", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028314644300649356, + "rms_refs_px_cam2": 1.7213157206320782, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.0502644259649, + -153.6529163276419, + 206.69782379546655 + ], + "orientation_deg": { + "roll": -109.0653145162892, + "pitch": 2.5146778026792513, + "yaw": 78.20152139315742 + } + }, + { + "id": "camera2", + "position_mm": [ + 249.25804931933303, + -367.11332338289066, + 869.7129496914637 + ], + "orientation_deg": { + "roll": -148.38927562752295, + "pitch": -2.654868519615817, + "yaw": 18.39038777051004 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.57723999023438, + -166.2179412841797, + -15.464427947998047 + ], + "orientation_deg": { + "roll": 0.1370634678558588, + "pitch": -0.4628426593183752, + "yaw": 31.37219200629401 + } + }, + { + "id": 50, + "position_mm": [ + -0.4497600495815277, + -0.1563960313796997, + -0.23189467191696167 + ], + "orientation_deg": { + "roll": -0.8010329104916979, + "pitch": -1.2037479140044816, + "yaw": 0.911387667258679 + } + }, + { + "id": 71, + "position_mm": [ + 140.00157165527344, + -0.10658437758684158, + -0.050248824059963226 + ], + "orientation_deg": { + "roll": -0.29035648880849374, + "pitch": -1.372742014727434, + "yaw": 0.3866511333683544 + } + }, + { + "id": 76, + "position_mm": [ + -240.88052996762303, + 103.38645435240213, + -79.01579665980007 + ], + "orientation_deg": { + "roll": -64.73721097066182, + "pitch": 26.942812402489505, + "yaw": -121.25313132917003 + } + }, + { + "id": 101, + "position_mm": [ + -1.0061888694763184, + -80.59893798828125, + -0.5566652417182922 + ], + "orientation_deg": { + "roll": 0.747720272016331, + "pitch": -0.593027060714692, + "yaw": -0.5273182403883392 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_annotated.jpg new file mode 100644 index 0000000..1df7297 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_overlay.png new file mode 100644 index 0000000..ac5efaf Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983318221_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983328113.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983328113.jpg new file mode 100644 index 0000000..16b9eb8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983328113.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.csv new file mode 100644 index 0000000..984ffb8 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.49,-155.20,207.37,-109.100,2.480,78.083 +camera 1,249.26,-367.11,869.71,-148.389,-2.655,18.390 +25,85.61,-166.36,-15.38,0.139,-0.512,31.255 +50,-0.45,-0.16,-0.23,-0.620,-1.115,0.420 +71,140.00,-0.11,-0.05,-0.086,-1.255,-0.049 +76,-240.88,103.39,-79.02,-64.737,26.943,-121.253 +101,-1.00,-80.60,-0.56,0.775,-0.634,-0.645 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.json new file mode 100644 index 0000000..c83a0cb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:55:28", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028412008384277574, + "rms_refs_px_cam2": 1.7213157206320782, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.4876707215351, + -155.19534330718096, + 207.36773654057316 + ], + "orientation_deg": { + "roll": -109.09983576455463, + "pitch": 2.479996652092934, + "yaw": 78.08296694741996 + } + }, + { + "id": "camera2", + "position_mm": [ + 249.25804931933303, + -367.11332338289066, + 869.7129496914637 + ], + "orientation_deg": { + "roll": -148.38927562752295, + "pitch": -2.654868519615817, + "yaw": 18.39038777051004 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.6149673461914, + -166.357177734375, + -15.38212776184082 + ], + "orientation_deg": { + "roll": 0.1387604088512323, + "pitch": -0.5117237063068634, + "yaw": 31.255127321756472 + } + }, + { + "id": 50, + "position_mm": [ + -0.4492000341415405, + -0.15609584748744965, + -0.23187202215194702 + ], + "orientation_deg": { + "roll": -0.6197580034085601, + "pitch": -1.1153672897861162, + "yaw": 0.42040252896301905 + } + }, + { + "id": 71, + "position_mm": [ + 140.0018768310547, + -0.10668907314538956, + -0.05000776797533035 + ], + "orientation_deg": { + "roll": -0.08623757945053535, + "pitch": -1.2554440951382706, + "yaw": -0.04916484208117761 + } + }, + { + "id": 76, + "position_mm": [ + -240.88052996762303, + 103.38645435240213, + -79.01579665980007 + ], + "orientation_deg": { + "roll": -64.73721097066182, + "pitch": 26.942812402489505, + "yaw": -121.25313132917003 + } + }, + { + "id": 101, + "position_mm": [ + -1.0045270919799805, + -80.59809875488281, + -0.5563613176345825 + ], + "orientation_deg": { + "roll": 0.774992807126804, + "pitch": -0.6336291572284581, + "yaw": -0.6446604290198735 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_annotated.jpg new file mode 100644 index 0000000..bdb592a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_overlay.png new file mode 100644 index 0000000..6855288 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983328113_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983393320.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983393320.jpg new file mode 100644 index 0000000..a5c9ae1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983393320.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.csv new file mode 100644 index 0000000..67e2cec --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,667.92,-156.75,208.04,-109.134,2.445,77.964 +camera 1,251.80,-367.00,869.08,-148.345,-2.495,18.391 +25,85.65,-166.52,-15.31,0.141,-0.561,31.138 +50,-0.45,-0.16,-0.23,-0.430,-1.023,-0.085 +71,140.00,-0.11,-0.05,0.128,-1.476,-0.786 +76,-241.10,103.35,-78.29,-64.891,26.850,-121.320 +101,-1.01,-80.60,-0.56,0.803,-0.674,-0.762 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.json new file mode 100644 index 0000000..e7d7096 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:56:33", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02850954489474135, + "rms_refs_px_cam2": 1.7212295339523151, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 667.9191868209715, + -156.7453691637325, + 208.0377833648449 + ], + "orientation_deg": { + "roll": -109.13430384754392, + "pitch": 2.4450553465618627, + "yaw": 77.96406965629879 + } + }, + { + "id": "camera2", + "position_mm": [ + 251.79711690056877, + -366.9968938993937, + 869.0818247521999 + ], + "orientation_deg": { + "roll": -148.3447109400195, + "pitch": -2.4951902654936386, + "yaw": 18.39072872555171 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.65408325195312, + -166.52464294433594, + -15.307549476623535 + ], + "orientation_deg": { + "roll": 0.14068156335267307, + "pitch": -0.5607447202079343, + "yaw": 31.137693004956972 + } + }, + { + "id": 50, + "position_mm": [ + -0.45007169246673584, + -0.1553199291229248, + -0.2321808636188507 + ], + "orientation_deg": { + "roll": -0.4302609266674103, + "pitch": -1.022565766091668, + "yaw": -0.08545815237709921 + } + }, + { + "id": 71, + "position_mm": [ + 140.00184631347656, + -0.10631442815065384, + -0.04974232241511345 + ], + "orientation_deg": { + "roll": 0.12786948702582587, + "pitch": -1.4758741798264594, + "yaw": -0.7863426727456919 + } + }, + { + "id": 76, + "position_mm": [ + -241.1003078405271, + 103.34823686938516, + -78.29333248664861 + ], + "orientation_deg": { + "roll": -64.89112971275607, + "pitch": 26.84987998698546, + "yaw": -121.3204176709653 + } + }, + { + "id": 101, + "position_mm": [ + -1.0063066482543945, + -80.59651184082031, + -0.5570535659790039 + ], + "orientation_deg": { + "roll": 0.8025300719859428, + "pitch": -0.6742314744569283, + "yaw": -0.7623910484293689 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_annotated.jpg new file mode 100644 index 0000000..f9ab924 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_overlay.png new file mode 100644 index 0000000..4197ba7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983393320_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983489899.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983489899.jpg new file mode 100644 index 0000000..aa0d76d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983489899.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.csv new file mode 100644 index 0000000..a4365e9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,669.01,-155.84,208.95,-109.182,2.560,78.032 +camera 1,244.79,-367.98,871.22,-148.458,-2.903,18.285 +25,85.43,-166.76,-15.12,0.025,-0.517,31.209 +50,-0.45,-0.16,-0.23,-0.999,-1.110,1.407 +71,140.00,-0.11,-0.05,-0.181,-1.319,-0.095 +76,-243.56,107.07,-86.74,-65.067,25.936,-118.822 +101,-1.00,-80.60,-0.56,0.917,-1.241,0.489 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.json new file mode 100644 index 0000000..48348e9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:58:10", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028372511897889127, + "rms_refs_px_cam2": 1.718869117780858, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 669.0114894977039, + -155.8444142197801, + 208.95427024334495 + ], + "orientation_deg": { + "roll": -109.18179965468835, + "pitch": 2.559500739889684, + "yaw": 78.03180172521961 + } + }, + { + "id": "camera2", + "position_mm": [ + 244.78721598986957, + -367.984994205282, + 871.2188186099534 + ], + "orientation_deg": { + "roll": -148.4578249767481, + "pitch": -2.9033152261009123, + "yaw": 18.285037554350684 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.42964172363281, + -166.7587127685547, + -15.121360778808594 + ], + "orientation_deg": { + "roll": 0.024748297470326114, + "pitch": -0.5170415562318312, + "yaw": 31.208589089664912 + } + }, + { + "id": 50, + "position_mm": [ + -0.44849956035614014, + -0.1559777408838272, + -0.23266029357910156 + ], + "orientation_deg": { + "roll": -0.9992948289458112, + "pitch": -1.1097574418243432, + "yaw": 1.4066593192437848 + } + }, + { + "id": 71, + "position_mm": [ + 140.00177001953125, + -0.10670822113752365, + -0.050302259624004364 + ], + "orientation_deg": { + "roll": -0.18090931185998668, + "pitch": -1.3192232549669394, + "yaw": -0.09459969760593934 + } + }, + { + "id": 76, + "position_mm": [ + -243.55795160239808, + 107.06947978457465, + -86.73999444361668 + ], + "orientation_deg": { + "roll": -65.06746811162343, + "pitch": 25.9364885798087, + "yaw": -118.82214511070238 + } + }, + { + "id": 101, + "position_mm": [ + -1.0007325410842896, + -80.59693908691406, + -0.556881844997406 + ], + "orientation_deg": { + "roll": 0.9167454154930219, + "pitch": -1.2414936174334168, + "yaw": 0.4890097521958377 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_annotated.jpg new file mode 100644 index 0000000..eaadba0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_overlay.png new file mode 100644 index 0000000..25476a1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983489899_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983500713.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983500713.jpg new file mode 100644 index 0000000..9a72c3d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983500713.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.csv new file mode 100644 index 0000000..031d34c --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.56,-154.83,207.76,-109.106,2.584,78.091 +camera 1,248.25,-362.35,871.71,-148.706,-2.634,18.440 +25,85.65,-166.41,-15.16,0.059,-0.445,31.264 +50,-0.45,-0.16,-0.23,-0.854,-0.899,1.099 +71,140.00,-0.11,-0.05,-0.685,-2.059,-0.295 +76,-244.24,106.14,-87.36,-65.070,25.571,-118.680 +101,-1.00,-80.60,-0.55,1.259,-1.250,-0.581 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.json new file mode 100644 index 0000000..16f78f0 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:58:21", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02816991749156176, + "rms_refs_px_cam2": 1.7210397981360237, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.5588615190105, + -154.83025551492867, + 207.75692118682656 + ], + "orientation_deg": { + "roll": -109.10564257558977, + "pitch": 2.583855980722102, + "yaw": 78.09097382796138 + } + }, + { + "id": "camera2", + "position_mm": [ + 248.25130087009154, + -362.3455884345748, + 871.707723611574 + ], + "orientation_deg": { + "roll": -148.7056001768513, + "pitch": -2.634052785705389, + "yaw": 18.440094364360625 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 85.65282440185547, + -166.4070281982422, + -15.156118392944336 + ], + "orientation_deg": { + "roll": 0.059044344380885794, + "pitch": -0.4448940271416676, + "yaw": 31.264056191835802 + } + }, + { + "id": 50, + "position_mm": [ + -0.4472808241844177, + -0.1574333757162094, + -0.22968439757823944 + ], + "orientation_deg": { + "roll": -0.8544798245730169, + "pitch": -0.898781573420967, + "yaw": 1.0991725757234925 + } + }, + { + "id": 71, + "position_mm": [ + 140.0023956298828, + -0.10722088813781738, + -0.048988062888383865 + ], + "orientation_deg": { + "roll": -0.6851106345097696, + "pitch": -2.0586145716918165, + "yaw": -0.2953978431844419 + } + }, + { + "id": 76, + "position_mm": [ + -244.24294072737604, + 106.13560015266188, + -87.36351535283637 + ], + "orientation_deg": { + "roll": -65.06958989868546, + "pitch": 25.57077311534565, + "yaw": -118.67997877403438 + } + }, + { + "id": 101, + "position_mm": [ + -1.000770926475525, + -80.60189056396484, + -0.5510175228118896 + ], + "orientation_deg": { + "roll": 1.2594102113740222, + "pitch": -1.2502851352308513, + "yaw": -0.5813829657039165 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_annotated.jpg new file mode 100644 index 0000000..3cacb87 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_overlay.png new file mode 100644 index 0000000..208f546 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983500713_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983532340.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983532340.jpg new file mode 100644 index 0000000..96c4250 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983532340.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.csv new file mode 100644 index 0000000..c8850d5 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,670.15,-155.85,209.15,-109.171,2.574,78.039 +camera 1,257.68,-351.57,874.48,-149.181,-1.941,18.711 +25,86.14,-166.68,-14.87,0.022,-0.500,31.215 +50,-0.45,-0.16,-0.23,-0.859,-0.965,1.050 +71,140.00,-0.11,-0.05,-0.319,-2.139,-1.275 +76,-253.26,110.55,-100.22,-61.506,26.082,-119.456 +101,-1.00,-80.61,-0.54,1.271,-1.312,-0.659 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.json new file mode 100644 index 0000000..08dea5a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 14:58:52", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.028139097922207954, + "rms_refs_px_cam2": 1.720261241863754, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 670.1472058890698, + -155.84854088631806, + 209.15085733668926 + ], + "orientation_deg": { + "roll": -109.17118547004056, + "pitch": 2.5737139667805247, + "yaw": 78.03872367220995 + } + }, + { + "id": "camera2", + "position_mm": [ + 257.68139070839555, + -351.5660782965805, + 874.4818955116442 + ], + "orientation_deg": { + "roll": -149.1810179861491, + "pitch": -1.941318668936377, + "yaw": 18.71132314397387 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 86.13714599609375, + -166.67730712890625, + -14.866710662841797 + ], + "orientation_deg": { + "roll": 0.02163865780692443, + "pitch": -0.499583557628368, + "yaw": 31.21506331281654 + } + }, + { + "id": 50, + "position_mm": [ + -0.4462606608867645, + -0.15937520563602448, + -0.22578805685043335 + ], + "orientation_deg": { + "roll": -0.8593386068998002, + "pitch": -0.9648605675045906, + "yaw": 1.0499504145112195 + } + }, + { + "id": 71, + "position_mm": [ + 140.00335693359375, + -0.1080385223031044, + -0.046485960483551025 + ], + "orientation_deg": { + "roll": -0.31916089027434813, + "pitch": -2.1386031153067053, + "yaw": -1.2751686091374819 + } + }, + { + "id": 76, + "position_mm": [ + -253.25516868987452, + 110.54822256686909, + -100.21726653957819 + ], + "orientation_deg": { + "roll": -61.50635977168335, + "pitch": 26.082454313977728, + "yaw": -119.45569748351704 + } + }, + { + "id": 101, + "position_mm": [ + -1.0014339685440063, + -80.6087875366211, + -0.5425388216972351 + ], + "orientation_deg": { + "roll": 1.2713880105880608, + "pitch": -1.312227900835384, + "yaw": -0.6585811642716696 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_annotated.jpg new file mode 100644 index 0000000..0fa8be4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_overlay.png new file mode 100644 index 0000000..0d82ee1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983532340_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983824183.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983824183.jpg new file mode 100644 index 0000000..69ef7b6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983824183.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.csv new file mode 100644 index 0000000..27967fd --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,668.38,-155.35,207.75,-109.116,2.570,78.049 +camera 1,271.59,-402.27,852.76,-147.519,0.915,32.786 +25,87.44,-165.28,-14.13,0.302,-0.355,31.055 +50,0.01,-0.01,-0.00,-1.480,-0.296,1.070 +71,140.16,-0.09,0.03,-1.040,-1.406,-0.645 +76,-254.99,113.56,-92.24,-67.766,26.522,-122.937 +101,0.00,-80.07,-0.04,0.683,-0.632,-0.677 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.json new file mode 100644 index 0000000..9bfefd9 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:03:44", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.02824258371670517, + "rms_refs_px_cam2": 0.23574290313476617, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 668.3822449668897, + -155.35275515738925, + 207.74629822953895 + ], + "orientation_deg": { + "roll": -109.11627229595526, + "pitch": 2.5703902229488462, + "yaw": 78.04917855310059 + } + }, + { + "id": "camera2", + "position_mm": [ + 271.5895341626382, + -402.2681603381549, + 852.7587123359191 + ], + "orientation_deg": { + "roll": -147.51949079086936, + "pitch": 0.9150001131346506, + "yaw": 32.78626680715808 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 87.43780517578125, + -165.28060913085938, + -14.126185417175293 + ], + "orientation_deg": { + "roll": 0.3020506004090831, + "pitch": -0.3548293903765205, + "yaw": 31.054580069044444 + } + }, + { + "id": 50, + "position_mm": [ + 0.005559829995036125, + -0.008458945900201797, + -0.002258898224681616 + ], + "orientation_deg": { + "roll": -1.4797534807542387, + "pitch": -0.2958236275790131, + "yaw": 1.07023133722009 + } + }, + { + "id": 71, + "position_mm": [ + 140.15623474121094, + -0.09364519268274307, + 0.02749498561024666 + ], + "orientation_deg": { + "roll": -1.0401738716839446, + "pitch": -1.4055297761584484, + "yaw": -0.6453590418186615 + } + }, + { + "id": 76, + "position_mm": [ + -254.9899708500236, + 113.56356883330443, + -92.23669032198589 + ], + "orientation_deg": { + "roll": -67.7660392651273, + "pitch": 26.521515605181428, + "yaw": -122.937434938833 + } + }, + { + "id": 101, + "position_mm": [ + 0.0036676933523267508, + -80.07380676269531, + -0.037211641669273376 + ], + "orientation_deg": { + "roll": 0.6831276538045602, + "pitch": -0.632062038846384, + "yaw": -0.6767099991536859 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_annotated.jpg new file mode 100644 index 0000000..c2d169a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_overlay.png new file mode 100644 index 0000000..5e522c7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983824183_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983927709.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983927709.jpg new file mode 100644 index 0000000..200a54f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983927709.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.csv new file mode 100644 index 0000000..8d92117 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,569.04,-124.16,206.60,-108.979,2.574,80.635 +camera 1,205.62,-388.72,848.54,-146.660,1.977,35.803 +25,-8.60,-162.27,-13.90,-0.436,-0.952,22.496 +50,0.07,-0.05,0.00,-0.400,-0.863,-1.670 +71,141.49,-0.56,0.57,-0.183,-1.575,-0.177 +76,-366.15,97.07,-76.39,-72.814,25.389,-121.978 +101,0.20,-80.16,0.01,1.572,-1.233,-0.290 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.json new file mode 100644 index 0000000..849448f --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:05:27", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.14351129243903124, + "rms_refs_px_cam2": 1.4967904182185592, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 569.0369036620683, + -124.15687882282275, + 206.59804729112454 + ], + "orientation_deg": { + "roll": -108.97853395167728, + "pitch": 2.5741691809094522, + "yaw": 80.6346986686427 + } + }, + { + "id": "camera2", + "position_mm": [ + 205.6168889140773, + -388.72123464610684, + 848.535861076145 + ], + "orientation_deg": { + "roll": -146.66017587506124, + "pitch": 1.9771463988423426, + "yaw": 35.80258880806752 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -8.600593566894531, + -162.27052307128906, + -13.895493507385254 + ], + "orientation_deg": { + "roll": -0.4358599906819304, + "pitch": -0.9516676064549121, + "yaw": 22.49627494712634 + } + }, + { + "id": 50, + "position_mm": [ + 0.07024721801280975, + -0.051604799926280975, + 0.004460922442376614 + ], + "orientation_deg": { + "roll": -0.399807808002315, + "pitch": -0.8625894508999102, + "yaw": -1.6696659149637045 + } + }, + { + "id": 71, + "position_mm": [ + 141.49057006835938, + -0.5644364953041077, + 0.5693132281303406 + ], + "orientation_deg": { + "roll": -0.18310930318846133, + "pitch": -1.5754285720279326, + "yaw": -0.1770805392881687 + } + }, + { + "id": 76, + "position_mm": [ + -366.1483340424483, + 97.06872352618345, + -76.39438634981121 + ], + "orientation_deg": { + "roll": -72.81395701026862, + "pitch": 25.388883717413396, + "yaw": -121.97763864630427 + } + }, + { + "id": 101, + "position_mm": [ + 0.2028406858444214, + -80.1559066772461, + 0.013326609507203102 + ], + "orientation_deg": { + "roll": 1.572451295209905, + "pitch": -1.2330248953503353, + "yaw": -0.2903351303518448 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_annotated.jpg new file mode 100644 index 0000000..f548917 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_overlay.png new file mode 100644 index 0000000..012516c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983927709_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983937679.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983937679.jpg new file mode 100644 index 0000000..e597910 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983937679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.csv new file mode 100644 index 0000000..8583018 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,568.67,-122.71,206.13,-108.953,2.685,80.727 +camera 1,183.06,-398.22,846.81,-146.946,0.583,35.304 +25,-8.65,-162.33,-13.72,-0.765,-0.979,22.899 +50,0.07,-0.05,0.00,-0.506,-0.822,-1.577 +71,141.47,-0.56,0.55,0.338,-1.153,0.809 +76,-363.39,101.75,-85.83,-71.929,26.569,-122.082 +101,0.20,-80.15,0.01,2.154,-1.930,-0.760 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.json new file mode 100644 index 0000000..9bcd0ea --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:05:37", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1426233260567534, + "rms_refs_px_cam2": 1.4962449115500238, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 568.6660827834017, + -122.71355933549371, + 206.1301147308091 + ], + "orientation_deg": { + "roll": -108.95263515849281, + "pitch": 2.684802907744183, + "yaw": 80.72734449615342 + } + }, + { + "id": "camera2", + "position_mm": [ + 183.0638267708623, + -398.2198069942088, + 846.8116762974388 + ], + "orientation_deg": { + "roll": -146.94565942804326, + "pitch": 0.5827392822238056, + "yaw": 35.304344771099785 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -8.652523040771484, + -162.3345184326172, + -13.717430114746094 + ], + "orientation_deg": { + "roll": -0.7653830961973885, + "pitch": -0.9791888371941537, + "yaw": 22.89890144207381 + } + }, + { + "id": 50, + "position_mm": [ + 0.06726425141096115, + -0.050072021782398224, + 0.0028339396230876446 + ], + "orientation_deg": { + "roll": -0.5059919670261163, + "pitch": -0.8221355410056834, + "yaw": -1.5766471853459731 + } + }, + { + "id": 71, + "position_mm": [ + 141.4706573486328, + -0.5578001737594604, + 0.5536985397338867 + ], + "orientation_deg": { + "roll": 0.338470776474935, + "pitch": -1.1528801915075981, + "yaw": 0.8092114841801258 + } + }, + { + "id": 76, + "position_mm": [ + -363.3887116445976, + 101.74959882154056, + -85.83162784115228 + ], + "orientation_deg": { + "roll": -71.92894776334019, + "pitch": 26.5691021007591, + "yaw": -122.08180760832083 + } + }, + { + "id": 101, + "position_mm": [ + 0.19694916903972626, + -80.15333557128906, + 0.009608895517885685 + ], + "orientation_deg": { + "roll": 2.15391133557436, + "pitch": -1.9301550166146246, + "yaw": -0.7596463712663445 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_annotated.jpg new file mode 100644 index 0000000..25d2f98 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_overlay.png new file mode 100644 index 0000000..0d31a71 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765983937679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984026346.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984026346.jpg new file mode 100644 index 0000000..d3a5467 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984026346.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.csv new file mode 100644 index 0000000..ecfd138 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,568.13,-122.28,205.77,-108.943,2.621,80.792 +camera 1,127.62,-391.84,870.32,-145.616,0.865,9.369 +25,-30.79,-164.09,-22.51,-0.457,-0.897,22.652 +50,-0.12,-0.17,-0.13,-0.601,-0.968,-1.153 +71,140.20,-0.24,-0.07,0.021,-0.707,0.825 +76,-348.28,93.33,-75.00,-65.016,28.754,-118.071 +101,-0.34,-80.63,-0.39,1.666,-1.390,-0.665 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.json new file mode 100644 index 0000000..cca6529 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:07:06", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.14295403278145988, + "rms_refs_px_cam2": 1.499254903688206, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 568.1319651930938, + -122.2764169862242, + 205.76880215637294 + ], + "orientation_deg": { + "roll": -108.94300664030993, + "pitch": 2.6211805608075998, + "yaw": 80.79156592531527 + } + }, + { + "id": "camera2", + "position_mm": [ + 127.61774983085807, + -391.8365019326236, + 870.3226662047891 + ], + "orientation_deg": { + "roll": -145.61620198521257, + "pitch": 0.8654171756003077, + "yaw": 9.36855381166504 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -30.794242788755312, + -164.08564407171932, + -22.507806892526126 + ], + "orientation_deg": { + "roll": -0.45705684450102557, + "pitch": -0.8967087378316065, + "yaw": 22.65187391201557 + } + }, + { + "id": 50, + "position_mm": [ + -0.11672215163707733, + -0.17282313108444214, + -0.1321684867143631 + ], + "orientation_deg": { + "roll": -0.6005742836564054, + "pitch": -0.9678794992233604, + "yaw": -1.1531996932804556 + } + }, + { + "id": 71, + "position_mm": [ + 140.2037811279297, + -0.2381918728351593, + -0.07032565027475357 + ], + "orientation_deg": { + "roll": 0.020662959547576784, + "pitch": -0.7074080623535008, + "yaw": 0.8247514024400335 + } + }, + { + "id": 76, + "position_mm": [ + -348.27662665557614, + 93.3320149212496, + -74.99925696164189 + ], + "orientation_deg": { + "roll": -65.01593054299546, + "pitch": 28.75392040343224, + "yaw": -118.07143690372222 + } + }, + { + "id": 101, + "position_mm": [ + -0.34317511320114136, + -80.63220977783203, + -0.38714420795440674 + ], + "orientation_deg": { + "roll": 1.6656829120101884, + "pitch": -1.3895397385295991, + "yaw": -0.664901758600084 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_annotated.jpg new file mode 100644 index 0000000..1a47401 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_overlay.png new file mode 100644 index 0000000..f9a17c3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984026346_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984423916.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984423916.jpg new file mode 100644 index 0000000..df56865 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984423916.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.csv new file mode 100644 index 0000000..c4cd5cd --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,568.04,-122.58,206.01,-108.959,2.536,80.790 +camera 1,132.64,-392.62,870.39,-145.560,1.126,9.504 +25,-24.51,-163.72,-20.23,-0.643,-1.064,22.959 +50,-0.12,-0.17,-0.13,0.002,-0.144,-0.946 +71,140.20,-0.24,-0.07,-0.435,-1.128,-0.138 +76,-349.14,92.63,-72.31,-4.310,2.877,-101.531 +101,-0.34,-80.63,-0.39,1.747,-1.418,-0.668 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.json new file mode 100644 index 0000000..c8101a6 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:13:44", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.14361824755575056, + "rms_refs_px_cam2": 1.486453367088356, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 568.0408592256763, + -122.58323391244227, + 206.01102886231138 + ], + "orientation_deg": { + "roll": -108.95949055167597, + "pitch": 2.536048318450639, + "yaw": 80.78951073231676 + } + }, + { + "id": "camera2", + "position_mm": [ + 132.63954458622973, + -392.6162448971413, + 870.3858886172936 + ], + "orientation_deg": { + "roll": -145.5597664462692, + "pitch": 1.1262006893128027, + "yaw": 9.503725357162974 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -24.508275929153058, + -163.72288140193217, + -20.234776382783092 + ], + "orientation_deg": { + "roll": -0.6430942373664048, + "pitch": -1.0641889498725823, + "yaw": 22.959199385113983 + } + }, + { + "id": 50, + "position_mm": [ + -0.1161637157201767, + -0.17121200263500214, + -0.13140764832496643 + ], + "orientation_deg": { + "roll": 0.002045073654830497, + "pitch": -0.14406190540627298, + "yaw": -0.9455955196608398 + } + }, + { + "id": 71, + "position_mm": [ + 140.20233154296875, + -0.23567268252372742, + -0.07045937329530716 + ], + "orientation_deg": { + "roll": -0.43458385330571747, + "pitch": -1.1282670073236487, + "yaw": -0.13780159395422265 + } + }, + { + "id": 76, + "position_mm": [ + -349.1350705883248, + 92.62634207436537, + -72.31244230502043 + ], + "orientation_deg": { + "roll": -4.309808634762109, + "pitch": 2.877486626782406, + "yaw": -101.53111308074207 + } + }, + { + "id": 101, + "position_mm": [ + -0.34242501854896545, + -80.62696075439453, + -0.3858640491962433 + ], + "orientation_deg": { + "roll": 1.7474489465290335, + "pitch": -1.4184706472884612, + "yaw": -0.6682187749972931 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_annotated.jpg new file mode 100644 index 0000000..e7b5422 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_overlay.png new file mode 100644 index 0000000..07da245 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984423916_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984522116.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984522116.jpg new file mode 100644 index 0000000..244411c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984522116.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.csv new file mode 100644 index 0000000..52ae109 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,569.01,-123.77,206.98,-109.015,2.581,80.668 +camera 1,120.40,-392.76,870.50,-145.668,0.443,9.251 +25,-26.34,-163.98,-20.84,-0.830,-0.854,23.432 +50,-0.11,-0.17,-0.13,-0.411,-0.898,-1.635 +71,140.20,-0.24,-0.07,0.135,-2.203,0.065 +76,-346.29,92.82,-74.42,-1.809,3.289,-102.686 +101,-0.34,-80.63,-0.38,1.560,-1.268,-0.255 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.json new file mode 100644 index 0000000..d9b506a --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:15:22", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.14339092733501874, + "rms_refs_px_cam2": 1.48538169022083, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 569.012719401906, + -123.77271520246221, + 206.9812752358997 + ], + "orientation_deg": { + "roll": -109.01502307430951, + "pitch": 2.580942589907844, + "yaw": 80.66774265521296 + } + }, + { + "id": "camera2", + "position_mm": [ + 120.40166190455439, + -392.75847840963587, + 870.5027888540226 + ], + "orientation_deg": { + "roll": -145.6684514677628, + "pitch": 0.44289990861819467, + "yaw": 9.251001739339477 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + -26.336108950195445, + -163.98192508377795, + -20.840991125461866 + ], + "orientation_deg": { + "roll": -0.8297087552681847, + "pitch": -0.8542300937930276, + "yaw": 23.43220281964389 + } + }, + { + "id": 50, + "position_mm": [ + -0.11482050269842148, + -0.17075540125370026, + -0.13083070516586304 + ], + "orientation_deg": { + "roll": -0.41140347871644806, + "pitch": -0.89780613003504, + "yaw": -1.6348028220161026 + } + }, + { + "id": 71, + "position_mm": [ + 140.20272827148438, + -0.23590612411499023, + -0.0701788142323494 + ], + "orientation_deg": { + "roll": 0.13549488829959241, + "pitch": -2.202767033002062, + "yaw": 0.06475162796274316 + } + }, + { + "id": 76, + "position_mm": [ + -346.2908856007315, + 92.82124440625405, + -74.41925658912074 + ], + "orientation_deg": { + "roll": -1.8086145091611459, + "pitch": 3.288748502073137, + "yaw": -102.68595633699232 + } + }, + { + "id": 101, + "position_mm": [ + -0.33675965666770935, + -80.62589263916016, + -0.38277938961982727 + ], + "orientation_deg": { + "roll": 1.560009641162778, + "pitch": -1.267952267228136, + "yaw": -0.25537864781745906 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_annotated.jpg new file mode 100644 index 0000000..5a53508 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_overlay.png new file mode 100644 index 0000000..6d6cf18 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765984522116_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985043290.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765985043290.jpg new file mode 100644 index 0000000..5b57efb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985043290.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985202679.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765985202679.jpg new file mode 100644 index 0000000..6d2333a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985202679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.csv new file mode 100644 index 0000000..78f77fb --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.csv @@ -0,0 +1,10 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,571.29,-110.36,206.44,-108.964,2.644,83.110 +camera 1,139.29,-397.63,870.83,-145.763,0.912,8.220 +0,-341.00,185.33,-60.26,0.117,-2.140,4.963 +3,-322.40,233.53,77.50,-1.434,-1.655,6.453 +50,-0.18,-0.15,-0.16,-0.658,-0.354,-0.208 +71,140.11,-0.15,-0.11,-0.712,-0.647,0.564 +76,-336.83,57.13,-77.49,-0.473,3.635,-61.160 +101,-0.48,-80.60,-0.44,0.546,-0.702,-2.288 +132,105.31,-65.22,-39.52,4.580,-45.739,96.607 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.json new file mode 100644 index 0000000..1998137 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam.json @@ -0,0 +1,136 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:26:42", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.18028734939645003, + "rms_refs_px_cam2": 1.4415145252690627, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 571.290416992725, + -110.36192462531064, + 206.437149872754 + ], + "orientation_deg": { + "roll": -108.96395656619337, + "pitch": 2.643524246286837, + "yaw": 83.10971497308797 + } + }, + { + "id": "camera2", + "position_mm": [ + 139.2924792441294, + -397.63478966342853, + 870.8337055042575 + ], + "orientation_deg": { + "roll": -145.76304980411376, + "pitch": 0.9119025160659772, + "yaw": 8.219774625822726 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + -340.9952462476045, + 185.32755700096033, + -60.26218322521248 + ], + "orientation_deg": { + "roll": 0.11654709841778052, + "pitch": -2.139693260253249, + "yaw": 4.9626287362815935 + } + }, + { + "id": 3, + "position_mm": [ + -322.39981841486224, + 233.52979482548702, + 77.49787418750442 + ], + "orientation_deg": { + "roll": -1.4344781069045305, + "pitch": -1.6545813355210608, + "yaw": 6.452604194084495 + } + }, + { + "id": 50, + "position_mm": [ + -0.17872831225395203, + -0.15418027341365814, + -0.1590033918619156 + ], + "orientation_deg": { + "roll": -0.6583963547154522, + "pitch": -0.35368403748155, + "yaw": -0.2081142969109439 + } + }, + { + "id": 71, + "position_mm": [ + 140.10931396484375, + -0.14529067277908325, + -0.11451113969087601 + ], + "orientation_deg": { + "roll": -0.7123747969451659, + "pitch": -0.6472720914240855, + "yaw": 0.5640886871638274 + } + }, + { + "id": 76, + "position_mm": [ + -336.82850321335326, + 57.13358900333693, + -77.48627874402858 + ], + "orientation_deg": { + "roll": -0.4726008509317322, + "pitch": 3.634862167552307, + "yaw": -61.160257866844695 + } + }, + { + "id": 101, + "position_mm": [ + -0.48486119508743286, + -80.5984878540039, + -0.43585479259490967 + ], + "orientation_deg": { + "roll": 0.5462511553513129, + "pitch": -0.7024753667827299, + "yaw": -2.2880926399137183 + } + }, + { + "id": 132, + "position_mm": [ + 105.30974017015257, + -65.2201071095458, + -39.52231897707848 + ], + "orientation_deg": { + "roll": 4.580115383838799, + "pitch": -45.73890004078482, + "yaw": 96.60668849554743 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_annotated.jpg new file mode 100644 index 0000000..241233e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_overlay.png new file mode 100644 index 0000000..56b9a1f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985202679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985564964.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765985564964.jpg new file mode 100644 index 0000000..91dc8c0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985564964.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.csv new file mode 100644 index 0000000..673ab37 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.csv @@ -0,0 +1,10 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,572.61,-111.34,207.19,-108.989,2.559,83.069 +camera 1,142.37,-387.44,877.11,-146.431,1.112,8.413 +0,-332.01,174.56,-82.96,69.660,31.208,27.825 +3,-236.31,232.09,55.41,0.306,-0.846,7.134 +50,-0.18,-0.16,-0.16,-0.577,-0.389,-0.248 +71,140.11,-0.15,-0.11,-0.236,-1.113,0.554 +76,-332.30,49.87,-67.06,-35.539,59.060,-82.606 +101,-0.48,-80.61,-0.43,2.248,-0.233,-2.388 +132,105.60,-66.13,-37.12,4.837,-45.066,96.629 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.json new file mode 100644 index 0000000..a1c9282 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam.json @@ -0,0 +1,136 @@ +{ + "metadata": { + "timestamp": "2025-12-17 15:32:45", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1799119039626923, + "rms_refs_px_cam2": 1.4444582411296125, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 572.6101595416368, + -111.34094806668504, + 207.18517812794173 + ], + "orientation_deg": { + "roll": -108.98942106374847, + "pitch": 2.5589208798866228, + "yaw": 83.06932731475982 + } + }, + { + "id": "camera2", + "position_mm": [ + 142.3733585703294, + -387.44110369919247, + 877.1095330177003 + ], + "orientation_deg": { + "roll": -146.4308679647237, + "pitch": 1.112031204244544, + "yaw": 8.413293434404276 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + -332.01092053918296, + 174.557452319959, + -82.96293507775887 + ], + "orientation_deg": { + "roll": 69.65953657652382, + "pitch": 31.20782249992858, + "yaw": 27.82511642004071 + } + }, + { + "id": 3, + "position_mm": [ + -236.3115017420563, + 232.0876572467484, + 55.407077740552864 + ], + "orientation_deg": { + "roll": 0.30556479642041523, + "pitch": -0.8457673929630987, + "yaw": 7.134241686047903 + } + }, + { + "id": 50, + "position_mm": [ + -0.17593957483768463, + -0.15684159100055695, + -0.15517771244049072 + ], + "orientation_deg": { + "roll": -0.5773262396720339, + "pitch": -0.38879453558544863, + "yaw": -0.24787154432286249 + } + }, + { + "id": 71, + "position_mm": [ + 140.1126708984375, + -0.14905698597431183, + -0.11005648225545883 + ], + "orientation_deg": { + "roll": -0.2363559765071988, + "pitch": -1.1129466233370549, + "yaw": 0.5541171521437226 + } + }, + { + "id": 76, + "position_mm": [ + -332.3030512616984, + 49.871539470219716, + -67.06288383772785 + ], + "orientation_deg": { + "roll": -35.53881068721189, + "pitch": 59.06015335191057, + "yaw": -82.60602528241853 + } + }, + { + "id": 101, + "position_mm": [ + -0.47918304800987244, + -80.60713195800781, + -0.42628371715545654 + ], + "orientation_deg": { + "roll": 2.2478735860076093, + "pitch": -0.23346639653237852, + "yaw": -2.387976493918997 + } + }, + { + "id": 132, + "position_mm": [ + 105.60410544005322, + -66.13412082362002, + -37.118164999303424 + ], + "orientation_deg": { + "roll": 4.836829347098161, + "pitch": -45.065545622550026, + "yaw": 96.62920462158365 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_annotated.jpg new file mode 100644 index 0000000..a952a07 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_overlay.png new file mode 100644 index 0000000..d0cde15 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765985564964_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1765986934521.jpg b/appVideoServer/public/snapshots/snapshot_video0_1765986934521.jpg new file mode 100644 index 0000000..018847c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1765986934521.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766001304045.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766001304045.jpg new file mode 100644 index 0000000..14d8c87 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766001304045.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.csv new file mode 100644 index 0000000..15388a4 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.csv @@ -0,0 +1,12 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,571.32,-110.68,206.32,-108.957,2.560,83.099 +camera 1,311.68,-327.79,875.88,-146.506,-2.869,38.903 +0,-317.68,147.18,-41.19,80.783,46.068,48.363 +2,-155.07,288.65,73.61,-0.639,-2.045,4.153 +3,-259.43,231.82,44.33,3.127,-3.422,6.183 +5,-698.36,252.31,-98.52,3.016,-0.024,8.298 +6,-256.70,403.82,86.68,101.618,30.677,46.417 +50,-0.00,-0.12,-0.05,-0.402,-0.535,-0.798 +71,140.36,-0.24,0.02,-0.092,-0.814,-0.665 +76,-351.33,54.76,-86.13,-60.985,54.283,-89.375 +101,-0.08,-80.45,-0.18,2.511,-2.413,-0.593 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.json new file mode 100644 index 0000000..fb1e948 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam.json @@ -0,0 +1,162 @@ +{ + "metadata": { + "timestamp": "2025-12-17 19:55:04", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.17973134219001713, + "rms_refs_px_cam2": 1.0213580783912273, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 571.3213276253481, + -110.67781840096202, + 206.3244083576825 + ], + "orientation_deg": { + "roll": -108.95737113598457, + "pitch": 2.559864080405289, + "yaw": 83.09909122314785 + } + }, + { + "id": "camera2", + "position_mm": [ + 311.6776715653086, + -327.7939002062464, + 875.8793977407586 + ], + "orientation_deg": { + "roll": -146.50623027061204, + "pitch": -2.869426548648885, + "yaw": 38.90302939731788 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + -317.68056426341474, + 147.1791999141276, + -41.1911213669337 + ], + "orientation_deg": { + "roll": 80.78260453268514, + "pitch": 46.06758686683451, + "yaw": 48.3633304972413 + } + }, + { + "id": 2, + "position_mm": [ + -155.067574118687, + 288.64703294370327, + 73.61204346544758 + ], + "orientation_deg": { + "roll": -0.6390225287267141, + "pitch": -2.045376235299828, + "yaw": 4.153410421999245 + } + }, + { + "id": 3, + "position_mm": [ + -259.42908650222296, + 231.81924104514522, + 44.333084301336754 + ], + "orientation_deg": { + "roll": 3.127204128590182, + "pitch": -3.421750223080671, + "yaw": 6.18331233987481 + } + }, + { + "id": 5, + "position_mm": [ + -698.3558624107734, + 252.3140755214493, + -98.52431455543143 + ], + "orientation_deg": { + "roll": 3.015934545514524, + "pitch": -0.02415539109337906, + "yaw": 8.297791388996595 + } + }, + { + "id": 6, + "position_mm": [ + -256.6979073592588, + 403.81535238014015, + 86.67955685168383 + ], + "orientation_deg": { + "roll": 101.61778960150203, + "pitch": 30.677494935195288, + "yaw": 46.416506505276345 + } + }, + { + "id": 50, + "position_mm": [ + -0.0014862639363855124, + -0.11665172129869461, + -0.04720449820160866 + ], + "orientation_deg": { + "roll": -0.40171100419350686, + "pitch": -0.5352939557154193, + "yaw": -0.7975993422857763 + } + }, + { + "id": 71, + "position_mm": [ + 140.35922241210938, + -0.23577377200126648, + 0.022585570812225342 + ], + "orientation_deg": { + "roll": -0.09240348932546262, + "pitch": -0.8138684472910421, + "yaw": -0.6646988157283719 + } + }, + { + "id": 76, + "position_mm": [ + -351.32682947964634, + 54.761155014794674, + -86.12827540385248 + ], + "orientation_deg": { + "roll": -60.98540082912284, + "pitch": 54.28330320875033, + "yaw": -89.37452160539597 + } + }, + { + "id": 101, + "position_mm": [ + -0.07929059863090515, + -80.45175170898438, + -0.17939308285713196 + ], + "orientation_deg": { + "roll": 2.5113912677746004, + "pitch": -2.4129946698392395, + "yaw": -0.5929881051862044 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_annotated.jpg new file mode 100644 index 0000000..28259ed Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_overlay.png new file mode 100644 index 0000000..2c845d6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766001304045_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766140800391.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766140800391.jpg new file mode 100644 index 0000000..5222023 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766140800391.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.csv new file mode 100644 index 0000000..8fd96b5 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,548.32,-152.74,205.92,-108.982,2.760,77.269 +camera 1,257.07,-339.94,866.04,-145.133,-3.405,36.867 +50,0.11,-0.20,-0.01,-0.648,-0.351,-0.520 +71,140.85,-0.58,0.23,-0.387,-1.025,0.278 +76,41.31,114.47,-63.17,3.464,4.638,-56.601 +101,0.20,-80.63,-0.10,0.842,-1.185,-1.134 +132,167.90,103.13,-66.81,33.180,-50.128,69.282 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.json new file mode 100644 index 0000000..1d3db9d --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-19 10:40:00", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.21699357374063, + "rms_refs_px_cam2": 1.6068504921603164, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 548.3166713622935, + -152.73793888034038, + 205.9241167607473 + ], + "orientation_deg": { + "roll": -108.98151681176743, + "pitch": 2.760150453090405, + "yaw": 77.26931532266194 + } + }, + { + "id": "camera2", + "position_mm": [ + 257.07483943769716, + -339.941244159234, + 866.0388369512659 + ], + "orientation_deg": { + "roll": -145.13299579073035, + "pitch": -3.4047957168623837, + "yaw": 36.867242655870896 + } + } + ], + "markers": [ + { + "id": 50, + "position_mm": [ + 0.10929243266582489, + -0.20275987684726715, + -0.014005294069647789 + ], + "orientation_deg": { + "roll": -0.6477093887082062, + "pitch": -0.3510980086225599, + "yaw": -0.520063967107545 + } + }, + { + "id": 71, + "position_mm": [ + 140.851806640625, + -0.5847612619400024, + 0.23345375061035156 + ], + "orientation_deg": { + "roll": -0.3874741376268988, + "pitch": -1.0248699551873108, + "yaw": 0.27828161360873177 + } + }, + { + "id": 76, + "position_mm": [ + 41.31191312223098, + 114.47001076268131, + -63.17296612742573 + ], + "orientation_deg": { + "roll": 3.4643468721084862, + "pitch": 4.637649149061208, + "yaw": -56.60078642529136 + } + }, + { + "id": 101, + "position_mm": [ + 0.20057077705860138, + -80.63484191894531, + -0.10195142030715942 + ], + "orientation_deg": { + "roll": 0.8415740667033459, + "pitch": -1.1849887066378546, + "yaw": -1.1336845340742117 + } + }, + { + "id": 132, + "position_mm": [ + 167.90299657260343, + 103.13298824720995, + -66.81064358038446 + ], + "orientation_deg": { + "roll": 33.17968075835013, + "pitch": -50.128195673492534, + "yaw": 69.28156896967248 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_annotated.jpg new file mode 100644 index 0000000..77a3496 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_overlay.png new file mode 100644 index 0000000..923a942 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766140800391_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766153425223.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766153425223.jpg new file mode 100644 index 0000000..a7c0a5e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766153425223.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.csv new file mode 100644 index 0000000..b92bd93 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,548.48,-154.25,206.09,-108.981,2.718,77.132 +camera 1,279.73,-321.17,864.86,-145.168,-1.669,37.320 +50,0.12,-0.21,-0.01,-0.438,-0.544,-1.254 +71,140.87,-0.59,0.26,-0.014,-0.640,0.179 +76,41.85,107.24,-53.29,7.336,53.370,-51.881 +101,0.22,-80.65,-0.08,0.434,-1.444,-0.425 +132,166.94,95.07,-54.88,36.483,-50.367,66.273 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.json new file mode 100644 index 0000000..b795b27 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-19 14:10:25", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.21782029860802826, + "rms_refs_px_cam2": 1.6125835128034123, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 548.482036445665, + -154.24748997961535, + 206.09488929833768 + ], + "orientation_deg": { + "roll": -108.98087172318827, + "pitch": 2.717578988842748, + "yaw": 77.13249577659853 + } + }, + { + "id": "camera2", + "position_mm": [ + 279.7276890303734, + -321.17391644659, + 864.8617040136696 + ], + "orientation_deg": { + "roll": -145.16797421513468, + "pitch": -1.6687484095783436, + "yaw": 37.31979625195847 + } + } + ], + "markers": [ + { + "id": 50, + "position_mm": [ + 0.11613879352807999, + -0.2061414271593094, + -0.005414761137217283 + ], + "orientation_deg": { + "roll": -0.43761686725368676, + "pitch": -0.5441712549766012, + "yaw": -1.2540489407415614 + } + }, + { + "id": 71, + "position_mm": [ + 140.86651611328125, + -0.5887600183486938, + 0.2555651068687439 + ], + "orientation_deg": { + "roll": -0.013924763681254624, + "pitch": -0.6403205376906418, + "yaw": 0.17863287641529105 + } + }, + { + "id": 76, + "position_mm": [ + 41.85047216858795, + 107.23893472991297, + -53.29297623164575 + ], + "orientation_deg": { + "roll": 7.336149856697958, + "pitch": 53.37024408605556, + "yaw": -51.88073262144033 + } + }, + { + "id": 101, + "position_mm": [ + 0.22036156058311462, + -80.64705657958984, + -0.07745099812746048 + ], + "orientation_deg": { + "roll": 0.4340113889350541, + "pitch": -1.4443555183511319, + "yaw": -0.42511308441778006 + } + }, + { + "id": 132, + "position_mm": [ + 166.93851488034102, + 95.06512411229295, + -54.881707286849604 + ], + "orientation_deg": { + "roll": 36.48348306997345, + "pitch": -50.36663205576951, + "yaw": 66.2725590180938 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_annotated.jpg new file mode 100644 index 0000000..d055435 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_overlay.png new file mode 100644 index 0000000..99fd71b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766153425223_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766162159752.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766162159752.jpg new file mode 100644 index 0000000..89aa9c9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766162159752.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.csv new file mode 100644 index 0000000..6907077 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.csv @@ -0,0 +1,7 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,552.75,-152.39,207.51,-109.106,2.607,78.917 +camera 1,537.17,-398.06,591.20,-133.077,-1.828,53.536 +50,-0.01,0.01,-0.01,-0.747,-0.831,-1.361 +71,139.86,0.17,-0.22,0.184,-1.079,-0.157 +101,-0.09,-80.02,-0.05,1.389,-1.615,-0.935 +132,143.84,110.03,-56.62,100.606,-36.456,31.544 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.json new file mode 100644 index 0000000..7c2fed4 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam.json @@ -0,0 +1,97 @@ +{ + "metadata": { + "timestamp": "2025-12-19 16:36:00", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.30742605937193207, + "rms_refs_px_cam2": 0.08891640185021116, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 552.7484176597131, + -152.38838000119364, + 207.51357891504173 + ], + "orientation_deg": { + "roll": -109.10628135823755, + "pitch": 2.60690775728556, + "yaw": 78.91698543996296 + } + }, + { + "id": "camera2", + "position_mm": [ + 537.1745482120374, + -398.056612343999, + 591.1974034915366 + ], + "orientation_deg": { + "roll": -133.07702887860844, + "pitch": -1.8276042282267837, + "yaw": 53.53593372982741 + } + } + ], + "markers": [ + { + "id": 50, + "position_mm": [ + -0.013732826337218285, + 0.01329843420535326, + -0.014085437171161175 + ], + "orientation_deg": { + "roll": -0.7473059441069548, + "pitch": -0.8312904488681926, + "yaw": -1.3614978777032232 + } + }, + { + "id": 71, + "position_mm": [ + 139.85699462890625, + 0.1695723831653595, + -0.2202814817428589 + ], + "orientation_deg": { + "roll": 0.18426539916260973, + "pitch": -1.079119081330257, + "yaw": -0.1569508417816471 + } + }, + { + "id": 101, + "position_mm": [ + -0.08536335825920105, + -80.01598358154297, + -0.05290792137384415 + ], + "orientation_deg": { + "roll": 1.3890485194368585, + "pitch": -1.6150460242013673, + "yaw": -0.9352674408966456 + } + }, + { + "id": 132, + "position_mm": [ + 143.8401742221435, + 110.03296467081225, + -56.62137505744403 + ], + "orientation_deg": { + "roll": 100.60563976973981, + "pitch": -36.455861411581324, + "yaw": 31.54357868116066 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_annotated.jpg new file mode 100644 index 0000000..81a3362 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_overlay.png new file mode 100644 index 0000000..c804831 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766162159752_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766264271874.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766264271874.jpg new file mode 100644 index 0000000..86a2fa5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766264271874.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.csv new file mode 100644 index 0000000..0b461e2 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,537.71,-399.86,595.47,-133.072,-0.159,57.695 +camera 1,551.80,-155.99,203.31,-109.684,2.075,77.622 +50,0.01,-0.01,0.01,0.848,-2.004,-2.393 +71,140.20,-0.02,0.04,0.844,-3.020,-1.387 +76,19.71,112.07,-56.51,-127.162,73.313,-175.254 +101,0.01,-80.01,0.00,1.105,0.847,-0.951 +132,119.05,145.10,-104.13,99.161,-35.367,33.507 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.json new file mode 100644 index 0000000..65fcce0 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-20 20:57:52", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.17277868713923025, + "rms_refs_px_cam2": 0.1332332421847206, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 537.711992507364, + -399.86352814138337, + 595.4654753839357 + ], + "orientation_deg": { + "roll": -133.0720718202858, + "pitch": -0.1588835348307048, + "yaw": 57.69478231130987 + } + }, + { + "id": "camera2", + "position_mm": [ + 551.8042735652496, + -155.98895236659922, + 203.31364825255645 + ], + "orientation_deg": { + "roll": -109.68431276670836, + "pitch": 2.0754037012043596, + "yaw": 77.62184147462736 + } + } + ], + "markers": [ + { + "id": 50, + "position_mm": [ + 0.01477504801005125, + -0.014204374514520168, + 0.006489738821983337 + ], + "orientation_deg": { + "roll": 0.8484500897107282, + "pitch": -2.0040808253585176, + "yaw": -2.393104002385181 + } + }, + { + "id": 71, + "position_mm": [ + 140.1990203857422, + -0.016169482842087746, + 0.04245743528008461 + ], + "orientation_deg": { + "roll": 0.8437782538854284, + "pitch": -3.0201670176655746, + "yaw": -1.3873703838917586 + } + }, + { + "id": 76, + "position_mm": [ + 19.707166504227438, + 112.07208408533309, + -56.511149746867 + ], + "orientation_deg": { + "roll": -127.16150231687106, + "pitch": 73.31252581577519, + "yaw": -175.25388937274045 + } + }, + { + "id": 101, + "position_mm": [ + 0.010714665055274963, + -80.01448822021484, + 0.004165054298937321 + ], + "orientation_deg": { + "roll": 1.105201394125856, + "pitch": 0.8471486477000554, + "yaw": -0.9507419318282913 + } + }, + { + "id": 132, + "position_mm": [ + 119.05258011793646, + 145.09956381735012, + -104.12533215415488 + ], + "orientation_deg": { + "roll": 99.16111857805454, + "pitch": -35.3673288214619, + "yaw": 33.50748424508551 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_annotated.jpg new file mode 100644 index 0000000..e202fd1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_overlay.png new file mode 100644 index 0000000..802e7bb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766264271874_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766265213895.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766265213895.jpg new file mode 100644 index 0000000..6855744 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766265213895.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.csv new file mode 100644 index 0000000..e33e9ef --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,538.36,-397.67,598.05,-133.214,-0.160,57.745 +camera 1,552.41,-152.80,203.03,-109.686,2.132,77.779 +25,122.60,-109.80,-36.98,19.082,-4.066,20.680 +50,0.01,-0.01,0.01,103.842,55.883,66.364 +71,140.19,-0.02,0.04,0.213,0.145,-0.199 +76,19.32,115.71,-59.04,-2.907,-2.770,-59.446 +101,0.01,-80.02,0.00,92.058,60.003,61.777 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.json new file mode 100644 index 0000000..6d42064 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-20 21:13:34", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 0.1652752668793435, + "rms_refs_px_cam2": 0.12594444814989847, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 538.3638641376389, + -397.66514489062075, + 598.0546044056346 + ], + "orientation_deg": { + "roll": -133.2138637755646, + "pitch": -0.15953351500901095, + "yaw": 57.74541414423216 + } + }, + { + "id": "camera2", + "position_mm": [ + 552.4108181379967, + -152.79828344087093, + 203.02927612526983 + ], + "orientation_deg": { + "roll": -109.68623415663612, + "pitch": 2.132192749711759, + "yaw": 77.77886007952844 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 122.6041436640939, + -109.80002050024484, + -36.983352793288795 + ], + "orientation_deg": { + "roll": 19.08208025581592, + "pitch": -4.065574209144571, + "yaw": 20.680181268591383 + } + }, + { + "id": 50, + "position_mm": [ + 0.01372603327035904, + -0.01326100341975689, + 0.005988363642245531 + ], + "orientation_deg": { + "roll": 103.8421962711634, + "pitch": 55.88327927809685, + "yaw": 66.36421847070669 + } + }, + { + "id": 71, + "position_mm": [ + 140.19342041015625, + -0.01813233084976673, + 0.043524760752916336 + ], + "orientation_deg": { + "roll": 0.213030841197055, + "pitch": 0.14549701521385908, + "yaw": -0.1989049342226733 + } + }, + { + "id": 76, + "position_mm": [ + 19.31950005182692, + 115.70728915674233, + -59.03566385723635 + ], + "orientation_deg": { + "roll": -2.90693318726632, + "pitch": -2.7699963238791323, + "yaw": -59.446257122562265 + } + }, + { + "id": 101, + "position_mm": [ + 0.011935349553823471, + -80.01568603515625, + 0.0048261648043990135 + ], + "orientation_deg": { + "roll": 92.05778645662274, + "pitch": 60.00282987542181, + "yaw": 61.77731355876742 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_annotated.jpg new file mode 100644 index 0000000..1d237b8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_overlay.png new file mode 100644 index 0000000..2b3f0cc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766265213895_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766399752172.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766399752172.jpg new file mode 100644 index 0000000..6edc581 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766399752172.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.csv b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.csv new file mode 100644 index 0000000..eecf480 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.csv @@ -0,0 +1,8 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg +camera 0,529.14,-367.73,599.26,-133.061,-0.957,67.977 +camera 1,554.01,-154.67,205.64,-109.848,2.234,77.623 +25,121.80,-110.90,-38.44,18.286,-2.799,21.383 +50,0.15,-0.01,0.08,-0.359,1.492,-1.037 +71,141.40,-0.26,0.74,-0.346,-0.355,0.399 +76,14.59,118.74,-66.86,-101.753,74.869,-145.423 +101,0.03,-80.01,0.01,1.392,-1.124,-1.184 diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.json b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.json new file mode 100644 index 0000000..5865519 --- /dev/null +++ b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam.json @@ -0,0 +1,110 @@ +{ + "metadata": { + "timestamp": "2025-12-22 10:35:52", + "reference_markers": [ + 50, + 71, + 101 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 1.0925027535199345, + "rms_refs_px_cam2": 0.12690815956974966, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 529.1428506422849, + -367.7260845899638, + 599.257449109653 + ], + "orientation_deg": { + "roll": -133.06071674228517, + "pitch": -0.9566664912072801, + "yaw": 67.97683172425367 + } + }, + { + "id": "camera2", + "position_mm": [ + 554.005148438832, + -154.66779323704438, + 205.64422548868947 + ], + "orientation_deg": { + "roll": -109.84793578175285, + "pitch": 2.2342848831327466, + "yaw": 77.62347503841197 + } + } + ], + "markers": [ + { + "id": 25, + "position_mm": [ + 121.80202178408861, + -110.8959125126377, + -38.43581051382117 + ], + "orientation_deg": { + "roll": 18.28565135520694, + "pitch": -2.7991422921113576, + "yaw": 21.383293625221604 + } + }, + { + "id": 50, + "position_mm": [ + 0.15028835833072662, + -0.012044982053339481, + 0.07587198913097382 + ], + "orientation_deg": { + "roll": -0.35945177873336015, + "pitch": 1.492246963653603, + "yaw": -1.0370119078615614 + } + }, + { + "id": 71, + "position_mm": [ + 141.40170288085938, + -0.26344606280326843, + 0.7420166730880737 + ], + "orientation_deg": { + "roll": -0.3456604182282569, + "pitch": -0.35506485100331653, + "yaw": 0.39942180487304996 + } + }, + { + "id": 76, + "position_mm": [ + 14.587374511456419, + 118.74356087826587, + -66.86334731956211 + ], + "orientation_deg": { + "roll": -101.75279713242942, + "pitch": 74.86860873627442, + "yaw": -145.42314962671264 + } + }, + { + "id": 101, + "position_mm": [ + 0.034710921347141266, + -80.01493072509766, + 0.01429597195237875 + ], + "orientation_deg": { + "roll": 1.3921364687046074, + "pitch": -1.123541347228469, + "yaw": -1.1835484502839635 + } + } + ] +} \ No newline at end of file diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_annotated.jpg new file mode 100644 index 0000000..02ff60c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_overlay.png new file mode 100644 index 0000000..55526ae Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video0_1766399752172_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765974554630.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765974554630.jpg new file mode 100644 index 0000000..1e99fce Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765974554630.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975245635.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975245635.jpg new file mode 100644 index 0000000..5c68c9c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975245635.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975263688.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975263688.jpg new file mode 100644 index 0000000..f278754 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975263688.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975271097.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975271097.jpg new file mode 100644 index 0000000..10f90cd Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975271097.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975298025.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975298025.jpg new file mode 100644 index 0000000..e45a37a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975298025.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975307378.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975307378.jpg new file mode 100644 index 0000000..d9e57eb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975307378.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975311865.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975311865.jpg new file mode 100644 index 0000000..6d11f16 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975311865.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975406077.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975406077.jpg new file mode 100644 index 0000000..f935305 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975406077.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975550136.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975550136.jpg new file mode 100644 index 0000000..51851ff Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975550136.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975572393.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975572393.jpg new file mode 100644 index 0000000..d4fc1d5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975572393.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975586723.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975586723.jpg new file mode 100644 index 0000000..9d1c9bb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975586723.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975609404.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975609404.jpg new file mode 100644 index 0000000..481d8ce Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975609404.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975626213.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975626213.jpg new file mode 100644 index 0000000..f5d94c3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975626213.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975638033.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975638033.jpg new file mode 100644 index 0000000..400496c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975638033.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975818850.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975818850.jpg new file mode 100644 index 0000000..fdd834e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975818850.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975871414.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975871414.jpg new file mode 100644 index 0000000..c52bc85 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975871414.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975946434.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975946434.jpg new file mode 100644 index 0000000..6499e5a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975946434.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975953050.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975953050.jpg new file mode 100644 index 0000000..f0f8523 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975953050.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975975116.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975975116.jpg new file mode 100644 index 0000000..901b750 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975975116.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975977082.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975977082.jpg new file mode 100644 index 0000000..8fb4cb5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975977082.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765975992301.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765975992301.jpg new file mode 100644 index 0000000..fb3cecd Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765975992301.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976004900.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976004900.jpg new file mode 100644 index 0000000..81a7d21 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976004900.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976061325.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976061325.jpg new file mode 100644 index 0000000..353fd70 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976061325.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976068034.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976068034.jpg new file mode 100644 index 0000000..47522e5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976068034.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976069357.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976069357.jpg new file mode 100644 index 0000000..2f9ddc2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976069357.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976152890.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976152890.jpg new file mode 100644 index 0000000..674aea5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976152890.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976162193.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976162193.jpg new file mode 100644 index 0000000..f2e5dd4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976162193.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976193421.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976193421.jpg new file mode 100644 index 0000000..c483ef0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976193421.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976371308.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976371308.jpg new file mode 100644 index 0000000..b69fca7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976371308.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976374401.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976374401.jpg new file mode 100644 index 0000000..433766e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976374401.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976443318.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976443318.jpg new file mode 100644 index 0000000..6ed11f1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976443318.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976445845.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976445845.jpg new file mode 100644 index 0000000..a3842b1 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976445845.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976495904.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976495904.jpg new file mode 100644 index 0000000..6565c85 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976495904.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976505906.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976505906.jpg new file mode 100644 index 0000000..b31156d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976505906.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976510318.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976510318.jpg new file mode 100644 index 0000000..1c2742c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976510318.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976511638.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976511638.jpg new file mode 100644 index 0000000..ae024c7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976511638.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976533542.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976533542.jpg new file mode 100644 index 0000000..ed4cbf3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976533542.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976536997.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976536997.jpg new file mode 100644 index 0000000..db5dc4e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976536997.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976569915.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976569915.jpg new file mode 100644 index 0000000..ee95272 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976569915.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976630411.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976630411.jpg new file mode 100644 index 0000000..c85811c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976630411.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976649818.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976649818.jpg new file mode 100644 index 0000000..c3a18c2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976649818.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976679114.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976679114.jpg new file mode 100644 index 0000000..912ba1b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976679114.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976686196.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976686196.jpg new file mode 100644 index 0000000..5db08ce Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976686196.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765976698396.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765976698396.jpg new file mode 100644 index 0000000..a680152 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765976698396.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765977934726.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765977934726.jpg new file mode 100644 index 0000000..e2006f6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765977934726.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978354760.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978354760.jpg new file mode 100644 index 0000000..a0eea14 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978354760.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978364728.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978364728.jpg new file mode 100644 index 0000000..71c2a9c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978364728.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978420185.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978420185.jpg new file mode 100644 index 0000000..f001ced Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978420185.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978422903.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978422903.jpg new file mode 100644 index 0000000..783e930 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978422903.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978427264.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978427264.jpg new file mode 100644 index 0000000..6cd63fe Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978427264.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978512243.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978512243.jpg new file mode 100644 index 0000000..29bc252 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978512243.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978528964.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978528964.jpg new file mode 100644 index 0000000..561ae68 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978528964.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978536535.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978536535.jpg new file mode 100644 index 0000000..5a9f453 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978536535.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765978552974.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765978552974.jpg new file mode 100644 index 0000000..c9c4e73 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765978552974.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979039260.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979039260.jpg new file mode 100644 index 0000000..038637b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979039260.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979096358.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979096358.jpg new file mode 100644 index 0000000..a9f6b16 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979096358.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979173960.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979173960.jpg new file mode 100644 index 0000000..56bf456 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979173960.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979387494.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979387494.jpg new file mode 100644 index 0000000..ea4f661 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979387494.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979423620.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979423620.jpg new file mode 100644 index 0000000..67bb44c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979423620.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979473565.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979473565.jpg new file mode 100644 index 0000000..3c8bd6d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979473565.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979612483.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979612483.jpg new file mode 100644 index 0000000..100643f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979612483.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979663973.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979663973.jpg new file mode 100644 index 0000000..4464c3d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979663973.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765979986834.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765979986834.jpg new file mode 100644 index 0000000..355f853 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765979986834.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980180276.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980180276.jpg new file mode 100644 index 0000000..0d50af8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980180276.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980184630.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980184630.jpg new file mode 100644 index 0000000..d0a7cb7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980184630.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980205019.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980205019.jpg new file mode 100644 index 0000000..b2c9ae9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980205019.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980305410.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980305410.jpg new file mode 100644 index 0000000..3253a00 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980305410.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980351368.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980351368.jpg new file mode 100644 index 0000000..bf3e345 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980351368.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980403972.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980403972.jpg new file mode 100644 index 0000000..73f2f46 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980403972.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980539344.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980539344.jpg new file mode 100644 index 0000000..e043478 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980539344.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980569984.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980569984.jpg new file mode 100644 index 0000000..96f6b88 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980569984.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765980901068.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765980901068.jpg new file mode 100644 index 0000000..0f2ad54 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765980901068.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765981040869.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765981040869.jpg new file mode 100644 index 0000000..49b2ccb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765981040869.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765981169256.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765981169256.jpg new file mode 100644 index 0000000..6b4a7f6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765981169256.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765981186514.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765981186514.jpg new file mode 100644 index 0000000..6a02987 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765981186514.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982285131.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982285131.jpg new file mode 100644 index 0000000..206d9ef Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982285131.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982297163.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982297163.jpg new file mode 100644 index 0000000..139b8e4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982297163.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982335864.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982335864.jpg new file mode 100644 index 0000000..239a920 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982335864.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_annotated.jpg new file mode 100644 index 0000000..fa8f39b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_overlay.png new file mode 100644 index 0000000..c06687a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982335864_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982346945.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982346945.jpg new file mode 100644 index 0000000..7eef204 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982346945.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982356361.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982356361.jpg new file mode 100644 index 0000000..88184c5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982356361.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_annotated.jpg new file mode 100644 index 0000000..29fe1d7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_overlay.png new file mode 100644 index 0000000..7c28a2e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982356361_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982577214.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982577214.jpg new file mode 100644 index 0000000..bb5359a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982577214.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_annotated.jpg new file mode 100644 index 0000000..ea7a82b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_overlay.png new file mode 100644 index 0000000..fc46d2b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982577214_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982614665.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982614665.jpg new file mode 100644 index 0000000..e9f0107 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982614665.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_annotated.jpg new file mode 100644 index 0000000..dc0196b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_overlay.png new file mode 100644 index 0000000..af8a376 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982614665_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982810098.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982810098.jpg new file mode 100644 index 0000000..a98c952 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982810098.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_annotated.jpg new file mode 100644 index 0000000..0a7dbe4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_overlay.png new file mode 100644 index 0000000..34497fb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982810098_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982917583.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982917583.jpg new file mode 100644 index 0000000..1c409d2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982917583.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_annotated.jpg new file mode 100644 index 0000000..a510aa7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_overlay.png new file mode 100644 index 0000000..5b5bb73 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982917583_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982930836.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982930836.jpg new file mode 100644 index 0000000..4d03b05 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982930836.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_annotated.jpg new file mode 100644 index 0000000..c757df6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_overlay.png new file mode 100644 index 0000000..512f3d0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765982930836_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983044369.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983044369.jpg new file mode 100644 index 0000000..d565b8e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983044369.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_annotated.jpg new file mode 100644 index 0000000..7a7521f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_overlay.png new file mode 100644 index 0000000..bd78412 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983044369_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983168563.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983168563.jpg new file mode 100644 index 0000000..495d6cb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983168563.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_annotated.jpg new file mode 100644 index 0000000..52eb471 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_overlay.png new file mode 100644 index 0000000..193f45d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983168563_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983229717.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983229717.jpg new file mode 100644 index 0000000..b97b3d8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983229717.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_annotated.jpg new file mode 100644 index 0000000..0d5784d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_overlay.png new file mode 100644 index 0000000..be911ae Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983229717_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983272872.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983272872.jpg new file mode 100644 index 0000000..abcfc2b Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983272872.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_annotated.jpg new file mode 100644 index 0000000..8c60b59 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_overlay.png new file mode 100644 index 0000000..a2a959e Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983272872_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983284896.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983284896.jpg new file mode 100644 index 0000000..f051630 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983284896.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983289679.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983289679.jpg new file mode 100644 index 0000000..254cf81 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983289679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_annotated.jpg new file mode 100644 index 0000000..46d8d6a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_overlay.png new file mode 100644 index 0000000..aaa31f2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983289679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983300286.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983300286.jpg new file mode 100644 index 0000000..cae0a27 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983300286.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_annotated.jpg new file mode 100644 index 0000000..60ab40c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_overlay.png new file mode 100644 index 0000000..68d404a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983300286_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983308213.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983308213.jpg new file mode 100644 index 0000000..70adaac Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983308213.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_annotated.jpg new file mode 100644 index 0000000..ce52711 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_overlay.png new file mode 100644 index 0000000..aaa31f2 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983308213_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983318221.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983318221.jpg new file mode 100644 index 0000000..2cb7449 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983318221.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_annotated.jpg new file mode 100644 index 0000000..758ed9a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_overlay.png new file mode 100644 index 0000000..8a3de15 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983318221_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983328113.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983328113.jpg new file mode 100644 index 0000000..bdc0ce5 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983328113.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_annotated.jpg new file mode 100644 index 0000000..be3fb5c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_overlay.png new file mode 100644 index 0000000..8a3de15 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983328113_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983393320.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983393320.jpg new file mode 100644 index 0000000..8f1a4b8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983393320.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_annotated.jpg new file mode 100644 index 0000000..29b7d8c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_overlay.png new file mode 100644 index 0000000..05cd5e8 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983393320_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983489899.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983489899.jpg new file mode 100644 index 0000000..196cee4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983489899.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_annotated.jpg new file mode 100644 index 0000000..dee6245 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_overlay.png new file mode 100644 index 0000000..b5946be Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983489899_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983500713.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983500713.jpg new file mode 100644 index 0000000..0d8700f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983500713.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_annotated.jpg new file mode 100644 index 0000000..a9e1192 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_overlay.png new file mode 100644 index 0000000..f5ea5dc Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983500713_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983532340.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983532340.jpg new file mode 100644 index 0000000..1421e32 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983532340.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_annotated.jpg new file mode 100644 index 0000000..e45d95c Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_overlay.png new file mode 100644 index 0000000..c5bd48a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983532340_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983824183.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983824183.jpg new file mode 100644 index 0000000..24f99f0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983824183.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_annotated.jpg new file mode 100644 index 0000000..74f9980 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_overlay.png new file mode 100644 index 0000000..6f3bdcb Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983824183_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983927709.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983927709.jpg new file mode 100644 index 0000000..0b0ed63 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983927709.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_annotated.jpg new file mode 100644 index 0000000..683a5f6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_overlay.png new file mode 100644 index 0000000..0c39830 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983927709_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983937679.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983937679.jpg new file mode 100644 index 0000000..ca3c14f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983937679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_annotated.jpg new file mode 100644 index 0000000..1a7397d Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_overlay.png new file mode 100644 index 0000000..b36d8db Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765983937679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984026346.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984026346.jpg new file mode 100644 index 0000000..c1bea12 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984026346.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_annotated.jpg new file mode 100644 index 0000000..fdb8b93 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_overlay.png new file mode 100644 index 0000000..f209f0f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984026346_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984423916.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984423916.jpg new file mode 100644 index 0000000..5314006 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984423916.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_annotated.jpg new file mode 100644 index 0000000..694caff Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_overlay.png new file mode 100644 index 0000000..9fdeeed Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984423916_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984522116.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984522116.jpg new file mode 100644 index 0000000..a0b71f6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984522116.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_annotated.jpg new file mode 100644 index 0000000..3584a87 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_overlay.png new file mode 100644 index 0000000..670df04 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765984522116_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985202679.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765985202679.jpg new file mode 100644 index 0000000..c9cbea4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985202679.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_annotated.jpg new file mode 100644 index 0000000..a3f4176 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_overlay.png new file mode 100644 index 0000000..82041b9 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985202679_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985564964.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765985564964.jpg new file mode 100644 index 0000000..ab8057a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985564964.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_annotated.jpg new file mode 100644 index 0000000..baac548 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_overlay.png new file mode 100644 index 0000000..b13166f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765985564964_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1765986934521.jpg b/appVideoServer/public/snapshots/snapshot_video1_1765986934521.jpg new file mode 100644 index 0000000..38fcf18 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1765986934521.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766001304045.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766001304045.jpg new file mode 100644 index 0000000..216d9a4 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766001304045.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_annotated.jpg new file mode 100644 index 0000000..8a5e3ed Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_overlay.png new file mode 100644 index 0000000..684a180 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766001304045_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766140800391.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766140800391.jpg new file mode 100644 index 0000000..70f9268 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766140800391.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_annotated.jpg new file mode 100644 index 0000000..0014334 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_overlay.png new file mode 100644 index 0000000..ad5be41 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766140800391_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766153425223.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766153425223.jpg new file mode 100644 index 0000000..dc946d6 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766153425223.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_annotated.jpg new file mode 100644 index 0000000..b8e94e3 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_overlay.png new file mode 100644 index 0000000..9c41853 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766153425223_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766162159752.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766162159752.jpg new file mode 100644 index 0000000..633cb63 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766162159752.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_annotated.jpg new file mode 100644 index 0000000..e9f456f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_overlay.png new file mode 100644 index 0000000..63d0558 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766162159752_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766264271874.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766264271874.jpg new file mode 100644 index 0000000..9f55c1f Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766264271874.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_annotated.jpg new file mode 100644 index 0000000..a6e7f68 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_overlay.png new file mode 100644 index 0000000..33c34e7 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766264271874_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766265213895.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766265213895.jpg new file mode 100644 index 0000000..052fc85 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766265213895.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_annotated.jpg new file mode 100644 index 0000000..a902354 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_overlay.png new file mode 100644 index 0000000..c325575 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766265213895_two_cam_overlay.png differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766399752172.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766399752172.jpg new file mode 100644 index 0000000..e21c8ad Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766399752172.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_annotated.jpg b/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_annotated.jpg new file mode 100644 index 0000000..1b0473a Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_annotated.jpg differ diff --git a/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_overlay.png b/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_overlay.png new file mode 100644 index 0000000..3c4b8e0 Binary files /dev/null and b/appVideoServer/public/snapshots/snapshot_video1_1766399752172_two_cam_overlay.png differ diff --git a/appVideoServer/public/videoService.js b/appVideoServer/public/videoService.js new file mode 100644 index 0000000..e42569f --- /dev/null +++ b/appVideoServer/public/videoService.js @@ -0,0 +1,221 @@ +// /public/videoService.js +// Client-side helper for consuming binary JPEG frames over WebSocket, +// decoding with createImageBitmap, and drawing to a canvas with RAF. +// For /ws/video0, supports sending control messages as JSON text. + +(function () { + class FrameRenderer { + constructor(canvas) { + this.canvas = canvas; + this.ctx = canvas.getContext('2d', { alpha: false, desynchronized: true, willReadFrequently: false }); + this.queue = []; + this.maxQueue = 2; // keep at most 2 pending frames to limit latency + this._rafId = null; + this._running = false; + this._lastDraw = 0; + } + enqueue(bitmap) { + if (this.queue.length >= this.maxQueue) { + // drop older frame to keep latency low + const old = this.queue.shift(); + if (old && 'close' in old) try { old.close(); } catch {} + } + this.queue.push(bitmap); + if (!this._running) this.start(); + } + start() { + if (this._running) return; + this._running = true; + const loop = (ts) => { + if (!this._running) return; + const frame = this.queue.shift(); + if (frame) { + const w = this.canvas.width, h = this.canvas.height; + this.ctx.drawImage(frame, 0, 0, w, h); + if ('close' in frame) try { frame.close(); } catch {} + this._lastDraw = ts; + } + this._rafId = requestAnimationFrame(loop); + }; + this._rafId = requestAnimationFrame(loop); + } + stop() { + this._running = false; + if (this._rafId) cancelAnimationFrame(this._rafId); + this._rafId = null; + // cleanup queued frames + while (this.queue.length) { + const f = this.queue.shift(); + if (f && 'close' in f) try { f.close(); } catch {} + } + // Clear canvas + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + } + } + + function prettyStatus(el, state, extra = '') { + const color = { + connecting: '#9eb8ff', + open: '#8cffbf', + closed: '#ff9e9e', + error: '#ffb167' + }[state] || '#e7eaf6'; + el.innerHTML = `${state.toUpperCase()}${extra ? ' — ' + extra : ''}`; + } + + async function blobToBitmap(blob) { + // createImageBitmap is widely supported; fallback to if needed + return createImageBitmap(blob); + } + + function parseWH(value) { + if (!value) return null; + const [w, h] = String(value).split('x').map(Number); + if (!w || !h) return null; + return { width: w, height: h }; + } + + function attachStream({ url, canvas, statusEl, control }) { + const renderer = new FrameRenderer(canvas); + let ws; + let reconnectDelay = 1000; + let closedOnPurpose = false; + + function connect() { + prettyStatus(statusEl, 'connecting', url); + ws = new WebSocket(url); + ws.binaryType = 'blob'; + + ws.onopen = () => { + reconnectDelay = 1000; + prettyStatus(statusEl, 'open', 'streaming…'); + // On connection, fetch the latest snapshot metadata so the UI can show + // the freshest overlay and CSV (prevents showing an old image cached in index.html). + if (control?.snapshotOutEl) { + fetch('/snapshots/latest', { cache: 'no-store' }) + .then(r => r.ok ? r.json() : Promise.reject(new Error('no snapshot'))) + .then((j) => { + if (!j?.ok) return; + const overlayPNG = (j.overlay ? `${j.overlay}?_t=${Date.now()}` : null); + const overlayCSV = (j.overlayCSV ? `${j.overlayCSV}?_t=${Date.now()}` : null); + if (overlayPNG) { + document.getElementById('overlayImg').src = overlayPNG; + } + if (window.readCSV && overlayCSV) { + window.readCSV.renderCSV('csvTable', overlayCSV); + } + // Show links to the latest snapshot in the snapshot output box (non-intrusive) + control.snapshotOutEl.innerHTML = `Latest snapshot: ${j.url}`; + }).catch(() => { + // ignore — no latest snapshot yet + }); + } + }; + + ws.onmessage = async (evt) => { + if (typeof evt.data === 'string') { + // Control/meta message + try { + const msg = JSON.parse(evt.data); + if (msg.type === 'error') { + console.warn('Server error:', msg.error); + prettyStatus(statusEl, 'error', msg.error); + } + if (msg.type === 'snapshot' && control?.snapshotOutEl) { + if (msg.ok && msg.url && msg.urlApp) { + // Use overlay URL and CSV provided by the server (fallback to expected names) + const overlayPNG = msg.overlay || msg.urlApp.replace('_annotated.jpg','_two_cam_overlay.png'); + // Prefer server-provided overlayCSV. If not present, derive from the original jpg name + const overlayCSV = msg.overlayCSV || msg.url.replace('.jpg','_two_cam.csv'); + + control.snapshotOutEl.innerHTML = + `Snapshot: ${msg.url}

` + + ` Recognized: ${msg.urlApp}
` + + ` Overlay: PNG Overlay`; + // Update overlay immediately — server now ensures files are ready before responding + document.getElementById('overlayImg').src = overlayPNG; + // Render CSV values into the csvTable container (if available) + if (window.readCSV) { + window.readCSV.renderCSV('csvTable', overlayCSV); + } + } else { + control.snapshotOutEl.textContent = 'Snapshot failed'; + } + } + } catch { + // ignore non-JSON text frames + } + return; + } + // Binary JPEG frame + const blob = evt.data; // Blob of image/jpeg + try { + const bmp = await blobToBitmap(blob); + renderer.enqueue(bmp); + } catch (err) { + console.warn('Bitmap decode failed:', err); + } + }; + + ws.onerror = () => { + prettyStatus(statusEl, 'error', 'network error'); + }; + + ws.onclose = () => { + renderer.stop(); + prettyStatus(statusEl, 'closed', closedOnPurpose ? 'by client' : 'retrying…'); + if (!closedOnPurpose) { + setTimeout(connect, reconnectDelay); + reconnectDelay = Math.min(reconnectDelay * 2, 10000); + } + }; + } + + connect(); + + // Attach controls if provided (video0) + if (control) { + const { resSelect, fpsSelect, qSelect, applyBtn, snapshotBtn, startBtn, stopBtn, snapshotOutEl } = control; + + applyBtn?.addEventListener('click', () => { + if (!ws || ws.readyState !== WebSocket.OPEN) return; + const wh = parseWH(resSelect?.value); + const fps = Number(fpsSelect?.value || 15); + const q = Number(qSelect?.value || 5); + ws.send(JSON.stringify({ + type: 'control', + action: 'setParams', + params: { + ...(wh || {}), + fps, + quality: q + } + })); + }); + + snapshotBtn?.addEventListener('click', () => { + if (!ws || ws.readyState !== WebSocket.OPEN) return; + snapshotOutEl.textContent = 'Taking snapshot…'; + ws.send(JSON.stringify({ type: 'control', action: 'snapshot' })); + }); + + startBtn?.addEventListener('click', () => { + if (!ws || ws.readyState !== WebSocket.OPEN) return; + ws.send(JSON.stringify({ type: 'control', action: 'start' })); + }); + + stopBtn?.addEventListener('click', () => { + if (!ws || ws.readyState !== WebSocket.OPEN) return; + ws.send(JSON.stringify({ type: 'control', action: 'stop' })); + }); + } + + return { + close: () => { closedOnPurpose = true; ws?.close(); renderer.stop(); } + }; + } + + window.VideoService = { + attachStream + }; +})(); \ No newline at end of file diff --git a/appVideoServer/server.js b/appVideoServer/server.js new file mode 100644 index 0000000..d799f5d --- /dev/null +++ b/appVideoServer/server.js @@ -0,0 +1,283 @@ +// server.js +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const https = require('https'); +const express = require('express'); +const helmet = require('helmet'); +const compression = require('compression'); +const WebSocket = require('ws'); + +const { FFmpegStreamer } = require('./programs/videoServer'); +const { pickDevices } = require('./programs/input'); +const driverWS = require("./programs/driver"); +const screenShot = require("./programs/screenShot") + +const {logHttpRequest, logTcpConnection, logHttpUpgrade, logWssConnected, + logWssClosed, connected, connectionLost} = require('./programs/log'); + + + +const PORT = Number(process.env.PORT || 8443); +const HOST = process.env.HOST || '0.0.0.0'; + +// --- TLS --- +const TLS_DIR = path.resolve(__dirname, 'https'); +const serverOptions = { + key: fs.readFileSync(path.join(TLS_DIR, 'server.key')), + cert: fs.readFileSync(path.join(TLS_DIR, 'server.crt')), + ...(fs.existsSync(path.join(TLS_DIR, 'dhparam.pem')) + ? { dhparam: fs.readFileSync(path.join(TLS_DIR, 'dhparam.pem')) } + : {}), + requestCert: false, + rejectUnauthorized: false, // dev-friendly for self-signed +}; + +// --- Express + CSP --- +const app = express(); +app.disable('x-powered-by'); +app.use(compression()); +app.use( + helmet({ + contentSecurityPolicy: { + useDefaults: true, + directives: { + "default-src": ["'self'"], + "script-src": ["'self'"], // no inline JS + "style-src": ["'self'", "'unsafe-inline'"], + "img-src": ["'self'", "data:"], + "connect-src": ["'self'"], // same-origin WSS + "object-src": ["'none'"], + "base-uri": ["'self'"], + "frame-ancestors": ["'self'"] + } + }, + }) +); +app.use(express.static(path.join(__dirname, 'public'), { etag: true, maxAge: '1h' })); +app.get('/health', (_req, res) => res.status(200).send('ok')); + +// --- HTTPS server --- +const server = https.createServer(serverOptions, app); + +// Track sockets so shutdown is clean +const activeHttpSockets = new Set(); +server.on('connection', (socket) => { + activeHttpSockets.add(socket); + socket.on('close', () => activeHttpSockets.delete(socket)); +}); + +// --- WebSocket server --- +const wss = new WebSocket.Server({ noServer: true, perMessageDeflate: false }); + +// Heartbeat +function installHeartbeat(ws) { + ws.isAlive = true; + ws.on('pong', () => { ws.isAlive = true; }); +} +const pingInterval = setInterval(() => { + wss.clients.forEach((ws) => { + if (!ws.isAlive) return ws.terminate(); + ws.isAlive = false; + try { ws.ping(); } catch {} + }); +}, 30000); + +// Upgrade routing +server.on('upgrade', (request, socket, head) => { + try { socket.setNoDelay(true); } catch {} + const { url } = request; + if (!url || !url.startsWith('/ws/')) return socket.destroy(); + + + if (url === '/ws/robot') { + console.log('Robot requested'); + wssInput.handleUpgrade(request, socket, head, (ws) => { + ws.upgradePath = url; + wssInput.emit('connection', ws, request); + }); + return; + } + + wss.handleUpgrade(request, socket, head, (ws) => { + ws.upgradePath = url; + wss.emit('connection', ws, request); + }); +}); + +// --- Streams --- +const [DEV0, DEV1] = pickDevices(process.env); +console.log(`[DEV] Using devices: ${DEV0} (video0), ${DEV1} (video1)`); + +// Cam0: MJPEG pass-through if available (lowest latency) +const cam0 = new FFmpegStreamer(DEV0, { + name: 'video0', + fps: 30, + quality: 8, // 5 wäre besser + input: { + format: 'mjpeg', + fps: 30, + //size: '640x480', + //size: '1280x720', + size: '1280x960', + useWallclock: true, + threadQueueSize: 64, + channel: 0, + }, + tryFormats: ['mjpeg', 'yuyv422', 'rgb24'], +}); + + + +// Cam1: your working timing on /dev/video2; let driver pick format first +const cam1 = new FFmpegStreamer(DEV1, { + name: 'video1', + fps: 30, + quality: 8, // 5 wäre besser + input: { + format: 'mjpeg', // driver decides + fps: 30, + //size: '640x480', + //size: '1280x720', + size: '1280x960', + useWallclock: true, + threadQueueSize: 64, + channel: 0, + }, + tryFormats: ['mjpeg', 'yuyv422', 'rgb24'], +}); + +cam0.start(); +cam1.start(); + + +const wssInput = new WebSocket.Server({ noServer: true }); + + +// WS connections +wss.on('connection', (ws, req) => { + logWssConnected(req); + installHeartbeat(ws); + const pathName = ws.upgradePath || req.url || ''; + const controlEnabled = pathName === '/ws/video0'; + + if (pathName === '/ws/video0') cam0.attach(ws); + else if (pathName === '/ws/video1') cam1.attach(ws); + else return ws.close(1008, 'Unknown WS path'); + + // If the streamer isn't running when a client connects, try to start it. + // This makes the system more resilient to transient ffmpeg failures. + try { + if (pathName === '/ws/video0' && !cam0.running) { + console.log('[WS] client connected to /ws/video0 — starting cam0'); + cam0.start(); + } + if (pathName === '/ws/video1' && !cam1.running) { + console.log('[WS] client connected to /ws/video1 — starting cam1'); + cam1.start(); + } + } catch (err) { console.warn('[WS] failed to start streamer:', err?.message || err); } + + ws.on('message', (data, isBinary) => { + if (isBinary || !controlEnabled) return; + let msg; + try { msg = JSON.parse(data.toString()); } + catch { return ws.send(JSON.stringify({ type: 'error', error: 'Invalid JSON' })); } + handleControlMessage(ws, msg); + }); + + ws.send(JSON.stringify({ + type: 'hello', + path: pathName, + control: controlEnabled, + camera: pathName.endsWith('video0') ? 'video0' : 'video1', + })); + + ws.on('close', (code, reason) => { logWssClosed(req, code, reason); }); + +}); + +wss.on("upgrade", (req, socket, head) => { + if (req.url === "/ws/robot") { + console.log("Robot requested"); + wssInput.handleUpgrade(req, socket, head, (ws) => { wssInput.emit("connection", ws, req); }); + } +}); + + +const targetServer = process.env.TARGET_SERVER || 'wss://localhost:2095'; + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; +driverWS.setupCommandForwarding(wssInput, targetServer); + + +// Control channel (video0 only) +function handleControlMessage(ws, msg) { + if (msg?.type !== 'control') { + ws.send(JSON.stringify({ type: 'error', error: 'Unsupported message type' })); + return; + } + try { + switch (msg.action) { + case 'snapshot': { + + const outDir = path.join(__dirname, 'public', 'snapshots'); + screenShot.snapshot(outDir, cam0, cam1, ws); + break; + } + case 'setParams': { + const p = msg.params || {}; + cam0.restart({ + ...(Number(p.width) ? { width: Number(p.width) } : { width: undefined }), + ...(Number(p.height) ? { height: Number(p.height) } : { height: undefined }), + ...(Number(p.fps) ? { fps: Number(p.fps) } : {}), + ...(Number(p.quality) ? { quality: Number(p.quality) } : {}), + ...(p.input ? { input: { ...cam0.opts.input, ...p.input } } : {}), + }); + ws.send(JSON.stringify({ type: 'ack', action: 'setParams', params: { ...cam0.opts } })); + break; + } + case 'start': cam0.start(); ws.send(JSON.stringify({ type: 'ack', action: 'start' })); break; + case 'stop': cam0.stop(); ws.send(JSON.stringify({ type: 'ack', action: 'stop' })); break; + default: + ws.send(JSON.stringify({ type: 'error', error: `Unknown action: ${msg.action}` })); + } + } catch (err) { + ws.send(JSON.stringify({ type: 'error', error: err.message })); + } +} + +// Start +server.listen(PORT, HOST, () => { + console.log(`HTTPS server listening on https://${HOST}:${PORT}`); + console.log(`Open https://localhost:${PORT} (accept the self-signed certificate in dev)`); +}); + + + +// Graceful shutdown +let shuttingDown = false; +async function shutdown(code = 0) { + if (shuttingDown) return; + shuttingDown = true; + console.log('\nShutting down…'); + + try { clearInterval(pingInterval); } catch {} + + try { cam0.stop(); } catch {} + try { cam1.stop(); } catch {} + + try { wss.clients.forEach(ws => { try { ws.terminate(); } catch {} }); } catch {} + try { await new Promise(res => wss.close(() => res())); } catch {} + + try { for (const s of activeHttpSockets) { try { s.destroy(); } catch {} } } catch {} + try { await new Promise(res => server.close(() => res())); } catch {} + + setTimeout(() => { console.warn('Force exiting…'); process.exit(code); }, 1500).unref(); + process.exit(code); +} +process.once('SIGINT', () => shutdown(0)); +process.once('SIGTERM', () => shutdown(0)); +process.once('uncaughtException', (e) => { console.error(e); shutdown(1); }); +process.once('unhandledRejection', (r) => { console.error(r); shutdown(1); }); \ No newline at end of file