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

“我忘关烤箱了吗?”

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

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

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

橡皮筋的方法

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

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

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

Github 里有完整代码。

问题定义

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

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

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

预备条件

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

OpenCV 3.0

Python 2.7

Numpy 1.9

安装 OpenCV3.0 和 Python 2.7

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

步骤

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

加载需要的包

argparse —— 参数处理库。

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

cv2 —— OpenCV 中图像处理库。

importargparse

importnumpyasnp

importcv2

载入图片

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 图片中针对每一个色度范围,我们可以创建一个遮罩,来去掉所有不在选定范围的无关颜色。

defcreate_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)

returnoutput_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 函数):

灰度图输入。

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

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

待检测圆圈圆心的最小距离,本例中为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)incircles:

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

结果如下:

下一步

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

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

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

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

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

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

End

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

  1. 粗心店主下班忘关店门 执勤巡特警守候至凌晨

    巡特警队员"检查"店内情况 方金华 摄 巡特警队员"检查"店内情况 方金华 摄 中新网湖州1月26日电(见习记者 施紫楠 通讯员 赵琦铖)26日记者获悉,浙江长 ...

  2. Python&Opencv手势识别系统

    Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库, 可以运行在Linux, Windows ...

  3. python按时间截取视频,python使用opencv按一定间隔截取视频帧

    python如何用opencv把一个视频按每10秒一小段切下来一个人的记忆就是一座城市,时间腐蚀着一切建筑,把高楼和道路一切沙化.如果你不往前走,就会被沙子掩埋.沙城就是一个人的记忆. 视频共计30秒 ...

  4. 使用python和opencv构建集合求解器

    Have you ever played SET? SET is a game in which players race to identify patterns of three cards - ...

  5. 使用Python,OpenCV进行卡类型及16位卡号数字的OCR

    使用Python,OpenCV进行卡类型及16位卡号数字的OCR 1. 效果图 2. 原理 2.1 OCR-A字体 2.2 检测过程步骤 2.3 优化 3. 源代码 参考 这篇博客将介绍如何通过Ope ...

  6. 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

    使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...

  7. 使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别

    使用Python,OpenCV与本地二进制模式(LBP)进行人脸识别 1. 效果图 2. 原理及步骤 2.1 原理 2.2 步骤 3. 源码 参考 在深度学习和暹罗网络之前,面部识别算法依赖于特征提取 ...

  8. Python,OpenCV提取图片中的多个茄子种子轮廓,并按从左到右排序后显示

    Python,OpenCV提取图片中的多个茄子种子轮廓,并按从左到右排序后显示 1. 效果图 2. 源码 写这篇博客源于博友的提问,期望把下图中的多个茄子种子按从左到右的顺序提取出来: 1. 效果图 ...

  9. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

最新文章

  1. 江南大学人工智能与计算机学院拟录取名单,江南大学人工智能与计算机学院关于接收2021级硕士研究生调剂的通知...
  2. 计算机文件系统小结,文件系统总结.doc
  3. git中--soft和--mixed和--hard区别
  4. 从ASP.NET Core2.2到3.0你可能会遇到这些问题
  5. 基于python的空域变换
  6. oracle authentication_services,SQLNET.AUTHENTICATION_SERVICES= (NTS) 解释
  7. android 测试工具,安卓测试工具的几种实现方式
  8. 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题
  9. 【小松教你手游开发】【面试必读(编程基础)】几种常用的设计模式介绍
  10. 简账(开源记账软件)-后端环境简介及部署
  11. 四叶草clover配置工具:Clover Configurator for Mac
  12. iPhone 4 Cydia使用教程!精选Cydia源!cydia怎么添加源!Cydia源使用方法!越狱后使用cydia全攻略!
  13. 使用WireShark抓包对方QQ的ip地址(通过QQ电话)
  14. matlab光学原理仿真应用衍射,光学衍射仿真实验系统
  15. 使用vue-video-player播放视频 一个页面多个视频,并且只能唯一播放
  16. Greenplum小把戏 - 仿造Oracle rownum
  17. Mac更新Moterey后Alfred无法使用有道词典workflow
  18. OpenFace人脸分类器训练
  19. day31-20180720-流利阅读笔记
  20. Excel数据分析从入门到精通(一)软件操作技巧

热门文章

  1. 学python需要学数据库吗-学习python用什么数据库好?
  2. python和c哪个好学-零基础学C好还是python?
  3. python 文字语音朗读-怎么用 Python 来朗读网页 ?
  4. NVIDIA Jetson Xavier NX安装torch和torchvision
  5. LeetCode Decode String(栈和递归)
  6. UVa 11729 - Commando War(贪心算法)
  7. 行为模式之Iterator模式
  8. C# 移除最后一个字符
  9. PL/SQL轻量版(四)——存储函数/存储过程与触发器
  10. 前序,中序,后序遍历