Я работаю над проектом безопасности для многопоточного захвата с OpenCV4 (python3) и несколькими камерами. Каждая камера (кадры) обрабатывается индивидуально для обнаружения объектов и, наконец, потоковой передачи их в сеть. Поскольку у python нет «case», и я делаю это таким образом, это правильный способ или как оптимизированный способ сделать это?
<code>
# this is the start function
def start_cams():
...
# get list of active cams
cam_active = get_camera() # i.e. 4 cameras
for i in range(len(cam_active)):
t = threading.Thread(target=process_cam, name=cam_active[i],
args=(cam_active[i],))
t.daemon = True
t.start()
# this is the capture and process function
def process_cam(cam_id):
global lock, vs_cam_1, vs_cam_2, vs_cam_3, vs_cam_4
global out_1, out_2, out_3, out_4
...
if cam_id == "cam_4":
vs_cam_4 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_3":
vs_cam_3 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_2":
vs_cam_2 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
elif cam_id == "cam_1":
vs_cam_1 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
...
# object detection code here
...
with lock:
if cam_id == "cam_4":
out_4 = frame.copy()
elif cam_id == "cam_3":
out_3 = frame.copy()
elif cam_id == "cam_2":
out_2 = frame.copy()
elif cam_id == "cam_1":
out_1 = frame.copy()
# this is the output stream function
def generate_stream(cam_id):
global lock, out_1, out_2, out_3, out_4
while True:
with lock:
if cam_id == "cam_1":
...
# encode the frame in JPEG format
(flag, encodedFrame) = cv2.imencode(".jpg", out_1)
...
yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + \
bytearray(encodedFrame) + b'\r\n')
</code>