浅谈如何使用Python控制摄像头

最初的想法是写一个可以用电脑前置摄像头拍照的程序,在舍友使用你电脑的时候,不经意间获取到一大堆奇葩舍友的表情包。

然后我又突发奇想,要不搞个开机启动吧,这样我就可以看到是谁开启了我的电脑啦。

然后,突(nao)发(dong)奇(da)想(kai)的我又想到万一我电脑不在身边怎么办要不再加个邮件发送机制吧,开机拍到照片再邮件发送给我哈哈

02工具

deepin15.9

好看好用的国产linux系统

python2.7或者3.6

解释器,哪个版本都可以,我选择3.6

smtplib

用来发送邮件

email

用来构造邮件内容的库

opencv

用来调取摄像头拍摄照片

time

获取开机以及拍照的时间

os

判断网络连接

获取脚本路径

sys

判断网络是否联通

03思路

1.用opencv库调用摄像头拍照保存为文件。

2.检查网络是否连接,未连接则图片保存到本地。

3.用email库构造邮件内容,把保存的照片以附件的形式插入到邮件内容中。

4.用smtplib库发送邮件给指定邮件接收者。

5.实现脚本开机自启动。

04安装及导入所使用的包

首先当然是安装opencv啦。

其他的email、smtplib、sys、os、time为python默认安装的包,我们只需要导入即可。

如果是python3.6安装opencv就在终端输入:

pip3 install opencv-python

如果是python2.7安装opencv,就在终端输入:

pip install opencv-python

安装完成后,我们导入必要的包。

各个包的作用在前文已经讲过,不再多言。

email我们只需要部分功能,所以选择性导入

import cv2

import smtplib

import sys

import os

import time

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

05设置参数

将smtp服务器,登录邮箱账号及密码,收件人,脚本路径等设置为全局变量。方便以后程序移植与修改。

smtpserver = ‘smtp.163.com’ # smtp服务器

username = ‘[email protected]’ # 发件邮箱账号

password = ‘888888888’ # 邮箱登录密码

sender = ‘[email protected]’ # 发件人

addressee = ‘[email protected]’ # 收件人

exit_count = 5 # 尝试联网次数

path = os.getcwd() #获取图片保存路径

注:很多邮箱为了安全起见,不会使用真实的登录密码,而是要使用授权码,在QQ邮箱的设置里面可以找到生成授权码选项。

06实现拍照

def getPicture():

cap = cv2.VideoCapture(0)

ret, frame = cap.read()

cv2.imwrite(path+‘/person.jpg’, frame)

关闭摄像头

cap.release()

07构造邮件内容

def setMsg():

下面依次为邮件类型,主题,发件人和收件人。

msg = MIMEMultipart(‘mixed’)

msg[‘Subject’] = ‘电脑已经启动’

msg[‘From’] = ‘[email protected] [email protected]

msg[‘To’] = addressee

下面为邮件的正文

text = "主人,你的电脑已经开机!

照片如下!"

text_plain = MIMEText(text, ‘plain’, ‘utf-8’)

msg.attach(text_plain)

构造图片链接

sendimagefile = open(path+‘/person.jpg’, ‘rb’).read()

image = MIMEImage(sendimagefile)

下面一句将收件人看到的附件照片名称改为people.png。

image[“Content-Disposition”] = ‘attachment; filename=“people.png”’

msg.attach(image)

return msg.as_string()

08实现邮件发送

def sendEmail(msg):

发送邮件

smtp = smtplib.SMTP()

smtp.connect(‘smtp.163.com’)

smtp.login(username, password)

smtp.sendmail(sender, addressee, msg)

smtp.quit()

09判断网络联通状态

判断网络联通状态的方法很多,我采用很简单很直接的ping。

判断网络是否联通,成功返回0,不成功返回1

linux中ping命令不会自动停止,需要加入参数 -c 4,表示在发送指定数目的包后停止。

def isLink():

return os.system(‘ping -c 4 www.baidu.com’)

return os.system(‘ping www.baidu.com’)

10主函数逻辑

如果网络连接正常,则拍照发邮件。

如果网络未连接,等待十秒钟再次测试,如果等待次数超过设置的最大次数,程序退出。

def main():

reconnect_times = 0

while isLink():

time.sleep(10)

reconnect_times += 1

if reconnect_times == exit_count:

sys.exit()

getPicture()

msg = setMsg()

sendEmail(msg)

11实现开机自启动

首先要写一个开机自启脚本,文件名为:autoStart.sh

脚本内容为

切换到我们获取照片和发送邮件的工作目录

cd /home/projects/sendemail

执行发送邮件的脚本

python2 sendEmile.py

然后在/etc/rc.local最后添加一行

./home/projects/sendemail/autoStart.sh

大功告成。

10重启系统

代码都写好了,重启系统就可以收到邮件啦。

你可能感兴趣的:(python,开发语言)