Node-Red定时拍照保存至文件夹
本章涉及到UI界面显示图片请参考:node-red UI界面图片输出
1.节点介绍
要实现Node-Red定时拍照保存至文件夹,我们需要用到的新控件包含:node-red-node-ui-webcam。
下载新控件的步骤如下:
- 首先在左上角点击设置,并找到节点管理 ;
- 在节点管理中点击安装;
- 在安装界面的查询窗口输入控件名称,查询后选择下载,等待下载完成;
2.webcam节点介绍
webcam节点为拍照节点,需要使用到摄像头。此节点将适用于所有现代浏览器,但不适用于 IE。如果您远程访问仪表板,则必须使用 HTTPS,否则浏览器将阻止对网络摄像头的访问。
(1)节点的使用
-
在UI界面点击中间相机即可激活相机;
-
激活相机后,点击右下角相机可进行抓拍;
-
在右下角的小箭头中,可对相机进行选择,针对下图所示Turn off camera表示关闭相机;MTD Camera为电脑自带的相机;HD 720P Webcam为外接相机。
(2)输入函数
- payload:图像的缓冲区,如果设置为null或false,则显示的图像将被清除。
- capture:这将触发网络摄像头捕捉图像,但触发前需激活摄像头。
- camera:可用摄像机的索引,切换摄像机。
这里主要介绍capture变量的使用,在inject节点中设定msg.capture为非0 数据,在UI界面激活摄像头,点击注入则会在右侧debug窗口看到有数据输出
(3)输出函数
输出内容只有payload,在payload中是格式为buffer的图片,若想将图片显示到UI界面还需要将格式转化为base64。
3. 定时拍照保存至文件夹
案例功能:UI界面摄像头每5秒钟拍照一次,并拍照次数.png命名保存至文件夹中。
- 使用inject节点作为循环5次定时拍照的触点,并设定msg.capture为非0数字;
- 在function节点中设定文件保存路径及文件名并保存至函数msg.filename,注意文件名需使用context函数进行静态处理;
- write file节点的输入函数中可使用传参的形式设定文件保存路径及文件名称,函数为msg.filename,行为选择复写文件,且在function中定义的目录真是存在。
代码界面展示:
保存及命名function函数中代码编写如下(在function中传递filename保存路径时,需要对 \ 进行转义处理)
//保存及命名
var filenamenum = context.get('filenamenum')||0;
msg = {filename:'D:\\Picture\\'+filenamenum+'.png',
payload:msg.payload,
}
filenamenum ++;
context.set('filenamenum',filenamenum)
return msg;
代码展示:
[{"id":"b1ce81893d6b5b49","type":"tab","label":"流程 1","disabled":false,"info":"","env":[]},{"id":"b6d0e10b59fd75dd","type":"ui_webcam","z":"b1ce81893d6b5b49","name":"","group":"5705b53f.d3e0bc","order":20,"width":0,"height":5,"countdown":false,"autoStart":false,"hideCaptureButton":false,"showImage":"2","mirror":true,"format":"png","x":260,"y":120,"wires":[["8a8a4d12c733ca88"]]},{"id":"f5c4f157e52c0a50","type":"file","z":"b1ce81893d6b5b49","name":"","filename":"filename","filenameType":"msg","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":580,"y":120,"wires":[[]]},{"id":"8a8a4d12c733ca88","type":"function","z":"b1ce81893d6b5b49","name":"保存及命名","func":"var filenamenum = context.get('filenamenum')||0;\nmsg = {filename:'D:\\\\Picture\\\\'+filenamenum+'.png',\n payload:msg.payload,\n}\nfilenamenum ++;\ncontext.set('filenamenum',filenamenum)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":120,"wires":[["f5c4f157e52c0a50"]]},{"id":"8b25b93de47f62cd","type":"inject","z":"b1ce81893d6b5b49","name":"","props":[{"p":"payload"},{"p":"capture","v":"1","vt":"num"}],"repeat":"5","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":120,"wires":[["b6d0e10b59fd75dd"]]},{"id":"5705b53f.d3e0bc","type":"ui_group","name":"Linear Gauges","tab":"64fe41f2.fdbe3","order":1,"disp":true,"width":"5","collapse":false,"className":""},{"id":"64fe41f2.fdbe3","type":"ui_tab","name":"Home","icon":"dashboard"}]