通过计算机视觉和NodeJS实现灯光自动化方案分享

描述

挑战

在家里和办公室里,人们很容易看到灯没关,即使附近几乎没有人。

除了花费更多,这种照明对环境也有负面影响。我们越来越依赖有限的、不可再生的能源来发电,而这些能源经常被浪费。

虽然我们在家中的能源使用量是名义上的,但在办公室中,使用量要多得多。因此,对环境和成本的负面影响要多得多。这需要我们采取积极行动。

当张贴“请在离开前关灯”的标志影响很小或没有影响时,考虑到灯的数量、覆盖面积和其他因素,损失的幅度更大。让某人通过每次都关掉灯来解决过度照明的问题是不可行的。人类的记忆是易变的,不可依赖。

让我们了解一下单个灯泡的影响。一个10瓦的灯泡每小时耗电0.01千瓦(kWh)。假设1千瓦时的成本为12美分。那么,在不需要时点亮的每10瓦灯泡将花费每小时0.12美分。

我们会让你的基本算术技能来计算整个办公室的总成本,方法是用灯的数量乘以上面的数字。

那么我们如何解决这个问题呢?

虽然市场上有很多智能控制和自动化解决方案,但大多数解决方案需要定期设置额外的硬件,并导致额外的维护成本。

有没有更好的方法来应对这一挑战?

所有办公场所都设置了摄像头来监控该区域。我和同事们集思广益,通过最少的投资来解决这个问题。

可以使用这些捕捉不同帧的相机来自动关闭灯光?

方案

解决方案是通过计算机的眼睛——通过计算机视觉——表达我们节约能源的意图。

那么计算机视觉到底是什么呢?

“计算机视觉,通常缩写为CV,被定义为一个研究领域,旨在开发帮助计算机‘看到’和理解照片和视频等数字图像内容的技术。”

该系统将观察来自摄像机的输入流,这基本上是摄像机的视野。每个捕获的帧被划分为4个区域。如果某个区域中没有人,则属于该区域的灯光将关闭。

这个解决方案是用opencv4 Nodejs实现的,用于流行的开源计算机视觉库OpenCV。连同socket.io和express用于渲染一个web应用程序,以显示实时视频流并模拟灯光的打开和关闭。

实施步骤

1.导入所需的库。

const socketIOProvider = require('socket.io');

const cv = require('opencv4nodejs');

2.开始从相机捕捉视频源。

const fps = 30; //frames per second
/**
 * video source set to 0 for stream from webcam
 * video source can be set url from ip cam also eg: "http://192.168.1.112:8080/video"
 */

const videoSource = 0;
const videoCap = new cv.VideoCapture(videoSource);
videoCap.set(cv.CAP_PROP_FRAME_WIDTH, 600);
videoCap.set(cv.CAP_PROP_FRAME_HEIGHT, 600);

3.读取并以常规帧速率将其流式传输到网络应用程序。

 setInterval(() => {
    const frame = videoCap.read();
    const image = cv.imencode('.jpg', frame).toString('base64');
    io.emit('new-frame', { live: image });
}, 1000 / fps);

4.以大于实时流的间隔读取以确定用户存在。

/**
 * Since video/image transformations are computionally expensive operations, these operations are performed independent of live feed streaming.
 */

setInterval(() => {
    const frame = videoCap.read();
    const faces = detectFaces(frame);
    const imageWithFaces = cv.imencode('.jpg', frame).toString('base64');
    io.emit('new-frame', { transformed: imageWithFaces, transformationData: calculatePeoplePosition(frame, faces) });
}, 10000 / fps);

5.使用任何OpenCV分类器检测人。在这个解决方案中,使用了“HAAR正面人脸分类器”。

/**
 * 
 * Face detection transformation on the stream
 */
    
const detectFaces = (frame) => {
    let faces = [];
    const image = frame.bgrToGray();
    const classifier = new cv.CascadeClassifier(cv.HAAR_FRONTALFACE_ALT2);
    const results = classifier.detectMultiScale(image);
    if (results.objects.length) {
        results.objects.forEach((faceRect, i) => {
            if (results.numDetections[i] < 1) {
                return;
            }
            drawFaces(frame, faceRect);
            faces.push(faceRect);
        });
    }
    return faces;
};

6.在框架上标记面部,以便可视化检测。

/**
 * Drawing rects around faces on frame
 */
const drawFaces = (frame, faceRect) => {
    const rect = cv.drawDetection(frame, faceRect, {
        color: new cv.Vec(255, 0, 0),
        segmentFraction: 4
    });
};

7.确定人们相对于框架的位置,以确定他们所在的区域,从而只照亮那些部分。确定的结果随后被发送到网络应用程序进行照明模拟。更改灯泡颜色以模拟要照亮的区域。

nodejs

结论

这是展示技术如何通过节约能源来改善地球的众多例子之一。你还可以通过这个简单的实现学习如何解决常见的工作场所挑战。

上述解决方案的源代码:https://github.com/Mudassir-23/opencv-nodejs-energy-saver

编辑:黄飞 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分