百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python编程实现树莓派“抓拍”和邮件发送

off999 2024-12-13 15:36 16 浏览 0 评论

文/山东省招远第一中学 牟晓东

如果在树莓派上安装摄像头和超声波传感器等器材,再借助功能丰富的库模块,我们可以使用Python编程来实现一些比较高端实用的功能,比如进行实时监控,当发现有异常时再进行“抓拍”,并且将图像文件作为附件发送至指定的邮箱。

1.实验器材及连接

实验器材:树莓派3B+一块,古德微扩展板一块,CSI摄像头一个,超声波传感器一个,红色LED灯一支。

首先,将CSI摄像头的数据线穿过扩展板预留孔,安装至树莓派的CAMERA接口;接着,将扩展板与树莓派进行“对接”,超声波传感器插至并排的20号和21号四个引脚(注意方向朝外),LED灯插至5号引脚(注意长腿正极、短腿负极);最后,通过数据线给树莓派通电,启动操作系统(如图1)。

2.编写实现“邮件发送”功能的send_mail函数

在Python中实现“邮件发送”功能,需要导入库模块和相关信息的设置等多步操作,可自定义send_mail函数来完成。

首先,导入“简单邮件传输协议”的smtplib库和“管理电子邮件消息”的email库:“import smtplib”、“from email.mime.multipart import MIMEMultipart”、“from email.header import Header”、“from email.mime.text import MIMEText”和“from email.mime.image import MIMEImage”(如图2)。

接着,在send_mail函数中开始写代码:建立连接对象con,进行邮箱服务器的连接:“con = smtplib.SMTP_SSL('smtp.126.com',465)”——126邮箱,端口号为465。

登录用来发送邮件的邮箱:“con.login('youmail@126.com','xxxxxxxx')”,第一个参数是邮箱地址,第二个参数是明文密码。

创建邮件对象msg:“msg = MIMEMultipart()”。

设置邮件的主题和编码方式:“subject = Header('监控抓拍','utf-8').encode()”。

添加至邮件对象msg中:“msg['Subject'] = subject”。

分别设置邮件发送人和接收人的信息:“msg['From'] = 'youmail@126.com <youmail@126.com>'”“msg['To'] = '123456@qq.com'”。

创建普通文本对象text和编码方式:“text = MIMEText('监控异常,抓拍!','plain','utf-8')”。

创建文件对象image_data读取抓拍保存的capture.jpg文件并创建图片对象image1:“image_data = open('/home/pi/capture.jpg','rb').read()”、“image1 = MIMEImage(image_data)”,并且进行附件显示名称的设置:“image1['Content-Disposition'] = 'attachment;filename="capture.jpg"'”。

将普通文本对象text和图片对象image1 分别添加至邮件对象msg中:“msg.attach(text)”、“msg.attach(image1)”。

通过sendmail进行邮件的发送:“con.sendmail('youmail@126.com','123456@qq.com',msg.as_string())”,仍要包括发件人和收件人(从126邮箱发送至QQ邮箱)的信息。最后,关闭连接、退出邮箱:“con.quit()”(如图3)。

3.摄像头“监控抓拍”功能的实现

首先,导入gpiozero等库模块:“from gpiozero import DistanceSensor,LED”、“from picamera import PiCamera”、“import time”和“from signal import pause”(如图4)。

接着,进行超声波传感器、LED灯和摄像头的设置及初始化操作:建立变量sensor关联超声波传感器“sensor = DistanceSensor(echo=21,trigger=20)”,对应的信号发射和接收端口分别是20和21。

建立变量red_LED关联插接在5号引脚的红色LED灯:“red_LED = LED(5)”。

建立变量camera关联摄像头:“camera = PiCamera()”,设置图像的宽度和高度值分别为800和600(像素):“camera.resolution = (800,600)”,设置图像的饱和度和亮度均为50:“camera.saturation = 50”、“camera.brightness = 50”,设置快门速度:“camera.shutter_speed = 6000000”,设置ISO值:“camera.iso = 300”(如图5)。

建立“while True:”循环结构,先关闭LED灯:“red_LED.off()”,再建立变量dis保存超声波传感器“测距”值:“dis = sensor.distance”;然后对该数据进行是否小于0.20米的判断:“if dis <= 0.20:”,条件成立的话,说明检测到“异常”——有目标闯入,则执行三个动作:红色LED灯发光——“red_LED.on()”,摄像头抓拍并在home/pi目录中生成图像文件capture.jpg——“camera.capture('/home/pi/capture.jpg')”,将capture.jpg图像文件作为附件发送至指定的邮箱——“send_mail()”;最后,添加等待0.1秒的延迟:“time.sleep(0.1)”(如图6)。

4.测试树莓派摄像头“抓拍”和邮件发送功能是否正常

将程序代码进行适当的整理——库模块的导入均放置于程序开始,保存代码为capture_mail.py,按功能键F5运行测试。

首先,打开树莓派的/home/pi文件夹,注意观察是否有抓拍到的capture.jpg图片文件产生;接着,使用玩偶模拟有陌生来客闯入——进入超声波传感器所检测的20厘米范围内,树莓派的红色LED灯闪亮了一下,而且在/home/pi中生成了capture.jpg图片文件;双击打开查看,确实是抓拍到了“闯入者”(如图7)。

很快,预设的QQ邮箱也有了收到新邮件的提醒,打开浏览器进入邮箱查看,确实是一封主题为“监控抓拍”的邮件;点击打开,邮件正文内容是预设的“监控异常,抓拍!”,附件是caputure.jpg,图片内容正是树莓派摄像头抓拍的“闯入者”(如图8)。

值得一提的是,如果程序一直在运行的话,只要有异常的“闯入者”进入超声波传感器的有效检测范围,就会在/home/pi文件夹中再次生成新的caputure.jpg(是“覆盖”模式),并且将它作为附件发送给预设的邮箱中,实现了监控抓拍和邮件发送的预期目标。

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: