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)