97 lines
No EOL
3.2 KiB
Python
97 lines
No EOL
3.2 KiB
Python
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() |