GOOGLE ADS

среда, 13 апреля 2022 г.

Распознавание лиц Python OpenCV для блокировки ПК

Я подготовил некоторый код для его блокировки, когда я встаю от компьютера и ухожу от него, но когда я использую его со случайным алгоритмом, он немедленно отключается, потому что он не обнаруживает мое лицо в некоторых движениях. Для этого я хочу, чтобы он подождал 3 секунды, когда он не обнаружит мое лицо, проверьте его снова, и если он все еще не обнаружит мое лицо, я хочу, чтобы он заблокировался, но когда я использую метод time.sleep, видео с веб-камеры зависает и работает, поскольку лица не существует, даже моего лица в камере, какой рабочий алгоритм вы предлагаете для этого?

from multiprocessing.connection import wait
import cv2
import time
import pyautogui
import ctypes
from math import sin, cos, radians
camera = cv2.VideoCapture(0)
face = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
settings = {
'scaleFactor': 1.3,
'minNeighbors': 3,
'minSize': (50, 50),
'flags': cv2.CASCADE_FIND_BIGGEST_OBJECT|cv2.CASCADE_DO_ROUGH_SEARCH
}
def rotate_image(image, angle):
if angle == 0: return image
height, width = image.shape[:2]
rot_mat = cv2.getRotationMatrix2D((width/2, height/2), angle, 0.9)
result = cv2.warpAffine(image, rot_mat, (width, height), flags=cv2.INTER_LINEAR)
return result
def rotate_point(pos, img, angle):
if angle == 0: return pos
x = pos[0] - img.shape[1]*0.4
y = pos[1] - img.shape[0]*0.4
newx = x*cos(radians(angle)) + y*sin(radians(angle)) + img.shape[1]*0.4
newy = -x*sin(radians(angle)) + y*cos(radians(angle)) + img.shape[0]*0.4
return int(newx), int(newy), pos[2], pos[3]
while True:
ret, img = camera.read()
for angle in [0, -25, 25]:
rimg = rotate_image(img, angle)
detected = face.detectMultiScale(rimg, **settings)
if len(detected):
detected = [rotate_point(detected[-1], img, -angle)]
break
for x, y, w, h in detected[-1:]:
cv2.rectangle(img, (x, y), (x+w, y+h), (255,0,0), 2)
cv2.imshow('facedetect', img)
if cv2.waitKey(5)!= -1:
break
if 0==(len(detected)):
time.sleep(3)
if 1==(len(detected)):
pass
else:
ctypes.windll.user32.LockWorkStation()
cv2.destroyWindow("facedetect")```


Решение проблемы

установите переменную с последней отметкой времени, где вы бы не обнаружили лицо. В каждом цикле, если вы снова обнаружите свое лицо, установите для этой переменной значение «Нет», если эта переменная не «Нет» и переменная + 3 секунды <= текущая метка времени, заблокируйте свою станцию.

import time
unseen_from = None
while True:
# etc etc
detected = bool(detected) # empty list == False, True otherwise
if unseen_from is None:
detected = None if detected else time.time()
elif detected:
unseen_from = None
else if detected_from + 3 < time.time():
ctypes.windll.user32.LockWorkStation()

живое кодирование, у меня нет окна, чтобы проверить это, но идея есть

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...