Python//Mac——依据摄像头检测的方式去实现“防窥屏”
一、背景:如何实现电脑防偷窥?自己就百度
(1)贴物理防窥膜,一百度,最多就是卖膜的商家。苹果显示器真心不建议贴膜,貌似是时间久了胶纸会对显示屏表层破坏。(2)苹果自己申请的有防偷窥专利,比如1:当有人看向你的屏幕的时候,电脑摄像头能检测到偷窥者,然后,电脑界面只跟随主人的眼睛显示界面内容,剩下的都是乱码。感觉挺牛的,但是,目前还只是专利,没有应用到手机电脑上。2:可以调节可视角,从而达到物理防窥膜的功能,貌似手机有应用电脑没有。
(3)华为手机防偷窥屏设置的方法如下:点击打开手机桌面上的设置。2、在设置菜单下找到并点击进入安全。3、进入“应用锁”,设置初始密码,并添加应用。4、应用锁关联人脸后,可借助姿态感应器,当感知到人脸发生变化后(例如多人围观、或他人使用等场景),被加锁的应用需重新验证才能进入,应用的通知详情也会自动隐藏。此功能光线良好时体验效果更佳。
(4)Rearview(后视镜软件,收费),装上它就像给你的Mac装上了后视镜 —— 用前置摄像头随时察看是否有人在背后偷窥。
即使其他应用处于全屏模式,这个摄像头也能一直置于页面前端。
当相机检测到其他脸部时,你还可以为此添加声音警报,这样当你沉迷于工作时,也能立刻察觉到。
关于隐私方面也无需担心。Rearview应用程序不记录任何内容,无需访问网络,也不存储任何个人数据,摄像机视图仅显示当前设备摄像机捕获的图像。不过目前Rearview仅支持Mac上使用而且收费。
二、要实现的目标
综合以上,就想着能不能用脚本去实现Rearview后视镜的功能,“Python 控制Mac摄像头,实现防窥屏”
架构:mac+python3+opencv(调用摄像头)+pillow/PIL(画图库)+dlib(人脸检测库)+shape_predictor_68_face_landmarks.dat(人脸识别68个特征点检测数据库)
功能:可进行拍照、实时控制人脸
- faces_chip_from_camera.py
将检测到的人脸,依次在摄像头窗口实时平铺显示(人脸对齐)(不能戴口罩遮掩口鼻,否则识别不到);
- python3 crop_faces_show.py
将检测到的人脸剪切下来, 依次排序平铺显示在新的图像上; - python3 crop_faces_save.py
将检测到的人脸生成单个图像存储到本地路径; - python3 faces_from_camera.py
将检测到的人脸,依次在摄像头窗口实时平铺显示;
(2)https://zhuanlan.zhihu.com/p/77278306 在这里找到有趣的相关摄像头应用功能
GitHub:https://github.com/tomoncle/face-detection-induction-course
- input_video_stream_paste_mask.py
获取摄像头视频,实时控制多张人脸戴墨镜和叼烟卷 - input_static_pic_to_gif2_for_class.py
识别任意存在人脸的照片,动态生成戴墨镜和叼烟卷的动图GIF - upload_image_to_draw_bounding_box.md
识别上传对象,标注类型,并定位其准确坐标
(3)
三、 架构搭建
上边的脚本运行简单,前提是你搭建好完整的架构,即Python软件、Python运行环境、各种Python库包、数据包。
具体安装什么库包,可以一边运行Python脚本看报错,一边安装缺少的库包解决报错。
架构:mac(跟Linux系统很相似)+python3+opencv(调用摄像头库)+pillow/PIL(画图库)+dlib(人脸检测库)+shape_predictor_68_face_landmarks.dat(人脸识别68个特征点检测数据库)
我自己先后安装命令记录如下:
conda install -c menpo dlib=18.18 #-c 是在默认的下载源里增加menpo下载源,提高下载成功率
conda install -c conda-forge pillow #安装到Anaconda的环境下
conda install -c conda-forge dlib
pip install dlib #安装提示:Requirement already satisfied: dlib in /usr/local/anaconda3/envs/face/lib/python3.8/site-packages (19.21.1)「就是,用conda安装好的dlib」
conda list |grep "dlib" #查看conda安装列表中dlib版本等信息。
dlib 19.21.1 py38hfe90ab8_0 conda-forge
conda list #查看已安装的包
pip uninstall dlib #卸载dlib
报错解决 :
1、报错:/anaconda3/envs/face/lib/python3.8/site-packages/skimage/io/manage_plugins.py:23: UserWarning: Your installed pillow version is < 8.1.2. Several security issues (CVE-2021-27921, CVE-2021-25290, CVE-2021-25291, CVE-2021-25293, and more) have been fixed in pillow 8.1.2 or higher. We recommend to upgrade this library.
解决:conda install -c conda-forge pillow=8.1.2,成功了。
2、报错:AttributeError: module 'dlib' has no attribute dlib.image_window()
解决:
先说一下出现问题的环境:
Mac + Anaconda 其中Python版本为3.8 。
在终端跑dlib官方样例的时候报这个错误的,但是疑惑的是,我的Anaconda创建的环境中安装dlib是很成功的,conda list 也可以找到,并且是当前最新版本dlib 19.19 :
于是看到有的解决方案中是要求安装lib11-dev ,
即 :sudo apt-get install libx11-dev
本人照做了,但是提示已经是最新版本,所以不是这个问题。
有的博客中说需要cmake,我的电脑中一直都有这个环境,所以也不是这个问题。
所以,我尝试了卸掉dlib然后再重新装,结果依旧报错,不过我装的时候都是用conda install 装的,所以前后没变化也正常。
最后解决的办法是:不用conda命令装,而是用pip。我的电脑在命令行上如果直接输入Python的话,默认导入的是Anaconda的Python3.8 ,如图
常规意义上如果用pip装的话,应该是安装到非Anaconda的环境下,但是确实在终端输入
pip install dlib
后就进入了安装状态,安装完之后,重新运行样例代码就没有这个报错了。
四、库简单介绍
(1)opencv:
import cv2 #Python脚本引入库
cap = cv2.VideoCapture(0) #创建摄像头对象——使用opencv自带的VideoCapture()函数定义摄像头对象,其参数0表示第一个摄像头。
cap.set(3, 960) #设置视频播放的的大小,需要了解摄像头支持的视频大小。 视频每一帧的宽
cap.set(4, 960) #视频每一帧的高
当然也可以设置其他的参数(第一个参数就是图中的值),具体参考下图:
逐帧显示实现视频播放
在while循环中,利用摄像头对象的read()函数读取视频的某帧,并显示,然后等待1个单位时间,如果期间检测到了键盘输入q,则退出,即关闭窗口。
while(1):
# get a frame
ret, frame = cap.read()
# show a frame
cv2.imshow("capture", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
函数名:cap.read()
功 能:返回两个值先返回一个布尔值,如果视频读取正确,则为 True,如果错误,则为 False,也可用来判断是否到视频末尾 再返回一个值,为每一帧的图像,该值是一个三维矩阵。
通用接收方法为: ret,frame = cap.read(); 这样 ret 存储布尔值,frame 存储图像 若使用一个变量来接收两个值,如 frame = cap.read() 则 frame 为一个元组,原来使用 frame 处需更改为 frame[1]
返回值:R1:布尔值 R2:图像的三维矩阵
释放摄像头对象和窗口
调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。
cap.release()
cv2.destroyAllWindows()
参考:https://blog.csdn.net/pursuit_zhangyu/article/details/81563379
(2)