Live visualisation of various facial recognition algorithms.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.2 KiB

from multiprocessing import Process, Queue
from queue import Empty
import cv2
import logging
import argparse
import numpy as np
def record(device_id, q1,q2, q3):
capture = cv2.VideoCapture(device_id)
while True:
ret, image = capture.read()
logging.debug('r')
q1.put(image)
q2.put(image)
q3.put(image)
def process1(in_q, out_q):
while True:
image = in_q.get()
logging.debug('r')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cgray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
out_q.put(cgray)
def process2(in_q, out_q):
while True:
image = in_q.get()
logging.debug('r')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cgray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
out_q.put(cgray)
def display(image_res, q1, q2, q3):
prev_image1 = np.zeros((image_res[1],image_res[0],3), np.uint8)
prev_image2 = np.zeros((image_res[1],image_res[0],3), np.uint8)
prev_image3 = np.zeros((image_res[1],image_res[0],3), np.uint8)
prev_image4 = np.zeros((image_res[1],image_res[0],3), np.uint8)
while True:
logging.debug('r')
try:
image1 = q1.get_nowait()
image1 = cv2.resize(image1, (image_res[0], image_res[1]))
prev_image1 = image1
except Empty as e:
image1 = prev_image1
try:
image2 = q2.get_nowait()
image2 = cv2.resize(image2, (image_res[0], image_res[1]))
prev_image2 = image2
except Empty as e:
image2 = prev_image2
try:
image3 = q3.get_nowait()
image3 = cv2.resize(image3, (image_res[0], image_res[1]))
prev_image3 = image3
except Empty as e:
image3 = prev_image3
image4 = prev_image4
img_concate_Verti1 = np.concatenate((image1,image2),axis=0)
img_concate_Verti2 = np.concatenate((image3,image4),axis=0)
grid_img = np.concatenate((img_concate_Verti1,img_concate_Verti2),axis=1)
cv2.imshow("Output", grid_img)
# Hit 'q' on the keyboard to quit!
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Visualise face recognition algorithms.')
parser.add_argument('--camera', '-c', type=int, default=0,
help='Numeric id of the camera')
args = parser.parse_args()
image_size = (int(1920/2), int(1080/2))
# TODO should we use queues here at all?
# https://docs.python.org/3/library/multiprocessing.html#programming-guidelines
# TODO: queue maxsize, or prefrabily some sort of throttled queue (like zmq hight water mark)
q_webcam1 = Queue()
q_webcam2 = Queue()
q_webcam3 = Queue()
q_process1 = Queue()
q_process2 = Queue()
p1 = Process(target=record, args=(args.camera, q_webcam1, q_webcam2,q_webcam3))
p2 = Process(target=display, args=(image_size, q_webcam1, q_process1, q_process2 ))
p3 = Process(target=process1, args=(q_webcam2, q_process1,))
p4 = Process(target=process2, args=(q_webcam3, q_process2,))
p1.start()
p2.start()
p3.start()
p4.start()
p2.join()