Skip to content

Instantly share code, notes, and snippets.

@btsimonh
Last active November 12, 2017 18:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save btsimonh/7bc1dad7e8286ebe626c31f5f7df16ed to your computer and use it in GitHub Desktop.
Save btsimonh/7bc1dad7e8286ebe626c31f5f7df16ed to your computer and use it in GitHub Desktop.
ADVANCED MOTION DETECTION WITH NODE-OPENCV IN NODE-RED flow2
[{"id":"ab622702.3ede98","type":"inject","z":"fa9050d8.3686","name":"Start","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":150,"y":80,"wires":[["c47265ed.25a238"]]},{"id":"c47265ed.25a238","type":"function","z":"fa9050d8.3686","name":"LoadCV","func":"var require = global.get('require');\nvar cv = null;\ntry{\n // global\n cv = require.main.require('opencv');\n} catch (e) {\n // local\n cv = require('opencv');\n}\nvar cvdesc = Object.keys(cv);\nnode.send([null, {payload:cvdesc}]);\nflow.set('cv', cv);\n\nnode.send({payload:1});\nnode.send({payload:'next'});\n","outputs":"2","noerr":0,"x":280,"y":80,"wires":[["63d26358.6e801c"],[]]},{"id":"63d26358.6e801c","type":"function","z":"fa9050d8.3686","name":"GetImage","func":"\n\nif (msg.payload === 0){\n var vid = flow.get('cvvid');\n if (vid){\n node.warn(util.inspect(vid));\n vid.release();\n flow.set('cvvid', null);\n delete vid;\n }\n}\n\n\nif (msg.payload === 1){\n try{\n flow.set('start', null);\n flow.set('count', null);\n flow.set('last_s', null);\n\n var cv = flow.get('cv');\n var timings = flow.get('timings') || {};\n timings.startup = {};\n timings.startup.start = Date.now();\n var vid = new cv.VideoCapture(0);\n timings.startup.end = Date.now();\n timings.startup.diff = timings.startup.end - timings.startup.start;\n \n node.warn(vid);\n flow.set('cvvid', vid);\n } catch (e){\n node.warn(e);\n }\n}\n\nif (msg.payload === 'ack'){\n var timings = flow.get('timings');\n timings.imagecidiff = context.imageci - msg.imageci;\n return;\n}\n\n\nif (msg.payload === 'next'){\n var vid = flow.get('cvvid');\n \n if (vid){\n try{\n //vid.grab(function(err, im)\n {\n //node.warn(\"grabbed \" + util.inspect(err) + \" \"+util.inspect(im));\n \n \n var timings = flow.get('timings') || {};\n lasttime = 0;\n if (timings.readframe)\n lasttime = timings.readframe.start;\n timings.readframe = {};\n timings.readframe.start = Date.now();\n timings.readframe.overall = timings.readframe.start - lasttime;\n \n vid.read(function(err, im){\n try{\n //node.warn(\"read \" + util.inspect(err) + \" \"+util.inspect(im));\n if (err) return;\n //im = im[0];\n //node.warn(util.inspect(im));\n //if (im.size()[0] > 0 && im.size()[1] > 0)\n {\n timings.readframe.end = Date.now();\n timings.readframe.diff = timings.readframe.end - timings.readframe.start;\n \n msg.img = im;\n msg.imdesc = util.inspect(im);\n msg.timestamp = Date.now();\n \n context.imageci = context.imageci || 0;\n msg.imageci = context.imageci++;\n \n node.send(msg);\n }\n } catch(e){\n node.warn(e);\n }\n });\n \n }\n //);\n\n } catch (e){\n node.warn(e);\n }\n }\n}\n","outputs":1,"noerr":0,"x":440,"y":120,"wires":[["db86b0b0.2af44","ff39a409.ac53a8"]]},{"id":"da4b5579.f4cf78","type":"inject","z":"fa9050d8.3686","name":"Stop","topic":"","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":150,"y":120,"wires":[["63d26358.6e801c"]]},{"id":"db86b0b0.2af44","type":"function","z":"fa9050d8.3686","name":"BackgroundSubtraction","func":"var cv = flow.get('cv');\n\ntry {\n var bg = flow.get('bg');\n if (!bg){\n bg = cv.BackgroundSubtractor.createMOG();\n node.warn(\"made bg \"+util.inspect(bg));\n flow.set('bg', bg);\n }\n \n if (bg){\n bg.applyMOG(msg.img, function(err, mat){\n //node.warn(\"did mog \"+err+\" \"+util.inspect(mat));\n try{\n msg.out = mat;\n //node.warn(\"did mog:\"+util.inspect(mat));\n \n node.send(msg);\n //msg.avg.release(); \n return;\n } catch(e){\n node.warn(\"exception\"+e);\n }\n });\n }\n\n} catch(e){\n node.warn(e);\n}\n\nreturn;\n","outputs":1,"noerr":0,"x":650,"y":120,"wires":[["a93be926.bc4138"]]},{"id":"ff39a409.ac53a8","type":"function","z":"fa9050d8.3686","name":"GetNextFrame","func":"setTimeout(function(){\n node.send({payload:'next'});\n}, 10);\nreturn;","outputs":1,"noerr":0,"x":440,"y":180,"wires":[["63d26358.6e801c"]]},{"id":"5e397987.013e38","type":"multipart-encoder","z":"fa9050d8.3686","name":"","statusCode":"","ignoreMessages":true,"outputOneNew":true,"outputOneClosed":true,"outputAllClosed":true,"globalHeaders":{"Content-Type":"multipart/x-mixed-replace;boundary=myboundary","Connection":"keep-alive","Expires":"Fri, 01 Jan 1990 00:00:00 GMT","Cache-Control":"no-cache, no-store, max-age=0, must-revalidate","Pragma":"no-cache"},"partHeaders":{"Content-Type":"image/jpeg"},"destination":"all","x":900,"y":300,"wires":[[]]},{"id":"4a95041c.34e9bc","type":"http in","z":"fa9050d8.3686","name":"","url":"/test2","method":"get","upload":false,"swaggerDoc":"","x":700,"y":300,"wires":[["5e397987.013e38"]]},{"id":"cd63c2e5.5c58d","type":"function","z":"fa9050d8.3686","name":"encodetojpg","func":"var enable = flow.get('enableavg');\n\nif (1){\n //node.warn(util.inspect(av));\n var d = msg.img.toBuffer(function(err, d){\n var newmsg = {\n payload: d\n };\n node.send(newmsg);\n });\n msg.img.release();\n delete msg.img;\n}\n","outputs":1,"noerr":0,"x":770,"y":240,"wires":[["5e397987.013e38"]]},{"id":"a93be926.bc4138","type":"function","z":"fa9050d8.3686","name":"GetContours","func":"var cv = flow.get('cv');\n\nvar cnts = msg.out.findContours(cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);\nmsg.cnts = cnts;\n\nreturn msg;","outputs":1,"noerr":0,"x":710,"y":160,"wires":[["3ee8cb40.cd0444"]]},{"id":"3ee8cb40.cd0444","type":"function","z":"fa9050d8.3686","name":"Draw Boxes","func":"\nvar numcnts = msg.cnts.size();\n//var area = flow.get(\"area\");\n\nvar movementfound = false;\n\nif (numcnts){\n var scalex = 1;\n var scaley = 1;\n for (var c = 0; c < numcnts; c++){\n if (msg.cnts.area(c) > 200){\n var bounding = msg.cnts.boundingRect(c);\n //node.error(bounding);\n msg.img.rectangle([bounding.x*scalex, bounding.y*scaley], [bounding.width*scalex, bounding.height*scaley], [0, 0, 255], 2);\n movementfound = true;\n }\n }\n}\n\nmsg.out.release();\ndelete msg.out;\n\nmsg.movement = movementfound;\n\nvar prevmv = flow.get('prevmv');\nif(movementfound){\n if (!prevmv){\n node.send([null, {payload:0}]);\n node.send([null, {payload:1}]);\n node.warn(\"movement\");\n }\n} else {\n if (prevmv){\n node.send([null, {payload:1}]);\n node.send([null, {payload:0}]);\n node.warn(\"no movement\");\n }\n}\nflow.set('prevmv', movementfound);\n\nreturn msg;\n","outputs":"2","noerr":0,"x":710,"y":200,"wires":[["cd63c2e5.5c58d"],[]],"outputLabels":["","movement"]},{"id":"2af9aaff.6cac36","type":"comment","z":"fa9050d8.3686","name":"Flow draws boxes around motion detected","info":"","x":230,"y":40,"wires":[]}]
@btsimonh
Copy link
Author

updated to use async encoding and release() memory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment