一、背景:如何實現電腦防偷窺?自己就百度
(1)貼物理防窺膜,一百度,最多就是賣膜的商家。蘋果顯示器真心不建議貼膜,貌似是時間久了膠紙會對顯示屏表層破壞。
(2)蘋果自己申請的有防偷窺專利,比如:
1:當有人看向你的屏幕的時候,電腦攝像頭能檢測到偷窺者,然后,電腦界面只跟隨主人的眼睛顯示界面內容,剩下的都是亂碼。感覺挺牛的,但是,目前還只是專利,沒有應用到手機電腦上。
2:可以調節可視角,從而達到物理防窺膜的功能,貌似手機有應用電腦沒有。
(3)華為手機防偷窺屏設置的方法如下:
1、點擊打開手機桌面上的設置。
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
將檢測到的人臉,依次在攝像頭窗口實時平鋪顯示(人臉對齊)(不能戴口罩遮掩口鼻,否則識別不到);
當然,在這個腳本基礎上,為了達到跟Rearview后視鏡的功能更接近,更滿足使用需求,添加需求如下:(1)窗口可調整大小(2)窗口位置固定於左上角or右下角(3)窗口置頂,不被別的應運覆蓋(4)界面出來不是鏡像的,設置為鏡像。
架構:mac(跟Linux系統很相似)+python3+opencv(調用攝像頭庫)+pillow/PIL(畫圖庫)+dlib(人臉檢測庫)+shape_predictor_68_face_landmarks.dat(人臉識別68個特征點檢測數據庫)
我自己先后安裝命令記錄如下:
默認Python是Python2:
pip install opencv-python #不成功
python -m pip install opencv-python==4.2.0.32 #成功
pip install PIL #提示沒有安裝PIL,但是,這種命令是錯誤的,不成功
pip install Pillow #成功安裝PIL(歷史淵源,具體可以自己百度,PIL很久沒有維護版本更新了,后來出來了pillow是對PIL的延伸,而且pillow的上級目錄名稱沿用了PIL)
pip install imutils #成功
pip install dlib #失敗
pip install dlib -vvv #失敗
pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl #失敗
pip install cmake #百度說是先安裝cmake 成功
pip install dlib #還是失敗
換用Python3:
python3 -m pip install opencv-python #成功
/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip #升級pip
python3 -m pip install pillow #成功
python3 -m pip install imutils #成功
python3 -m pip install dlib #失敗
python3 -m pip install dlib -vvv #失敗
python3 -m pip install cmake #成功
python3 -m pip install dlib #失敗,換Python3也不行,跟Python2一樣。所以就不是Python版本問題。
brew install anaconda #成功,百度,好多借用anaconda搭建Python環境,去解決dlib安裝失敗問題。
conda create -n face python=3.8 #創建3.8環境,名為face,失敗
/usr/local/anaconda3/conda create -n face python=3.8 #成功,創建face環境,但是conda不在環境變量下
/usr/local/anaconda3/condabin/conda activate face #成功,激活face環境
/usr/local/anaconda3/condabin/conda init #將環境變量信息寫入.bashrc文件中,下次啟動之后會自動激活conda的環境
source .bash_profile #激活,是環境變量起效
conda install opencv-python #失敗,默認下載源里沒有,名稱不對
conda install -c conda-forge opencv #成功,在face環境下,安裝opencv #-c 是在默認的下載源里增加conda-forge下載源,提高下載成功率
python3 -m pip install imutils #成功
python3 -m pip install dlib #雖然成功安裝,但還是運行報錯沒有dlib
conda install -c menpo dlib=18.18 #-c 是在默認的下載源里增加menpo下載源,提高下載成功率
conda install -c conda-forge pillow #安裝到Anaconda的環境下
conda install -c conda-forge pillow=8.1.2 #成功
conda install -c conda-forge dlib
Pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple/ #忘記了
Pip install dlib -i https://pypi.tuna.tsinghua.edu.cn/simple/ #忘記了
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
conda install -c conda-forge face_recognition #成功
pip install --no-dependencies face_recognition #可參考
Pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple/ #成功
還需要,手動下載shape_predictor_68_face_landmarks.dat(人臉識別68個特征點檢測數據庫),然后,放到跟腳本匹配的目錄下。
顎點= 0–16
右眉點= 17–21
左眉點= 22–26
鼻點= 27–35
右眼點= 36–41
左眼點= 42–47
口角= 48–60
嘴唇分數= 61–67
百度雲鏈接:https://pan.baidu.com/s/1Z1a_ud__BWXgCWZeSdpL2g
提取碼:lzjy
人臉識別69個特征點檢測數據庫具體可參考:https://blog.csdn.net/qq_29894613/article/details/89531013和https://blog.csdn.net/monster663/article/details/118341515
報錯解決 :
1、報錯:關於ERROR: Failed building wheel for dlib
解決:這個,真的很費時間,思路就是,借用anaconda搭建Python環境,去解決dlib安裝失敗問題。具體看上邊的命令。
關於這個問題,也可以參考:https://blog.csdn.net/weixin_43738067/article/details/105697827
2、報錯:/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,成功了。
3、報錯: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() #返回值:R1:布爾值(視頻讀取正確 True,錯誤False) R2:圖像的三維矩陣,這樣 ret 存儲布爾值,frame 存儲圖像。如果不要布爾值,也可以_, frame = cap.read()。若使用一個變量來接收兩個值,如 frame = cap.read() 則 frame 為一個元組,原來使用 frame 處需更改為 frame[1]。
# show a frame
cv2.imshow("capture", frame) # 窗口顯示,顯示名為 capture
if cv2.waitKey(1) & 0xFF == ord('q'): # cv2.waitKey(1)每幀數據延時 1ms(延時不能為 0,否則讀取的結果會是靜態幀)。waitKey(int delay)函數接收一個整型值,如果值是0,那么函數不會有返回值,如果delay大於0,那么超過delay ms后,如果沒有按鍵,那么會返回-1,如果按鍵會返回鍵盤值。 在某些系統中,返回的鍵盤值可能不是ASCII編碼(整型值)(就是沒法直接判斷它按的是哪個按鈕了),所以通過與運算(& 0xFF)只取第八位(即,字符最后一個字節),就能愉快地玩耍了。
break
print(cap.get(3)) #cap.get( propId )查詢視頻的參數,返回值:無,參數propId:查詢的視頻參數,其中部分值可以使用 cap.set() 進行修改
print(cap.get(4))
cap.release() #調用release()釋放攝像頭
cv2.destroyAllWindows() #調用destroyAllWindows()釋放所有圖像窗口
參考:https://blog.csdn.net/pursuit_zhangyu/article/details/81563379
https://blog.csdn.net/qq_31258245/article/details/79205305 Opencv中使用waitKey(10) & 0xFF的原因
(2)其他庫有機會用到再補充。