再也不怕別人動電腦了!用Python實時監控

来源:https://www.cnblogs.com/shann001/archive/2020/06/10/13088464.html
-Advertisement-
Play Games

作者:美圖博客 https://www.meitubk.com/zatan/386.html 前言 最近突然有個奇妙的想法,就是當我對著電腦屏幕的時候,電腦會先識別屏幕上的人臉是否是本人,如果識別是本人的話需要回答電腦說的暗語,答對了才會解鎖並且有三次機會。如果都沒答對就會發送郵件給我,通知有人在動 ...


作者:美圖博客

https://www.meitubk.com/zatan/386.html

前言

最近突然有個奇妙的想法,就是當我對著電腦屏幕的時候,電腦會先識別屏幕上的人臉是否是本人,如果識別是本人的話需要回答電腦說的暗語,答對了才會解鎖並且有三次機會。如果都沒答對就會發送郵件給我,通知有人在動我的電腦並上傳該人頭像。

過程

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ群:1097524789

環境是win10代碼我使用的是python3所以在開始之前需要安裝一些依賴包,請按順序安裝否者會報錯

pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

接下來是構建識別人臉以及對比人臉的代碼

import face_recognition
import cv2
import numpy as np

video_capture = cv2.VideoCapture(0)
my_image = face_recognition.load_image_file("my.jpg")
my_face_encoding = face_recognition.face_encodings(my_image)[0]
known_face_encodings = [
    my_face_encoding
]
known_face_names = [
    "Admin"
]

face_names = []
face_locations = []
face_encodings = []
process_this_frame = True

while True:
    ret, frame = video_capture.read()
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    rgb_small_frame = small_frame[:, :, ::-1]
    if process_this_frame:
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
        face_names = []
        for face_encoding in face_encodings:
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]
            face_names.append(name)

    process_this_frame = not process_this_frame
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        top *= 4
        left *= 4
        right *= 4
        bottom *= 4
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

其中my.jpg需要你自己拍攝上傳,運行可以發現在你臉上會出現Admin的框框,我去網上找了張圖片類似這樣子

​識別功能已經完成了接下來就是語音識別和語音合成,這需要使用到百度AI來實現了,去登錄百度AI的官網到控制台選擇左邊的語音技術,然後點擊面板的創建應用按鈕,來到創建應用界面

打造電腦版人臉屏幕解鎖神器

創建後會得到AppID、API Key、Secret Key記下來,然後開始寫語音合成的代碼。安裝百度AI提供的依賴包

pip install baidu-aip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install playsound -i https://pypi.tuna.tsinghua.edu.cn/simple

然後是簡單的語音播放代碼,運行下麵代碼可以聽到萌妹子的聲音

import sys
from aip import AipSpeech
from playsound import playsound

APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis('你好吖', 'zh', 1, {'vol': 5, 'per': 4, 'spd': 5, })

if not isinstance(result, dict):
    with open('auido.mp3', 'wb') as file:
        file.write(result)

filepath = eval(repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3'
playsound(filepath)

有了上面的代碼就完成了檢測是否在電腦前(人臉識別)以及電腦念出暗語(語音合成)然後我們還需要回答暗號給電腦,所以還需要完成語音識別。

import wave
import pyaudio
from aip import AipSpeech

APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 8000
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)

print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))


def get_file_content():
    with open(WAVE_OUTPUT_FILENAME, 'rb') as fp:
        return fp.read()


result = client.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, })
print(result)

運行此代碼之前需要安裝pyaudio依賴包,由於在win10系統上安裝會報錯所以可以通過如下方式安裝。到這個鏈接 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 去下載對應的安裝包然後安裝即可。

打造電腦版人臉屏幕解鎖神器

運行後我說了你好,可以看到識別出來了。那麼我們的小模塊功能就都做好了接下來就是如何去整合它們。可以發現在人臉識別代碼中if matches[best_match_index]這句判斷代碼就是判斷是否為電腦主人,所以我們把這個判斷語句當作main函數的入口。

if matches[best_match_index]:
    # 在這裡寫識別到之後的功能
    name = known_face_names[best_match_index]

那麼識別到後我們應該讓電腦發出詢問暗號,也就是語音合成代碼,然我們將它封裝成一個函數,順便重構下人臉識別的代碼。

import cv2
import time
import numpy as np
import face_recognition

video_capture = cv2.VideoCapture(0)
my_image = face_recognition.load_image_file("my.jpg")
my_face_encoding = face_recognition.face_encodings(my_image)[0]
known_face_encodings = [
    my_face_encoding
]
known_face_names = [
    "Admin"
]

face_names = []
face_locations = []
face_encodings = []
process_this_frame = True


def speak(content):
    import sys
    from aip import AipSpeech
    from playsound import playsound
    APP_ID = ''
    API_KEY = ''
    SECRET_KEY = ''
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    result = client.synthesis(content, 'zh', 1, {'vol': 5, 'per': 0, 'spd': 5, })
    if not isinstance(result, dict):
        with open('auido.mp3', 'wb') as file:
            file.write(result)
    filepath = eval(repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3'
    playsound(filepath)


try:
    while True:
        ret, frame = video_capture.read()
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
        rgb_small_frame = small_frame[:, :, ::-1]
        if process_this_frame:
            face_locations = face_recognition.face_locations(rgb_small_frame)
            face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
            face_names = []
            for face_encoding in face_encodings:
                matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
                name = "Unknown"
                face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
                best_match_index = np.argmin(face_distances)
                if matches[best_match_index]:
                    speak("識別到人臉,開始詢問暗號,請回答接下來我說的問題")
                    time.sleep(1)
                    speak("天王蓋地虎")
                    error = 1 / 0
                    name = known_face_names[best_match_index]
                face_names.append(name)
        process_this_frame = not process_this_frame
        for (top, right, bottom, left), name in zip(face_locations, face_names):
            top *= 4
            left *= 4
            right *= 4
            bottom *= 4
            font = cv2.FONT_HERSHEY_DUPLEX
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

        cv2.imshow('Video', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
except Exception as e:
    print(e)
finally:
    video_capture.release()
    cv2.destroyAllWindows()

這裡有一點需要註意,由於playsound播放音樂的時候會一直占用這個資源,所以播放下一段音樂的時候會報錯,解決方法是修改~\Python37\Lib\site-packages下的playsound.py文件,找到如下代碼

打造電腦版人臉屏幕解鎖神器

sleep函數下麵添加winCommand('close', alias)這句代碼,保存下就可以了。運行發現可以正常將兩句話都說出來。那麼說出來之後就要去監聽了,我們還要打包一個函數。

def record():
    import wave
    import json
    import pyaudio
    from aip import AipSpeech

    APP_ID = ''
    API_KEY = ''
    SECRET_KEY = ''

    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    CHUNK = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 8000
    RECORD_SECONDS = 3
    WAVE_OUTPUT_FILENAME = "output.wav"

    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)

    print("* recording")
    frames = []
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
    print("* done recording")

    stream.stop_stream()
    stream.close()
    p.terminate()
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))

    def get_file_content():
        with open(WAVE_OUTPUT_FILENAME, 'rb') as fp:
            return fp.read()

    result = client.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, })
    result = json.loads(str(result).replace("'", '"'))
    return result["result"][0]

將識別到人臉後的代碼修改成如下

if matches[best_match_index]:
    speak("識別到人臉,開始詢問暗號,請回答接下來我說的問題")
    time.sleep(1)
    speak("天王蓋地虎")

    flag = False
    for times in range(0, 3):
        content = record()
        if "小雞燉蘑菇" in content:
            speak("暗號通過")
            flag = True
            break
        else:
            speak("暗號不通過,再試一次")
    if flag:
        print("解鎖")
    else:
        print("發送郵件並將壞人人臉圖片上傳!")
    error = 1 / 0
    name = known_face_names[best_match_index]

運行看看效果,回答電腦小雞燉蘑菇,電腦回答暗號通過。這樣功能就基本上完成了。

打造電腦版人臉屏幕解鎖神器

結語

至於發送郵件的功能和鎖屏解鎖的功能我就不一一去實現了,我想這應該難不倒在座的各位吧。鎖屏功能可以HOOK讓鍵盤時間無效化,然後用視窗再覆蓋整個桌面即可,至於郵箱發送網上文章很多的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java--Stream流詳解 博客說明 文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝! 說明 在Java 8中,得益於Lambda所帶來的函數式編程,引入了一個全新的Stream概念,用於解決已有集合類庫既有的弊端 遍歷 傳統集合在於使 ...
  • printf 函數是C語言標準庫函數和 python 內置函數類似,主要用於將格式化後的字元串輸出到終端的屏幕(C語言入門 Hello World)。使用 printf 函數需要包含頭文件stdio.h 值得註意的是:需要註意#include “”與#include <>區別; 一.printf函數 ...
  • 爬取詩詞總量為二十九萬兩千六百零二條數據 一、爬蟲編寫 目標網站:詩詞名句網 環境 window10; python3.7; scrapy框架; mysql資料庫; 資料庫設計 根據要爬取的欄位定義,爬取內容為詩詞鏈接,簡介,標題,作者,朝代,內容,註釋,作者發表的文章數量,圖片url 如圖 1.創 ...
  • 區分:迭代器Iterator和可迭代對象Iterable 1、可迭代對象Iterable:可以直接作用於for迴圈的對象統稱為可迭代對象 1)可以直接作用於for迴圈的數據類型有以下幾種: 一類是集合數據類型,如list、tuple、dict、set、str等; 一類是生成器generator,包括 ...
  • ——有時轉換函數更搭配友元函數、有時多餘的轉換函數會幹擾友元函數的運行 Stonewt operator + (const Stonewt &st1, cosnt Stonewt &st2) { double pds = st1.pounds + st2.pounds; Stonewt sum(pd ...
  • 1、首先引入摩爾定律: 每18個月所享受的電子產品價值會翻倍,這一理論在1972年提出,說是經過了前面50年的實際驗證, 後又更改為每兩年所享受的電子產品價值會翻倍,但是隨著時代的發展,目前的摩爾定律時間越來越長,每兩年實現翻倍,越來越不現實, 以後電腦可能要往量子電腦方向進行發展,那個時候可能 ...
  • super()是調用父類的構造函數,並且在當前的那個構造函數的第一行。當super被調用時,他將會第一時間去調用父類的構造函數。 this()是調用本類的另一個構造函數,構造方法一般有無參和帶參兩種 , 它和super一樣也是只能放在第一行,也就是說super()和this()不能同時出現在一個構造 ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碼里奧編程 加企鵝群695185429即可免費獲取,資料全在群文件里。資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等 效果圖 最終效果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...