박선진

동영상 프레임 단위로 분할 후 디텍션 api에 request

1 const express = require('express'); 1 const express = require('express');
2 const fs = require('fs'); 2 const fs = require('fs');
3 -const { 3 +const ffmpeg = require('ffmpeg');
4 - cv, 4 +const request = require('request')
5 - getDataFilePath,
6 - drawBlueRect,
7 - drawGreenRect
8 -} = require('./utils');
9 -
10 -const openCV = require('opencv4nodejs');
11 5
12 const router = express.Router(); 6 const router = express.Router();
13 - 7 +const path = require('path');
14 //================================================================ 8 //================================================================
15 9
16 router.post('/videoResult', function (req, res) { 10 router.post('/videoResult', function (req, res) {
17 11
18 try { 12 try {
19 - let preview = req.body[0].preview; 13 + let preview = req.body[0].preview;
20 - 14 +
21 - str = preview.replace(/^data:(.*?);base64,/, ""); 15 + str = preview.replace(/^data:(.*?);base64,/, "");
22 - str = str.replace(/ /g, '+'); 16 + str = str.replace(/ /g, '+');
23 - 17 +
18 +
19 + fs.writeFileSync(`./data/temp.mp4`, str, 'base64', function (err) {
20 + if (err) throw err;
21 + console.log("video saved");
22 + return;
23 + })
24 +
25 + let process = new ffmpeg(`./data/temp.mp4`);
26 +
27 +
28 + detectedImgFile = "test.jpg"; // null로 바꿀 것
29 + process.then(function (video) {
30 + video.fnExtractFrameToJPG(__dirname + "/data",
31 + {
32 + every_n_seconds: 1,
33 + file_name: 'frame_%s'
34 + }, function (error, files) {
35 + if (!error)
36 + console.log('###1 Frames =>' + files);
37 + console.log("###2 갯수 => " + files.length)
38 +
39 +
40 + console.log("###3 첫번째 파일 => " + files[0]); // 마지막 파일은 영상임
41 + let base64str = base64_encode(files[0]);
42 + console.log("###4 base64str => " + base64str);
43 + console.log("##### for")
44 + for(var i=0;i<files.length-1;i++){
45 + request.post({
46 + url: 'http://101.101.210.73/process',
47 + form: {
48 + 'data': base64_encode(files[0])
49 + },
50 + json: true
51 + }, (err, response, body) => {
52 + console.log(body)
53 + })
54 + }
55 + /**
56 + * TODO
57 + * 반복문돌면서 각 프레임 파이썬 api 요청하고 응답받아서
58 + * 하나라도 true나오면 프론트에 감지된 이미지파일주소 응답
59 + */
60 + detectedImgFile=null;
61 + }
62 + )
63 + })
24 64
25 - fs.writeFile(`./data/temp.mp4`, str, 'base64', function (err) {
26 - if (err) throw err;
27 - console.log("saved");
28 - const vCap = new openCV.VideoCapture('./data/temp.mp4')
29 - const delay = 1000;
30 - let done = false;
31 - let cnt = 0;
32 - while (!done) {
33 - let frame = vCap.read();
34 - cv.imwrite('./data/' + cnt + '.jpg');
35 - cnt++;
36 - if (frame.empty) {
37 - vCap.reset();
38 - frame = vCap.read();
39 - }
40 - }
41 - });
42 } catch (err) { 65 } catch (err) {
43 - console.log("err : " + err); 66 + console.error(err);
44 } 67 }
45 68
46 - return res.json({ data: 'myData' }); 69 + return res.json({ data: detectedImgFile });
47 }); 70 });
48 71
49 -//================================================================ 72 +function base64_encode(file) {
50 - 73 + // read binary data
51 -// router.post('/faceRecognition', function (req, res) { 74 + var bitmap = fs.readFileSync(file);
52 - 75 + // convert binary data to base64 encoded string
53 -// try { 76 + return new Buffer(bitmap).toString('base64');
54 -// let preview = req.body[0].preview;
55 -
56 -// str = preview.replace(/^data:(.*?);base64,/, "");
57 -// str = str.replace(/ /g, '+');
58 -
59 -// // 임시파일 저장
60 -// fs.writeFile(`./data/temp.jpg`, str, 'base64', function (err) {
61 -// if (err) throw err;
62 -// console.log("saved");
63 -// detectFaceAndEyes('./data/temp.jpg');
64 -// });
65 -
66 -
67 -
68 -// } catch (err) {
69 -// console.log('err: ' + err);
70 -// }
71 -
72 -// return res.json({ data: 'myData' });
73 -// });
74 -
75 -//================================================================
76 -
77 -function base64encode(plaintext) {
78 - return Buffer.from(plaintext, "utf8").toString('base64');
79 -}
80 -
81 -function base64decode(base64text) {
82 - console.log(base64text.length);
83 - return Buffer.from(base64text, 'base64').toString('utf8');
84 } 77 }
85 78
86 -// function detectFaceAndEyes(filePath) {
87 -// const image = cv.imread(filePath);
88 -// const faceClassifier = new cv.CascadeClassifier(cv.HAAR_FRONTALFACE_DEFAULT);
89 -// const eyeClassifier = new cv.CascadeClassifier(cv.HAAR_EYE);
90 -
91 -// // detect faces
92 -// const faceResult = faceClassifier.detectMultiScale(image.bgrToGray());
93 -
94 -// if (!faceResult.objects.length) {
95 -// throw new Error('No faces detected!');
96 -// }
97 -
98 -// const sortByNumDetections = result => result.numDetections
99 -// .map((num, idx) => ({ num, idx }))
100 -// .sort(((n0, n1) => n1.num - n0.num))
101 -// .map(({ idx }) => idx);
102 -
103 -// // get best result
104 -// const faceRect = faceResult.objects[sortByNumDetections(faceResult)[0]];
105 -// console.log('faceRects:', faceResult.objects);
106 -// console.log('confidences:', faceResult.numDetections);
107 -
108 -// // detect eyes
109 -// const faceRegion = image.getRegion(faceRect);
110 -// const eyeResult = eyeClassifier.detectMultiScale(faceRegion);
111 -// console.log('eyeRects:', eyeResult.objects);
112 -// console.log('confidences:', eyeResult.numDetections);
113 -
114 -// // get best result
115 -// const eyeRects = sortByNumDetections(eyeResult)
116 -// .slice(0, 2)
117 -// .map(idx => eyeResult.objects[idx]);
118 -
119 -
120 -// // draw face detection
121 -// drawBlueRect(image, faceRect);
122 -
123 -// // draw eyes detection in face region
124 -// eyeRects.forEach(eyeRect => drawGreenRect(faceRegion, eyeRect));
125 -
126 -// cv.imwrite(`./data/temp2.jpg`, image);
127 -// }
128 -
129 module.exports = router; 79 module.exports = router;
...\ No newline at end of file ...\ No newline at end of file
......
1 { 1 {
2 - "requires": true, 2 + "name": "back-end",
3 + "version": "1.0.0",
3 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 + "requires": true,
4 "dependencies": { 6 "dependencies": {
7 + "@types/node": {
8 + "version": "14.0.14",
9 + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz",
10 + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==",
11 + "optional": true
12 + },
5 "accepts": { 13 "accepts": {
6 "version": "1.3.7", 14 "version": "1.3.7",
7 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 15 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
...@@ -11,11 +19,77 @@ ...@@ -11,11 +19,77 @@
11 "negotiator": "0.6.2" 19 "negotiator": "0.6.2"
12 } 20 }
13 }, 21 },
22 + "ajv": {
23 + "version": "6.12.2",
24 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
25 + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
26 + "requires": {
27 + "fast-deep-equal": "^3.1.1",
28 + "fast-json-stable-stringify": "^2.0.0",
29 + "json-schema-traverse": "^0.4.1",
30 + "uri-js": "^4.2.2"
31 + }
32 + },
33 + "ansi-regex": {
34 + "version": "2.1.1",
35 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
36 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
37 + },
38 + "aproba": {
39 + "version": "1.2.0",
40 + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
41 + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
42 + },
43 + "are-we-there-yet": {
44 + "version": "1.1.5",
45 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
46 + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
47 + "requires": {
48 + "delegates": "^1.0.0",
49 + "readable-stream": "^2.0.6"
50 + }
51 + },
14 "array-flatten": { 52 "array-flatten": {
15 "version": "1.1.1", 53 "version": "1.1.1",
16 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 54 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
17 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 55 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
18 }, 56 },
57 + "asn1": {
58 + "version": "0.2.4",
59 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
60 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
61 + "requires": {
62 + "safer-buffer": "~2.1.0"
63 + }
64 + },
65 + "assert-plus": {
66 + "version": "1.0.0",
67 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
68 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
69 + },
70 + "asynckit": {
71 + "version": "0.4.0",
72 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
73 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
74 + },
75 + "aws-sign2": {
76 + "version": "0.7.0",
77 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
78 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
79 + },
80 + "aws4": {
81 + "version": "1.10.0",
82 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
83 + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
84 + },
85 + "bcrypt-pbkdf": {
86 + "version": "1.0.2",
87 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
88 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
89 + "requires": {
90 + "tweetnacl": "^0.14.3"
91 + }
92 + },
19 "body-parser": { 93 "body-parser": {
20 "version": "1.19.0", 94 "version": "1.19.0",
21 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 95 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
...@@ -38,6 +112,29 @@ ...@@ -38,6 +112,29 @@
38 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 112 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
39 "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 113 "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
40 }, 114 },
115 + "caseless": {
116 + "version": "0.12.0",
117 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
118 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
119 + },
120 + "code-point-at": {
121 + "version": "1.1.0",
122 + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
123 + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
124 + },
125 + "combined-stream": {
126 + "version": "1.0.8",
127 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
128 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
129 + "requires": {
130 + "delayed-stream": "~1.0.0"
131 + }
132 + },
133 + "console-control-strings": {
134 + "version": "1.1.0",
135 + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
136 + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
137 + },
41 "content-disposition": { 138 "content-disposition": {
42 "version": "0.5.3", 139 "version": "0.5.3",
43 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 140 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
...@@ -61,6 +158,11 @@ ...@@ -61,6 +158,11 @@
61 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 158 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
62 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 159 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
63 }, 160 },
161 + "core-util-is": {
162 + "version": "1.0.2",
163 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
164 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
165 + },
64 "cors": { 166 "cors": {
65 "version": "2.8.5", 167 "version": "2.8.5",
66 "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 168 "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
...@@ -70,6 +172,14 @@ ...@@ -70,6 +172,14 @@
70 "vary": "^1" 172 "vary": "^1"
71 } 173 }
72 }, 174 },
175 + "dashdash": {
176 + "version": "1.14.1",
177 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
178 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
179 + "requires": {
180 + "assert-plus": "^1.0.0"
181 + }
182 + },
73 "debug": { 183 "debug": {
74 "version": "2.6.9", 184 "version": "2.6.9",
75 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 185 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -78,6 +188,16 @@ ...@@ -78,6 +188,16 @@
78 "ms": "2.0.0" 188 "ms": "2.0.0"
79 } 189 }
80 }, 190 },
191 + "delayed-stream": {
192 + "version": "1.0.0",
193 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
194 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
195 + },
196 + "delegates": {
197 + "version": "1.0.0",
198 + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
199 + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
200 + },
81 "depd": { 201 "depd": {
82 "version": "1.1.2", 202 "version": "1.1.2",
83 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 203 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
...@@ -88,6 +208,15 @@ ...@@ -88,6 +208,15 @@
88 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 208 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
89 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 209 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
90 }, 210 },
211 + "ecc-jsbn": {
212 + "version": "0.1.2",
213 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
214 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
215 + "requires": {
216 + "jsbn": "~0.1.0",
217 + "safer-buffer": "^2.1.0"
218 + }
219 + },
91 "ee-first": { 220 "ee-first": {
92 "version": "1.1.1", 221 "version": "1.1.1",
93 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 222 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
...@@ -145,6 +274,34 @@ ...@@ -145,6 +274,34 @@
145 "vary": "~1.1.2" 274 "vary": "~1.1.2"
146 } 275 }
147 }, 276 },
277 + "extend": {
278 + "version": "3.0.2",
279 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
280 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
281 + },
282 + "extsprintf": {
283 + "version": "1.3.0",
284 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
285 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
286 + },
287 + "fast-deep-equal": {
288 + "version": "3.1.3",
289 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
290 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
291 + },
292 + "fast-json-stable-stringify": {
293 + "version": "2.1.0",
294 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
295 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
296 + },
297 + "ffmpeg": {
298 + "version": "0.0.4",
299 + "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz",
300 + "integrity": "sha1-HEYN+OfaUSf2LO70v6BsWciWMMs=",
301 + "requires": {
302 + "when": ">= 0.0.1"
303 + }
304 + },
148 "finalhandler": { 305 "finalhandler": {
149 "version": "1.1.2", 306 "version": "1.1.2",
150 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 307 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
...@@ -159,6 +316,21 @@ ...@@ -159,6 +316,21 @@
159 "unpipe": "~1.0.0" 316 "unpipe": "~1.0.0"
160 } 317 }
161 }, 318 },
319 + "forever-agent": {
320 + "version": "0.6.1",
321 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
322 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
323 + },
324 + "form-data": {
325 + "version": "2.3.3",
326 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
327 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
328 + "requires": {
329 + "asynckit": "^0.4.0",
330 + "combined-stream": "^1.0.6",
331 + "mime-types": "^2.1.12"
332 + }
333 + },
162 "forwarded": { 334 "forwarded": {
163 "version": "0.1.2", 335 "version": "0.1.2",
164 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 336 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
...@@ -169,6 +341,48 @@ ...@@ -169,6 +341,48 @@
169 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 341 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
170 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 342 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
171 }, 343 },
344 + "gauge": {
345 + "version": "2.7.4",
346 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
347 + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
348 + "requires": {
349 + "aproba": "^1.0.3",
350 + "console-control-strings": "^1.0.0",
351 + "has-unicode": "^2.0.0",
352 + "object-assign": "^4.1.0",
353 + "signal-exit": "^3.0.0",
354 + "string-width": "^1.0.1",
355 + "strip-ansi": "^3.0.1",
356 + "wide-align": "^1.1.0"
357 + }
358 + },
359 + "getpass": {
360 + "version": "0.1.7",
361 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
362 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
363 + "requires": {
364 + "assert-plus": "^1.0.0"
365 + }
366 + },
367 + "har-schema": {
368 + "version": "2.0.0",
369 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
370 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
371 + },
372 + "har-validator": {
373 + "version": "5.1.3",
374 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
375 + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
376 + "requires": {
377 + "ajv": "^6.5.5",
378 + "har-schema": "^2.0.0"
379 + }
380 + },
381 + "has-unicode": {
382 + "version": "2.0.1",
383 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
384 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
385 + },
172 "http-errors": { 386 "http-errors": {
173 "version": "1.7.2", 387 "version": "1.7.2",
174 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 388 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
...@@ -181,6 +395,16 @@ ...@@ -181,6 +395,16 @@
181 "toidentifier": "1.0.0" 395 "toidentifier": "1.0.0"
182 } 396 }
183 }, 397 },
398 + "http-signature": {
399 + "version": "1.2.0",
400 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
401 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
402 + "requires": {
403 + "assert-plus": "^1.0.0",
404 + "jsprim": "^1.2.2",
405 + "sshpk": "^1.7.0"
406 + }
407 + },
184 "iconv-lite": { 408 "iconv-lite": {
185 "version": "0.4.24", 409 "version": "0.4.24",
186 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 410 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
...@@ -199,6 +423,60 @@ ...@@ -199,6 +423,60 @@
199 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 423 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
200 "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 424 "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
201 }, 425 },
426 + "is-fullwidth-code-point": {
427 + "version": "1.0.0",
428 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
429 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
430 + "requires": {
431 + "number-is-nan": "^1.0.0"
432 + }
433 + },
434 + "is-typedarray": {
435 + "version": "1.0.0",
436 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
437 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
438 + },
439 + "isarray": {
440 + "version": "1.0.0",
441 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
442 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
443 + },
444 + "isstream": {
445 + "version": "0.1.2",
446 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
447 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
448 + },
449 + "jsbn": {
450 + "version": "0.1.1",
451 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
452 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
453 + },
454 + "json-schema": {
455 + "version": "0.2.3",
456 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
457 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
458 + },
459 + "json-schema-traverse": {
460 + "version": "0.4.1",
461 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
462 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
463 + },
464 + "json-stringify-safe": {
465 + "version": "5.0.1",
466 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
467 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
468 + },
469 + "jsprim": {
470 + "version": "1.4.1",
471 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
472 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
473 + "requires": {
474 + "assert-plus": "1.0.0",
475 + "extsprintf": "1.3.0",
476 + "json-schema": "0.2.3",
477 + "verror": "1.10.0"
478 + }
479 + },
202 "media-typer": { 480 "media-typer": {
203 "version": "0.3.0", 481 "version": "0.3.0",
204 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 482 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
...@@ -237,11 +515,45 @@ ...@@ -237,11 +515,45 @@
237 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 515 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
238 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 516 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
239 }, 517 },
518 + "nan": {
519 + "version": "2.14.1",
520 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
521 + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
522 + },
523 + "native-node-utils": {
524 + "version": "0.2.7",
525 + "resolved": "https://registry.npmjs.org/native-node-utils/-/native-node-utils-0.2.7.tgz",
526 + "integrity": "sha512-61v0G3uVxWlXHppSZGwZi+ZEIgGUKI8QvEkEJLb1GVePI7P8SBe+G747z+QMXSt4TxfgbVZP0DyobbRKYVIjdw==",
527 + "requires": {
528 + "nan": "^2.13.2"
529 + }
530 + },
240 "negotiator": { 531 "negotiator": {
241 "version": "0.6.2", 532 "version": "0.6.2",
242 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 533 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
243 "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 534 "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
244 }, 535 },
536 + "npmlog": {
537 + "version": "4.1.2",
538 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
539 + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
540 + "requires": {
541 + "are-we-there-yet": "~1.1.2",
542 + "console-control-strings": "~1.1.0",
543 + "gauge": "~2.7.3",
544 + "set-blocking": "~2.0.0"
545 + }
546 + },
547 + "number-is-nan": {
548 + "version": "1.0.1",
549 + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
550 + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
551 + },
552 + "oauth-sign": {
553 + "version": "0.9.0",
554 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
555 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
556 + },
245 "object-assign": { 557 "object-assign": {
246 "version": "4.1.1", 558 "version": "4.1.1",
247 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 559 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
...@@ -255,16 +567,60 @@ ...@@ -255,16 +567,60 @@
255 "ee-first": "1.1.1" 567 "ee-first": "1.1.1"
256 } 568 }
257 }, 569 },
570 + "opencv-build": {
571 + "version": "0.1.9",
572 + "resolved": "https://registry.npmjs.org/opencv-build/-/opencv-build-0.1.9.tgz",
573 + "integrity": "sha512-tgT/bnJAcYROen9yaPynfK98IMl62mPSgMLmTx41911m5bczlq21xtE5r+UWLB/xEo/0hKk6tl5zHyxV/JS5Rg==",
574 + "requires": {
575 + "npmlog": "^4.1.2"
576 + }
577 + },
578 + "opencv4nodejs": {
579 + "version": "5.6.0",
580 + "resolved": "https://registry.npmjs.org/opencv4nodejs/-/opencv4nodejs-5.6.0.tgz",
581 + "integrity": "sha512-JvcT1hb2JUCdntcVABgD9Gprr+gkXBe+jhHKvrr0Ug51y087K4ybm0vHBQVzI2ei1aJxEc9tNknPL9rpyx5Xuw==",
582 + "requires": {
583 + "@types/node": ">6",
584 + "nan": "^2.14.0",
585 + "native-node-utils": "^0.2.7",
586 + "npmlog": "^4.1.2",
587 + "opencv-build": "^0.1.9"
588 + }
589 + },
258 "parseurl": { 590 "parseurl": {
259 "version": "1.3.3", 591 "version": "1.3.3",
260 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 592 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
261 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 593 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
262 }, 594 },
595 + "path": {
596 + "version": "0.12.7",
597 + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
598 + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
599 + "requires": {
600 + "process": "^0.11.1",
601 + "util": "^0.10.3"
602 + }
603 + },
263 "path-to-regexp": { 604 "path-to-regexp": {
264 "version": "0.1.7", 605 "version": "0.1.7",
265 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 606 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
266 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 607 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
267 }, 608 },
609 + "performance-now": {
610 + "version": "2.1.0",
611 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
612 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
613 + },
614 + "process": {
615 + "version": "0.11.10",
616 + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
617 + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
618 + },
619 + "process-nextick-args": {
620 + "version": "2.0.1",
621 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
622 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
623 + },
268 "proxy-addr": { 624 "proxy-addr": {
269 "version": "2.0.6", 625 "version": "2.0.6",
270 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 626 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
...@@ -274,6 +630,16 @@ ...@@ -274,6 +630,16 @@
274 "ipaddr.js": "1.9.1" 630 "ipaddr.js": "1.9.1"
275 } 631 }
276 }, 632 },
633 + "psl": {
634 + "version": "1.8.0",
635 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
636 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
637 + },
638 + "punycode": {
639 + "version": "2.1.1",
640 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
641 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
642 + },
277 "qs": { 643 "qs": {
278 "version": "6.7.0", 644 "version": "6.7.0",
279 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 645 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
...@@ -295,6 +661,54 @@ ...@@ -295,6 +661,54 @@
295 "unpipe": "1.0.0" 661 "unpipe": "1.0.0"
296 } 662 }
297 }, 663 },
664 + "readable-stream": {
665 + "version": "2.3.7",
666 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
667 + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
668 + "requires": {
669 + "core-util-is": "~1.0.0",
670 + "inherits": "~2.0.3",
671 + "isarray": "~1.0.0",
672 + "process-nextick-args": "~2.0.0",
673 + "safe-buffer": "~5.1.1",
674 + "string_decoder": "~1.1.1",
675 + "util-deprecate": "~1.0.1"
676 + }
677 + },
678 + "request": {
679 + "version": "2.88.2",
680 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
681 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
682 + "requires": {
683 + "aws-sign2": "~0.7.0",
684 + "aws4": "^1.8.0",
685 + "caseless": "~0.12.0",
686 + "combined-stream": "~1.0.6",
687 + "extend": "~3.0.2",
688 + "forever-agent": "~0.6.1",
689 + "form-data": "~2.3.2",
690 + "har-validator": "~5.1.3",
691 + "http-signature": "~1.2.0",
692 + "is-typedarray": "~1.0.0",
693 + "isstream": "~0.1.2",
694 + "json-stringify-safe": "~5.0.1",
695 + "mime-types": "~2.1.19",
696 + "oauth-sign": "~0.9.0",
697 + "performance-now": "^2.1.0",
698 + "qs": "~6.5.2",
699 + "safe-buffer": "^5.1.2",
700 + "tough-cookie": "~2.5.0",
701 + "tunnel-agent": "^0.6.0",
702 + "uuid": "^3.3.2"
703 + },
704 + "dependencies": {
705 + "qs": {
706 + "version": "6.5.2",
707 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
708 + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
709 + }
710 + }
711 + },
298 "safe-buffer": { 712 "safe-buffer": {
299 "version": "5.1.2", 713 "version": "5.1.2",
300 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 714 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
...@@ -343,21 +757,95 @@ ...@@ -343,21 +757,95 @@
343 "send": "0.17.1" 757 "send": "0.17.1"
344 } 758 }
345 }, 759 },
760 + "set-blocking": {
761 + "version": "2.0.0",
762 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
763 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
764 + },
346 "setprototypeof": { 765 "setprototypeof": {
347 "version": "1.1.1", 766 "version": "1.1.1",
348 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 767 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
349 "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 768 "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
350 }, 769 },
770 + "signal-exit": {
771 + "version": "3.0.3",
772 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
773 + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
774 + },
775 + "sshpk": {
776 + "version": "1.16.1",
777 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
778 + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
779 + "requires": {
780 + "asn1": "~0.2.3",
781 + "assert-plus": "^1.0.0",
782 + "bcrypt-pbkdf": "^1.0.0",
783 + "dashdash": "^1.12.0",
784 + "ecc-jsbn": "~0.1.1",
785 + "getpass": "^0.1.1",
786 + "jsbn": "~0.1.0",
787 + "safer-buffer": "^2.0.2",
788 + "tweetnacl": "~0.14.0"
789 + }
790 + },
351 "statuses": { 791 "statuses": {
352 "version": "1.5.0", 792 "version": "1.5.0",
353 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 793 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
354 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 794 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
355 }, 795 },
796 + "string-width": {
797 + "version": "1.0.2",
798 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
799 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
800 + "requires": {
801 + "code-point-at": "^1.0.0",
802 + "is-fullwidth-code-point": "^1.0.0",
803 + "strip-ansi": "^3.0.0"
804 + }
805 + },
806 + "string_decoder": {
807 + "version": "1.1.1",
808 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
809 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
810 + "requires": {
811 + "safe-buffer": "~5.1.0"
812 + }
813 + },
814 + "strip-ansi": {
815 + "version": "3.0.1",
816 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
817 + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
818 + "requires": {
819 + "ansi-regex": "^2.0.0"
820 + }
821 + },
356 "toidentifier": { 822 "toidentifier": {
357 "version": "1.0.0", 823 "version": "1.0.0",
358 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 824 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
359 "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 825 "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
360 }, 826 },
827 + "tough-cookie": {
828 + "version": "2.5.0",
829 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
830 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
831 + "requires": {
832 + "psl": "^1.1.28",
833 + "punycode": "^2.1.1"
834 + }
835 + },
836 + "tunnel-agent": {
837 + "version": "0.6.0",
838 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
839 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
840 + "requires": {
841 + "safe-buffer": "^5.0.1"
842 + }
843 + },
844 + "tweetnacl": {
845 + "version": "0.14.5",
846 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
847 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
848 + },
361 "type-is": { 849 "type-is": {
362 "version": "1.6.18", 850 "version": "1.6.18",
363 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 851 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
...@@ -372,15 +860,64 @@ ...@@ -372,15 +860,64 @@
372 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 860 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
373 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 861 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
374 }, 862 },
863 + "uri-js": {
864 + "version": "4.2.2",
865 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
866 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
867 + "requires": {
868 + "punycode": "^2.1.0"
869 + }
870 + },
871 + "util": {
872 + "version": "0.10.4",
873 + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
874 + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
875 + "requires": {
876 + "inherits": "2.0.3"
877 + }
878 + },
879 + "util-deprecate": {
880 + "version": "1.0.2",
881 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
882 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
883 + },
375 "utils-merge": { 884 "utils-merge": {
376 "version": "1.0.1", 885 "version": "1.0.1",
377 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 886 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
378 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 887 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
379 }, 888 },
889 + "uuid": {
890 + "version": "3.4.0",
891 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
892 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
893 + },
380 "vary": { 894 "vary": {
381 "version": "1.1.2", 895 "version": "1.1.2",
382 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 896 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
383 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 897 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
898 + },
899 + "verror": {
900 + "version": "1.10.0",
901 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
902 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
903 + "requires": {
904 + "assert-plus": "^1.0.0",
905 + "core-util-is": "1.0.2",
906 + "extsprintf": "^1.2.0"
907 + }
908 + },
909 + "when": {
910 + "version": "3.7.8",
911 + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
912 + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
913 + },
914 + "wide-align": {
915 + "version": "1.1.3",
916 + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
917 + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
918 + "requires": {
919 + "string-width": "^1.0.2 || 2"
920 + }
384 } 921 }
385 } 922 }
386 } 923 }
......
1 +{
2 + "name": "back-end",
3 + "version": "1.0.0",
4 + "description": "",
5 + "main": "apiRouter.js",
6 + "scripts": {
7 + "test": "echo \"Error: no test specified\" && exit 1",
8 + "start": "node server.js"
9 + },
10 + "author": "",
11 + "license": "ISC",
12 + "dependencies": {
13 + "body-parser": "^1.19.0",
14 + "cors": "^2.8.5",
15 + "express": "^4.17.1",
16 + "ffmpeg": "0.0.4",
17 + "opencv4nodejs": "^5.6.0",
18 + "path": "^0.12.7",
19 + "request": "^2.88.2"
20 + }
21 +}
...@@ -12,5 +12,5 @@ app.use(bodyParser.urlencoded({limit: '100mb', extended: true})); ...@@ -12,5 +12,5 @@ app.use(bodyParser.urlencoded({limit: '100mb', extended: true}));
12 app.use(bodyParser()); 12 app.use(bodyParser());
13 app.use('/api', api); 13 app.use('/api', api);
14 14
15 -const port = 3002; 15 +const port = 3003;
16 app.listen(port, () => console.log(`노드서버 시작 : ${port}`)); 16 app.listen(port, () => console.log(`노드서버 시작 : ${port}`));
......
1 -const path = require('path');
2 -const cv = require('opencv4nodejs');
3 -
4 -exports.cv = cv;
5 -
6 -const dataPath = path.resolve(__dirname, './data');
7 -exports.dataPath = dataPath;
8 -exports.getDataFilePath = fileName => {
9 - let targetPath = path.resolve(dataPath, fileName);
10 - return targetPath;
11 -}
12 -
13 -const grabFrames = (videoFile, delay, onFrame) => {
14 - const cap = new cv.VideoCapture(videoFile);
15 - let done = false;
16 - const intvl = setInterval(() => {
17 - let frame = cap.read();
18 - // loop back to start on end of stream reached
19 - if (frame.empty) {
20 - cap.reset();
21 - frame = cap.read();
22 - }
23 - onFrame(frame);
24 -
25 - const key = cv.waitKey(delay);
26 - done = key !== -1 && key !== 255;
27 - if (done) {
28 - clearInterval(intvl);
29 - console.log('Key pressed, exiting.');
30 - }
31 - }, 0);
32 -};
33 -exports.grabFrames = grabFrames;
34 -
35 -exports.runVideoDetection = (src, detect) => {
36 - grabFrames(src, 1, frame => {
37 - detect(frame);
38 - });
39 -};
40 -
41 -exports.drawRectAroundBlobs = (binaryImg, dstImg, minPxSize, fixedRectWidth) => {
42 - const {
43 - centroids,
44 - stats
45 - } = binaryImg.connectedComponentsWithStats();
46 -
47 - // pretend label 0 is background
48 - for (let label = 1; label < centroids.rows; label += 1) {
49 - const [x1, y1] = [stats.at(label, cv.CC_STAT_LEFT), stats.at(label, cv.CC_STAT_TOP)];
50 - const [x2, y2] = [
51 - x1 + (fixedRectWidth || stats.at(label, cv.CC_STAT_WIDTH)),
52 - y1 + (fixedRectWidth || stats.at(label, cv.CC_STAT_HEIGHT))
53 - ];
54 - const size = stats.at(label, cv.CC_STAT_AREA);
55 - const blue = new cv.Vec(255, 0, 0);
56 - if (minPxSize < size) {
57 - dstImg.drawRectangle(
58 - new cv.Point(x1, y1),
59 - new cv.Point(x2, y2),
60 - { color: blue, thickness: 2 }
61 - );
62 - }
63 - }
64 -};
65 -
66 -const drawRect = (image, rect, color, opts = { thickness: 2 }) =>
67 - image.drawRectangle(
68 - rect,
69 - color,
70 - opts.thickness,
71 - cv.LINE_8
72 - );
73 -
74 -exports.drawRect = drawRect;
75 -exports.drawBlueRect = (image, rect, opts = { thickness: 2 }) =>
76 - drawRect(image, rect, new cv.Vec(255, 0, 0), opts);
77 -exports.drawGreenRect = (image, rect, opts = { thickness: 2 }) =>
78 - drawRect(image, rect, new cv.Vec(0, 255, 0), opts);
79 -exports.drawRedRect = (image, rect, opts = { thickness: 2 }) =>
80 - drawRect(image, rect, new cv.Vec(0, 0, 255), opts);
...\ No newline at end of file ...\ No newline at end of file