mirror of
https://github.com/boltgolt/howdy.git
synced 2024-09-19 09:51:19 +02:00
Added begining of rubberstamps
This commit is contained in:
parent
89c694a5d7
commit
671b33884f
4 changed files with 111 additions and 7 deletions
|
@ -282,6 +282,14 @@ while True:
|
||||||
if capture_successful:
|
if capture_successful:
|
||||||
make_snapshot("SUCCESSFUL")
|
make_snapshot("SUCCESSFUL")
|
||||||
|
|
||||||
|
import rubberstamps
|
||||||
|
rubberstamps.execute(config, {
|
||||||
|
"video_capture": video_capture,
|
||||||
|
"face_detector": face_detector,
|
||||||
|
"pose_predictor": pose_predictor,
|
||||||
|
"clahe": clahe
|
||||||
|
})
|
||||||
|
|
||||||
# End peacefully
|
# End peacefully
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
11
src/pam.py
11
src/pam.py
|
@ -73,20 +73,17 @@ def doAuth(pamh):
|
||||||
|
|
||||||
# Status 13 means the image was too dark
|
# Status 13 means the image was too dark
|
||||||
elif status == 13:
|
elif status == 13:
|
||||||
|
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Face detection image too dark"))
|
||||||
syslog.syslog(syslog.LOG_INFO, "Failure, image too dark")
|
syslog.syslog(syslog.LOG_INFO, "Failure, image too dark")
|
||||||
syslog.closelog()
|
syslog.closelog()
|
||||||
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Face detection image too dark"))
|
|
||||||
return pamh.PAM_AUTH_ERR
|
return pamh.PAM_AUTH_ERR
|
||||||
|
|
||||||
# Status 1 is probably a python crash
|
# Status 1 is probably a python crash
|
||||||
elif status == 1:
|
elif status == 1:
|
||||||
# Show the success message if it isn't suppressed
|
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Howdy encountered error, check stderr"))
|
||||||
if not config.getboolean("core", "no_confirmation"):
|
syslog.syslog(syslog.LOG_INFO, "Failure, process crashed while authenticating")
|
||||||
pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Identified face as " + pamh.get_user()))
|
|
||||||
|
|
||||||
syslog.syslog(syslog.LOG_INFO, "Login approved")
|
|
||||||
syslog.closelog()
|
syslog.closelog()
|
||||||
return pamh.PAM_SUCCESS
|
return pamh.PAM_SYSTEM_ERR
|
||||||
|
|
||||||
# Status 0 is a successful exit
|
# Status 0 is a successful exit
|
||||||
elif status == 0:
|
elif status == 0:
|
||||||
|
|
35
src/rubberstamps/__init__.py
Normal file
35
src/rubberstamps/__init__.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
from importlib.machinery import SourceFileLoader
|
||||||
|
|
||||||
|
|
||||||
|
class RubberStamp:
|
||||||
|
def create_shorthands(self):
|
||||||
|
self.video_capture = self.opencv["video_capture"]
|
||||||
|
self.face_detector = self.opencv["face_detector"]
|
||||||
|
self.pose_predictor = self.opencv["pose_predictor"]
|
||||||
|
self.clahe = self.opencv["clahe"]
|
||||||
|
|
||||||
|
|
||||||
|
def execute(config, opencv):
|
||||||
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
for filename in os.listdir(dir_path):
|
||||||
|
if not os.path.isfile(dir_path + "/" + filename):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if filename in ["__init__.py", ".gitignore"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
class_name = filename.split(".")[0]
|
||||||
|
module = SourceFileLoader(class_name, dir_path + "/" + filename).load_module()
|
||||||
|
constructor = getattr(module, class_name)
|
||||||
|
|
||||||
|
instance = constructor()
|
||||||
|
instance.config = config
|
||||||
|
instance.opencv = opencv
|
||||||
|
|
||||||
|
instance.create_shorthands()
|
||||||
|
result = instance.run()
|
||||||
|
|
||||||
|
print(result)
|
64
src/rubberstamps/nod.py
Normal file
64
src/rubberstamps/nod.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import cv2
|
||||||
|
import time
|
||||||
|
|
||||||
|
from rubberstamps import RubberStamp
|
||||||
|
|
||||||
|
min_distance = 10
|
||||||
|
min_directions = 3
|
||||||
|
failsafe = True
|
||||||
|
timeout = 5
|
||||||
|
|
||||||
|
|
||||||
|
class nod(RubberStamp):
|
||||||
|
def run(self):
|
||||||
|
last_reldist = -1
|
||||||
|
last_nosepoint = {"x": -1, "y": -1}
|
||||||
|
recorded_nods = {"x": [], "y": []}
|
||||||
|
|
||||||
|
starttime = time.time()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
if time.time() > starttime + timeout:
|
||||||
|
return not failsafe
|
||||||
|
|
||||||
|
ret, frame = self.video_capture.read_frame()
|
||||||
|
|
||||||
|
frame = self.clahe.apply(frame)
|
||||||
|
|
||||||
|
face_locations = self.face_detector(frame, 1)
|
||||||
|
|
||||||
|
if len(face_locations) != 1:
|
||||||
|
continue
|
||||||
|
|
||||||
|
face_landmarks = self.pose_predictor(frame, face_locations[0])
|
||||||
|
|
||||||
|
reldist = face_landmarks.part(0).x - face_landmarks.part(2).x
|
||||||
|
avg_reldist = (last_reldist + reldist) / 2
|
||||||
|
|
||||||
|
for axis in ["x", "y"]:
|
||||||
|
nosepoint = getattr(face_landmarks.part(4), axis)
|
||||||
|
|
||||||
|
if last_nosepoint[axis] == -1:
|
||||||
|
last_nosepoint[axis] = nosepoint
|
||||||
|
last_reldist = reldist
|
||||||
|
|
||||||
|
movement = (nosepoint - last_nosepoint[axis]) * 100 / avg_reldist
|
||||||
|
|
||||||
|
if movement < -min_distance or movement > min_distance:
|
||||||
|
if len(recorded_nods[axis]) == 0:
|
||||||
|
recorded_nods[axis].append(movement < 0)
|
||||||
|
|
||||||
|
elif recorded_nods[axis][-1] != (movement < 0):
|
||||||
|
recorded_nods[axis].append(movement < 0)
|
||||||
|
|
||||||
|
if len(recorded_nods[axis]) >= min_directions:
|
||||||
|
return axis == "y"
|
||||||
|
|
||||||
|
last_reldist = reldist
|
||||||
|
last_nosepoint[axis] = nosepoint
|
||||||
|
|
||||||
|
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
|
||||||
|
|
||||||
|
cv2.imshow("Howdy Test", frame)
|
||||||
|
if cv2.waitKey(1) != -1:
|
||||||
|
raise KeyboardInterrupt()
|
Loading…
Reference in a new issue