忘关烤箱了?我用 Python 和 OpenCV 来帮忙

本文介绍了一种利用Python和OpenCV技术自动识别烤箱开关状态的方法。通过分析摄像头捕获的图像,该方法能准确判断烤箱是否处于开启状态。

这篇文章应用计算机视觉和图像处理技术,展示了检测烤箱开关状态的过程。在生活中,有时你会粗心大意忘关烤箱之类的厨房电器,这潜在很大的危险。因此作者采用 Python 和 OpenCV,通过家庭摄像头获取的图像来自动识别烤箱是否开着,进而可以触发警报。

“我忘关烤箱了吗?”

这个问题常常会在最不方便的时候出现在你的脑子里。

有时是当你刚刚走出家门的时候。 有时是当你在上班路上的时候。 有时是当你坐在飞机上准备度个长假的时候……

解决这个问题的方法是多种多样的:

  1. 橡皮筋的方法

  2. 大声说或唱出来(就像 Samuel L. Jackson 一样)

  3. 当你离开家去度假的时候,给烤箱在内的电器列个清单或做个标记。 或者,我们也许有更好的做法……

在本教程中,我们会尝试利用技术手段解决这个问题。

Github 里有完整代码。

问题定义

对我们而言,我们需要确定一个信号,用于判断烤箱的开关状态。在我的厨房里,这个信号就是顶部标记着“烤箱开”字样的红色灯。

当红色灯亮的时候,烤箱是开着的:

当红色灯灭的时候,烤箱是关着的:

预备条件

确保你的电脑上安装了以下应用:

  1. OpenCV 3.0

  2. Python 2.7

  3. Numpy 1.9

安装 OpenCV3.0 和 Python 2.7

如果你尚未安装 OpenCV,请按照 Adrian Rosebrock 的完美教程,在 OSX 系统上安装 OpenCV 3.0 和 Python 2.7+。我在安装步骤里增加了一些自己的注释,以防你在 OSX 上编译 OpenCV 3.0时遇到问题。

步骤

如果你已经成功在你的环境中安装了 OpenCV,我们就可以开始判断烤箱开关的数据分析了。

加载需要的包

  1. argparse —— 参数处理库。

  2. numpy —— 高度优化的数值运算库。OpenCV 在数组结构中使用 numpy。

  3. cv2 —— OpenCV 中图像处理库。

import argparse

import numpy as np

import cv2

载入图片

image = cv2.imread(image_path)

图片降噪

我们为了给图片降噪,需要对输入图片进行平滑处理。这样会更容易在图片中定位目标。使用 medianBlur 函数,把光圈大小定为 3 。数字越大意味着图像会越模糊。

blur_image = cv2.medianBlur(image, 3)

把图片颜色转为 HSV 格式

HSV —— 色度、饱和度和纯度(亮度)。HSV 可以让我们提取出一个彩色对象,因为它比 BGR 格式(译者注:与我们常说的RBG色彩模型类似,三个字母分别代表红蓝绿三色)更容易表征颜色。

把图片转为 HSV 格式可以让我们通过色度(一个值而不是三个值),来确定图片中的一个颜色。

以下是实现方式:

hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV)

执行结果如下图:

检测图片中的颜色

为了检测我们想要的颜色,我们可以查看烤箱灯图片中颜色的直方图。

我们可以看出,红色在图片中占统治地位。红色有两个高峰 —— 一个幅度高,一个幅度低。这些颜色值转变为色度范围从 0 到10,以及从 160 到 180 (针对红色)。

在 HSV 图片中针对每一个色度范围,我们可以创建一个遮罩,来去掉所有不在选定范围的无关颜色。

def create_hue_mask(image, lower_color, upper_color):

lower = np.array(lower_color, np.uint8)

upper = np.array(upper_color, np.uint8)

# Create a mask from the colors

mask = cv2.inRange(image, lower, upper)

output_image = cv2.bitwise_and(image, image, mask = mask)

return output_image

# Get lower red hue

lower_red_hue = create_hue_mask(hsv_image, [0, 100, 100], [10, 255, 255])

# Get higher red hue

higher_red_hue = create_hue_mask(hsv_image, [160, 100, 100], [179, 255,255])

结果如下:

接下来把这些图片合并在一起,以抓取所有红色色度。

full_image = cv2.addWeighted(lower_red_hue, 1.0, higher_red_hue, 1.0, 0.0)

结果如下:

发现图片中的圆圈

现在我们的图片上仅有红色色度,接着我们需要判定红灯是否开启(即是否存在红色色度的那个圆圈)。我们需要在新图中发现圆圈,不过首先需要把图片转换成灰度图(因为 HoughCircles 函数的输入要求是灰度图)。

检测图片中的圆圈需要以下参数(使用 OpenCV中 的 HoughCircles 函数):

  1. 灰度图输入。

  2. HOUGH_GRADIENT 是用来检测圆圈的方法(目前仅有的一个方法)。

  3. 累加器和图片分辨率的反比。在本例中,为1.2。

  4. 待检测圆圈圆心的最小距离,本例中为100。

#Convert image to grayscale

image_gray = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)

#Find circles in the image

circles = cv2.HoughCircles(image_gray, cv2.HOUGH_GRADIENT, 1.2, 100)

结果

此时就可以检查是否有圆圈了。如果有就意味着至少有一个烤箱灯亮着。如果找不到圆圈就意味着没有灯亮,烤箱关着。

为了证明此结论,我们可以用下述代码在原图中画圆圈:

# Draw the circles on the original image

circles = np.round(circles[0, :]).astype("int")

for (center_x, center_y, radius) in circles:

cv2.circle(image, (center_x, center_y), radius, (0, 255, 0), 4)

结果如下:

下一步

接下来还有很多可以做的,比如:

  1. 检测特定灯的开启,用以了解烤箱的真实状态。

  2. 建立一个服务以便远程检查烤箱状态。

  3. 把该功能加入树莓派(译者注:基于Linux的迷你开发板),我们就拥有可以警告烤箱关闭与否的小型设备。

全部样例代码可以在 Github 中找到。

Github链接:https://github.com/kazuar/opencv_light_detection

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值