From 0dc337197311d0fec373bf479f8ee0ac26b4cad6 Mon Sep 17 00:00:00 2001
From: wu_xinjun <bent20140204@outlook.com>
Date: 星期三, 15 六月 2022 16:33:47 +0800
Subject: [PATCH] client enhanced&camera contorller
---
src/engine/devices.py | 170 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 135 insertions(+), 35 deletions(-)
diff --git a/src/engine/devices.py b/src/engine/devices.py
index aacc2ac..29f4340 100644
--- a/src/engine/devices.py
+++ b/src/engine/devices.py
@@ -4,6 +4,9 @@
import threading
import numpy as np
import os, sys
+from typing import List
+import queue
+from datetime import datetime
# # add python path of src to sys.path
# src_path = os.path.join(__file__, *(['..'] * 2))
@@ -14,65 +17,162 @@
class cameraController(object):
- def __init__(self,IMAGE_WIDTH,IMAGE_HEIGHT,CAMERA_COUNT,device_id,queue_dict):
+ def __init__(self,
+ IMAGE_WIDTH:int,
+ IMAGE_HEIGHT:int,
+ CAMERA_COUNT:int,
+ device_id:str,
+ logs_queue:queue.Queue,
+ images_queue:queue.Queue,
+ init_routing_key:str,
+ init_binding_key:str
+ ):
+
self.IMAGE_WIDTH = IMAGE_WIDTH
self.IMAGE_HEIGHT = IMAGE_HEIGHT
self.CAMERA_COUNT = CAMERA_COUNT
self.device_id = device_id
- self.queue_dict = queue_dict
- self.device_state_queue = self.queue_dict["device_state"]
- self.image_data_queue = self.queue_dict["image_data"]
- self._capture_thread = None
+ self.logs_queue = logs_queue
+ self.images_queue = images_queue
+ self.routing_key = init_routing_key
+ self.init_routing_key = init_routing_key
+ self.binding_key = init_binding_key
+ self._check_cameras()
- def open_cameras(self):
- """
- Test the ports and returns a tuple with the available ports and the ones that are working.
- """
+
+ def _check_cameras(self):
self.cameras = []
+ self.camera_work = []
self.working_ports = []
+ test_logs = []
+ test_images = []
+
+ # init the cameras
for dev_port in range(self.CAMERA_COUNT):
+ # set the props of the camera by cv2 lib
camera = cv2.VideoCapture(dev_port, cv2.CAP_DSHOW)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, self.IMAGE_WIDTH)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, self.IMAGE_HEIGHT)
camera.set(cv2.CAP_PROP_FPS, 1)
- if camera.isOpened():
- is_reading, img = camera.read()
- w = camera.get(3)
- h = camera.get(4)
+ self.cameras.append(camera)
+ self.camera_work.append(False)
+
+ # test the cameras
+ (test_logs, test_images) = self._capture_image(mode = "test")
+
+ # generate the msg and put it to queues
+ self._generate_msg(test_logs,test_images)
+
+
+ def _generate_msg(self,logs:List[str],images:List):
+
+ # constract a images message
+ imagesMsg = pb.ImagesMessage()
+ imagesMsg.source = self.device_id
+ curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+ imagesMsg.timestamp = curr_time
+ log_rk = self.routing_key+".logs.test0"
+ image_rk = self.routing_key+".images.test0"
+
+ for log, img in zip(logs,images):
+
+ # encoding the images to the bytes
+ # encode_params = [int(cv2.IMWRITE_JPEG_QUALITY), self.image_quality]
+ # image_encoded = cv2.imencode(".jpg",single_img,encode_params)
+ if img is not None:
+ success,image_encoded = cv2.imencode(".jpg",img)
+ if success:
+ image_bytes = image_encoded.tobytes()
+ image_length = len(image_bytes)
+ # add the encoded image to msg
+ image_item = imagesMsg.Image.add()
+ image_item.length = image_length
+ image_item.data = image_bytes
+
+ if log is not None:
+ # constract a logs message
+ logsMsg = pb.LogsMessage()
+ logsMsg.source = self.device_id
+ logsMsg.timestamp = f"{time.asctime()}"
+ logsMsg.context = log
+ # convert the proto object to string
+ logsMsg_bytes = logsMsg.SerializeToString()
+ # add logsmsg to queue
+ self.logs_queue.put([log_rk,logsMsg_bytes])
+
+
+ # converting the pb image msg to bytes
+ imageMsg_bytes = imagesMsg.SerializeToString()
+ # add the imageMsg to the queue
+ self.images_queue.put([image_rk,imageMsg_bytes])
+
+
+ def _capture_image(self,mode:str = "capture"):
+ """
+ mode -> "test" or "capture"
+ """
+ TEST = False
+ if mode == "test":
+ TEST = True
+ else:
+ pass
+
+ log_list = []
+ image_list = []
+
+ # iterate the cameras
+ for dev_port, camera in enumerate(self.cameras):
+ # init the flags
+ is_reading = False
+ log = None
+ img = None
+
+ if not TEST and self.camera_work[dev_port] is not True:
+ pass
+ else:
+ # capture the image
+ if camera.isOpened():
+ is_reading, img = camera.read()
+ w = camera.get(3)
+ h = camera.get(4)
+ if is_reading:
+ log = f"camera port {dev_port} is working and reads images ({h} x {w})"
+ else:
+ log = f"camera port {dev_port} can not work"
+ else:
+ log = f"camera port {dev_port} can not found"
+
+ # display
+ print(f"{time.asctime()} | {log}")
+
+ # add some tags for camera when test
+ if TEST:
+ self.working_ports.append(dev_port)
if is_reading:
- self.working_ports.append(dev_port)
- self.cameras.append(camera)
- msg = f"{time.asctime()} {self.device_id} camera port {dev_port} is working and reads images ({h} x {w})"
+ self.camera_work[dev_port] == True
+
- else:
- msg = f"{time.asctime()} {self.device_id} camera port {dev_port} can not work"
- else:
- msg = f"{time.asctime()} {self.device_id} camera port {dev_port} can not found"
+ log_list.append(log)
+ image_list.append(img)
- # add msg to queue
- self.device_state_queue.put(msg)
- print(msg)
+ return log_list, image_list
- def _start_captureThread(self):
- """start capture thread"""
- if self._capture_thread is None:
- self._capture_thread = \
- CaptureThread(self.cameras,self.image_data_queue,self.device_id,interval=10)
- self._capture_thread.setDaemon(True)
- self._capture_thread.start()
+ def capture(self,routing_key:str):
- def _stop_captureThread(self):
- """stop capture thread"""
- if self._capture_thread is not None:
- self._capture_thread.stop()
- self._capture_thread = None
+ self.routing_key = routing_key
+
+ (logs,images) = self._capture_image()
+ self._generate_msg = (logs,images)
+
+ self.routing_key = self.init_routing_key
class microwaveController(object):
pass
class dustCleanerController(object):
+
pass
--
Gitblit v1.9.1