172 lines
6.5 KiB
Python
172 lines
6.5 KiB
Python
from flask_restful import Resource, reqparse
|
|
import flask
|
|
import requests
|
|
import application.config as config
|
|
import json
|
|
import cv2
|
|
import base64
|
|
from application.db import Session, Person, Fingerprint
|
|
import application.face_rec as fr
|
|
lastImage = ""
|
|
|
|
class PersonList(Resource):
|
|
def post(self, id = None):
|
|
""" """
|
|
try:
|
|
jsonData = flask.request.get_json(force=True)
|
|
personJSON = jsonData["person"]
|
|
print(personJSON)
|
|
session = Session()
|
|
|
|
# get Fingerprints with Middleware
|
|
fingerprintsObj = []
|
|
if "fingerprints" in personJSON:
|
|
for fingerprint in personJSON["fingerprints"]:
|
|
fingerprint["fingerprint"] = fingerprint["fingerprint"].encode('utf-8')
|
|
fp = Fingerprint(**fingerprint) # ** Operator converts DICT/JSON to initializable
|
|
fingerprintsObj.append(fp)
|
|
session.add(fp)
|
|
|
|
personJSON["fingerprints"] = fingerprintsObj
|
|
personJSON["face"] = lastImage
|
|
person = Person(**personJSON)
|
|
session.add(person)
|
|
session.commit()
|
|
|
|
data = list(session.query(Person).filter_by(person_id=person.person_id))
|
|
arr = []
|
|
for x in data:
|
|
arr.append(x.serialize())
|
|
session.close()
|
|
fr.initFaceRec()
|
|
return flask.make_response(flask.jsonify({'data': arr}), 201)
|
|
|
|
except Exception as e:
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
|
|
|
|
def get(self, id = None):
|
|
""" """
|
|
session = Session()
|
|
try:
|
|
parser = reqparse.RequestParser()
|
|
parser.add_argument('useFace', type=bool, required=False)
|
|
args = parser.parse_args()
|
|
|
|
# this indicates that the captured face should be use for identification / validation
|
|
if "useFace" in args and args["useFace"]:
|
|
Camera().post()
|
|
if id is not None:
|
|
# validate
|
|
data = list(session.query(Person).filter_by(person_id=id))[0].serialize()
|
|
results = fr.identifyFace(lastImage)
|
|
data["matching_score"] = 1 - results[int(id)]
|
|
# return identified person object + matching score
|
|
return flask.make_response(flask.jsonify({'data': data}), 200)
|
|
else:
|
|
# replace by Biometric function
|
|
# identify
|
|
# return identified person object + matching score
|
|
results = fr.identifyFace(lastImage)
|
|
data = []
|
|
for x in list(session.query(Person).all()):
|
|
ser = x.serialize()
|
|
ser["matching_score"] = 1 - results[x.person_id]
|
|
data.append(ser)
|
|
|
|
return flask.make_response(flask.jsonify({'data': data}), 200)
|
|
|
|
if id is None:
|
|
data = list(session.query(Person).all())
|
|
else:
|
|
data = list(session.query(Person).filter_by(person_id=id))
|
|
arr = []
|
|
for x in data:
|
|
arr.append(x.serialize())
|
|
session.close()
|
|
|
|
return flask.make_response(flask.jsonify({'data': arr}), 200)
|
|
except Exception as e:
|
|
session.close()
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
|
|
|
|
def put(self, id = None):
|
|
""" """
|
|
try:
|
|
data = ""
|
|
return flask.make_response(flask.jsonify({'data': data}), 200)
|
|
except Exception as e:
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
|
|
|
|
def delete(self, id = None):
|
|
""" """
|
|
try:
|
|
if id is None:
|
|
return flask.make_response(flask.jsonify({'error': "No ID given"}), 404)
|
|
|
|
session = Session()
|
|
data = session.query(Person).filter_by(person_id=id).delete()
|
|
session.commit()
|
|
session.close()
|
|
fr.initFaceRec()
|
|
return flask.make_response(flask.jsonify({'data': data}), 204)
|
|
|
|
except Exception as e:
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 404)
|
|
|
|
class Camera(Resource):
|
|
# provides the function used for the live streams
|
|
class VideoCamera(object):
|
|
"""Video stream object"""
|
|
url = config.videoSource
|
|
def __init__(self):
|
|
self.video = cv2.VideoCapture(self.url)
|
|
|
|
def __del__(self):
|
|
self.video.release()
|
|
|
|
def get_frame(self, ending):
|
|
success, image = self.video.read()
|
|
ret, jpeg = cv2.imencode(ending, image)
|
|
return jpeg
|
|
|
|
def gen(self, camera):
|
|
"""Video streaming generator function."""
|
|
while True:
|
|
frame = camera.get_frame('.jpg').tobytes()
|
|
yield (b'--frame\r\n'
|
|
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
|
|
|
def genProcessed(self, url=None):
|
|
"""Video streaming generator function."""
|
|
url = config.videoSource
|
|
while True:
|
|
frame = fr.identifyFaceVideo(url).tobytes()
|
|
yield (b'--frame\r\n'
|
|
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
|
|
|
def get(self, type = "stream"):
|
|
global lastImage
|
|
try:
|
|
if type == "stream":
|
|
return flask.Response(self.gen(self.VideoCamera()), mimetype='multipart/x-mixed-replace; boundary=frame')
|
|
elif type == "processed":
|
|
return flask.Response(self.genProcessed(self.VideoCamera()), mimetype='multipart/x-mixed-replace; boundary=frame')
|
|
elif type == "still":
|
|
return flask.Response(base64.b64decode(lastImage), mimetype='image/png')
|
|
|
|
return flask.make_response(flask.jsonify({'error': "No idea how you got here"}), 404)
|
|
except Exception as e:
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 404)
|
|
|
|
def post(self):
|
|
global lastImage
|
|
try:
|
|
lastImage = base64.b64encode(self.VideoCamera().get_frame('.png'))
|
|
except Exception as e:
|
|
print("error: -", e)
|
|
return flask.make_response(flask.jsonify({'error': str(e)}), 404) |