再也不怕别人动电脑了!用Python实时监控

前言

为施秉等地区用户提供了全套网页设计制作服务,及施秉网站建设行业解决方案。主营业务为做网站、网站建设、施秉网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

最近突然有个奇妙的想法,就是当我对着电脑屏幕的时候,电脑会先识别屏幕上的人脸是否是本人,如果识别是本人的话需要回答电脑说的暗语,答对了才会解锁并且有三次机会。如果都没答对就会发送邮件给我,通知有人在动我的电脑并上传该人头像。

过程

环境是win10代码我使用的是python3所以在开始之前需要安装一些依赖包,请按顺序安装否者会报错

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

接下来是构建识别人脸以及对比人脸的代码

 
 
 
 
  1. import face_recognition 
  2. import cv2 
  3. import numpy as np 
  4. video_capture = cv2.VideoCapture(0) 
  5. my_image = face_recognition.load_image_file("my.jpg") 
  6. my_face_encoding = face_recognition.face_encodings(my_image)[0] 
  7. known_face_encodings = [ 
  8.     my_face_encoding 
  9. known_face_names = [ 
  10.     "Admin" 
  11. face_names = [] 
  12. face_locations = [] 
  13. face_encodings = [] 
  14. process_this_frame = True 
  15. while True: 
  16.     ret, frame = video_capture.read() 
  17.     small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) 
  18.     rgb_small_frame = small_frame[:, :, ::-1] 
  19.     if process_this_frame: 
  20.         face_locations = face_recognition.face_locations(rgb_small_frame) 
  21.         face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) 
  22.         face_names = [] 
  23.         for face_encoding in face_encodings: 
  24.             matches = face_recognition.compare_faces(known_face_encodings, face_encoding) 
  25.             name = "Unknown" 
  26.             face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) 
  27.             best_match_index = np.argmin(face_distances) 
  28.             if matches[best_match_index]: 
  29.                 name = known_face_names[best_match_index] 
  30.             face_names.append(name) 
  31.     process_this_frame = not process_this_frame 
  32.     for (top, right, bottom, left), name in zip(face_locations, face_names): 
  33.         top *= 4 
  34.         left *= 4 
  35.         right *= 4 
  36.         bottom *= 4 
  37.         font = cv2.FONT_HERSHEY_DUPLEX 
  38.         cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) 
  39.         cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) 
  40.         cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1) 
  41.     cv2.imshow('Video', frame) 
  42.     if cv2.waitKey(1) & 0xFF == ord('q'): 
  43.         break 
  44. video_capture.release() 
  45. cv2.destroyAllWindows()

其中my.jpg需要你自己拍摄上传,运行可以发现在你脸上会出现Admin的框框,我去网上找了张图片类似这样子

识别功能已经完成了接下来就是语音识别和语音合成,这需要使用到百度AI来实现了,去登录百度AI的官网到控制台选择左边的语音技术,然后点击面板的创建应用按钮,来到创建应用界面

打造电脑版人脸屏幕解锁神器

创建后会得到AppID、API Key、Secret Key记下来,然后开始写语音合成的代码。安装百度AI提供的依赖包

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

然后是简单的语音播放代码,运行下面代码可以听到萌妹子的声音

 
 
 
 
  1. import sys 
  2. from aip import AipSpeech 
  3. from playsound import playsound
  4. APP_ID = '' 
  5. API_KEY = '' 
  6. SECRET_KEY = '' 
  7. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) 
  8. result = client.synthesis('你好吖', 'zh', 1, {'vol': 5, 'per': 4, 'spd': 5, }) 
  9. if not isinstance(result, dict): 
  10.     with open('auido.mp3', 'wb') as file: 
  11.         file.write(result) 
  12. filepath = eval(repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3' 
  13. playsound(filepath)

有了上面的代码就完成了检测是否在电脑前(人脸识别)以及电脑念出暗语(语音合成)然后我们还需要回答暗号给电脑,所以还需要完成语音识别。

 
 
 
 
  1. import wave 
  2. import pyaudio 
  3. from aip import AipSpeech 
  4. APP_ID = '' 
  5. API_KEY = '' 
  6. SECRET_KEY = '' 
  7. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) 
  8. CHUNK = 1024 
  9. FORMAT = pyaudio.paInt16 
  10. CHANNELS = 1 
  11. RATE = 8000 
  12. RECORD_SECONDS = 3 
  13. WAVE_OUTPUT_FILENAME = "output.wav" 
  14. p = pyaudio.PyAudio() 
  15. stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) 
  16. print("* recording") 
  17. frames = [] 
  18. for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): 
  19.     data = stream.read(CHUNK) 
  20.     frames.append(data) 
  21. print("* done recording") 
  22. stream.stop_stream() 
  23. stream.close() 
  24. p.terminate() 
  25. wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
  26. wf.setnchannels(CHANNELS) 
  27. wf.setsampwidth(p.get_sample_size(FORMAT)) 
  28. wf.setframerate(RATE) 
  29. wf.writeframes(b''.join(frames)) 
  30. def get_file_content(): 
  31.     with open(WAVE_OUTPUT_FILENAME, 'rb') as fp: 
  32.         return fp.read() 
  33. result = client.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, }) 
  34. print(result)

运行此代码之前需要安装pyaudio依赖包,由于在win10系统上安装会报错所以可以通过如下方式安装。到这个链接 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 去下载对应的安装包然后安装即可。

打造电脑版人脸屏幕解锁神器

运行后我说了你好,可以看到识别出来了。那么我们的小模块功能就都做好了接下来就是如何去整合它们。可以发现在人脸识别代码中if matches[best_match_index]这句判断代码就是判断是否为电脑主人,所以我们把这个判断语句当作main函数的入口。

 
 
 
 
  1. if matches[best_match_index]: 
  2.     # 在这里写识别到之后的功能 
  3.     name = known_face_names[best_match_index]

那么识别到后我们应该让电脑发出询问暗号,也就是语音合成代码,然我们将它封装成一个函数,顺便重构下人脸识别的代码。

 
 
 
 
  1. import cv2 
  2. import time 
  3. import numpy as np 
  4. import face_recognition 
  5. video_capture = cv2.VideoCapture(0) 
  6. my_image = face_recognition.load_image_file("my.jpg") 
  7. my_face_encoding = face_recognition.face_encodings(my_image)[0] 
  8. known_face_encodings = [ 
  9.     my_face_encoding 
  10. known_face_names = [ 
  11.     "Admin" 
  12. face_names = [] 
  13. face_locations = [] 
  14. face_encodings = [] 
  15. process_this_frame = True 
  16. def speak(content): 
  17.     import sys 
  18.     from aip import AipSpeech 
  19.     from playsound import playsound 
  20.     APP_ID = '' 
  21.     API_KEY = '' 
  22.     SECRET_KEY = '' 
  23.     client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) 
  24.     result = client.synthesis(content, 'zh', 1, {'vol': 5, 'per': 0, 'spd': 5, }) 
  25.     if not isinstance(result, dict): 
  26.         with open('auido.mp3', 'wb') as file: 
  27.             file.write(result) 
  28.     filepath = eval(repr(sys.path[0]).replace('\\', '/')) + '//auido.mp3' 
  29.     playsound(filepath) 
  30. try: 
  31.     while True: 
  32.         ret, frame = video_capture.read() 
  33.         small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) 
  34.         rgb_small_frame = small_frame[:, :, ::-1] 
  35.         if process_this_frame: 
  36.             face_locations = face_recognition.face_locations(rgb_small_frame) 
  37.             face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) 
  38.             face_names = [] 
  39.             for face_encoding in face_encodings: 
  40.                 matches = face_recognition.compare_faces(known_face_encodings, face_encoding) 
  41.                 name = "Unknown" 
  42.                 face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) 
  43.                 best_match_index = np.argmin(face_distances) 
  44.                 if matches[best_match_index]: 
  45.                     speak("识别到人脸,开始询问暗号,请回答接下来我说的问题") 
  46.                     time.sleep(1) 
  47.                     speak("天王盖地虎") 
  48.                     error = 1 / 0 
  49.                     name = known_face_names[best_match_index] 
  50.                 face_names.append(name) 
  51.         process_this_frame = not process_this_frame 
  52.         for (top, right, bottom, left), name in zip(face_locations, face_names): 
  53.             top *= 4 
  54.             left *= 4 
  55.             right *= 4 
  56.             bottom *= 4
  57.             font = cv2.FONT_HERSHEY_DUPLEX 
  58.             cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) 
  59.             cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) 
  60.             cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1) 
  61.         cv2.imshow('Video', frame) 
  62.         if cv2.waitKey(1) & 0xFF == ord('q'): 
  63.             break 
  64. except Exception as e: 
  65.     print(e) 
  66. finally: 
  67.     video_capture.release() 
  68.     cv2.destroyAllWindows()

这里有一点需要注意,由于playsound播放音乐的时候会一直占用这个资源,所以播放下一段音乐的时候会报错,解决方法是修改~\Python37\Lib\site-packages下的playsound.py文件,找到如下代码

打造电脑版人脸屏幕解锁神器

在sleep函数下面添加winCommand('close', alias)这句代码,保存下就可以了。运行发现可以正常将两句话都说出来。那么说出来之后就要去监听了,我们还要打包一个函数。

 
 
 
 
  1. def record(): 
  2.     import wave 
  3.     import json 
  4.     import pyaudio 
  5.     from aip import AipSpeech 
  6.     APP_ID = '' 
  7.     API_KEY = '' 
  8.     SECRET_KEY = '' 
  9.     client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) 
  10.     CHUNK = 1024 
  11.     FORMAT = pyaudio.paInt16 
  12.     CHANNELS = 1 
  13.     RATE = 8000 
  14.     RECORD_SECONDS = 3 
  15.     WAVE_OUTPUT_FILENAME = "output.wav" 
  16.     p = pyaudio.PyAudio() 
  17.     stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) 
  18.     print("* recording") 
  19.     frames = [] 
  20.     for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): 
  21.         data = stream.read(CHUNK) 
  22.         frames.append(data) 
  23.     print("* done recording") 
  24.     stream.stop_stream() 
  25.     stream.close() 
  26.     p.terminate() 
  27.     wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
  28.     wf.setnchannels(CHANNELS) 
  29.     wf.setsampwidth(p.get_sample_size(FORMAT)) 
  30.     wf.setframerate(RATE) 
  31.     wf.writeframes(b''.join(frames)) 
  32.     def get_file_content(): 
  33.         with open(WAVE_OUTPUT_FILENAME, 'rb') as fp: 
  34.             return fp.read() 
  35.     result = client.asr(get_file_content(), 'wav', 8000, {'dev_pid': 1537, }) 
  36.     result = json.loads(str(result).replace("'", '"')) 
  37.     return result["result"][0]

将识别到人脸后的代码修改成如下

 
 
 
 
  1. if matches[best_match_index]: 
  2.     speak("识别到人脸,开始询问暗号,请回答接下来我说的问题") 
  3.     time.sleep(1) 
  4.     speak("天王盖地虎") 
  5.     flag = False
  6.      for times in range(0, 3): 
  7.         content = record() 
  8.         if "小鸡炖蘑菇" in content: 
  9.             speak("暗号通过") 
  10.             flag = True 
  11.             break 
  12.         else: 
  13.             speak("暗号不通过,再试一次") 
  14.     if flag: 
  15.         print("解锁") 
  16.     else: 
  17.         print("发送邮件并将坏人人脸图片上传!") 
  18.     error = 1 / 0 
  19.     name = known_face_names[best_match_index]

运行看看效果,回答电脑小鸡炖蘑菇,电脑回答暗号通过。这样功能就基本上完成了。

打造电脑版人脸屏幕解锁神器

结语

至于发送邮件的功能和锁屏解锁的功能我就不一一去实现了,我想这应该难不倒在座的各位吧。锁屏功能可以HOOK让键盘时间无效化,然后用窗口再覆盖整个桌面即可,至于邮箱发送网上文章很多的。

当前名称:再也不怕别人动电脑了!用Python实时监控
转载源于:http://www.mswzjz.cn/qtweb/news18/64318.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能