Python|Mac——依據攝像頭檢測的方式去實現“防窺屏”


一、背景:如何實現電腦防偷窺?自己就百度
(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)界面出來不是鏡像的,設置為鏡像。

  • 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
    獲取攝像頭視頻,實時控制多張人臉戴墨鏡和叼煙卷(戴口罩也可以)

    原理:從攝像頭獲取視頻流,並轉換為一幀一幀的圖像,然后將圖像信息傳遞給opencv這個工具庫處理,返回灰度圖像(就像你使用本地靜態圖片一樣)
    程序啟動后,根據監聽器信息,使用一個while循環,不斷的加載視頻圖像,然后返回給opencv工具呈現圖像信息。
    創建一個鍵盤事件監聽,按下"d"鍵,則開始執行面部匹配,並進行面具加載(這個過程是動態的,你可以隨時移動)。
    面部匹配使用Dlib中的人臉檢測算法來查看是否有人臉存在。如果有,它將為每個人臉創建一個結束位置,眼鏡和煙卷會移動到那里結束。
    然后我們需要縮放和旋轉我們的眼鏡以適合每個人的臉。我們將使用從Dlib的68點模型返回的點集來找到眼睛和嘴巴的中心,並為它們之間的空間旋轉。
    在我們實時獲取眼鏡和煙卷的最終位置后,眼鏡和煙卷從屏幕頂部進入,開始匹配你的眼鏡和嘴巴。
    假如沒有人臉,程序會直接返回你的視頻信息,不會有面具移動的效果。
    默認一個周期是4秒鍾。然后你可以通過"d"鍵再次檢測。
    程序退出使用"q"鍵。
  • input_static_pic_to_gif2_for_class.py   
    識別任意存在人臉的照片,動態生成戴墨鏡和叼煙卷的動圖GIF(細長的照片容易生成效果圖)
    GIF動圖(眼鏡和煙卷從上往下匹配到眼鏡,最后出現字母),可以添加到VX表情包里。
  • upload_image_to_draw_bounding_box.md
    識別上傳對象,標注類型,並定位其准確坐標

(3)還發現好多類似Python功能腳本,這里就不贅述,感興趣可以搜一下。

三、 架構搭建
上邊的腳本運行簡單,前提是你搭建好完整的架構,即Python軟件、Python運行環境、各種Python庫包、數據包。
具體安裝什么庫包,可以一邊運行Python腳本看報錯,一邊安裝缺少的庫包解決報錯。

架構: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

 

while(cap.isOpened()): # 循環讀取每一幀  #函數名:cap.isOpened(),返回一個布爾值( True / False ),檢查是否初始化成功,成功返回 True
 

print(cap.get(3))    #cap.get( propId )查詢視頻的參數,返回值:無,參數propId:查詢的視頻參數,其中部分值可以使用 cap.set() 進行修改
print(cap.get(4))

cv2.imwrite( '1.jpg', frame) #保存一幀圖片

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)其他庫有機會用到再補充。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM