import cv2 # NOQA: E402 import numpy as np import threading import time # # add python path of src to sys.path # src_path = os.path.join(__file__, *(['..'] * 2)) # src_path = os.path.abspath(src_path) # sys.path.insert(0, src_path) from ..protos import aerial_pb2 as pb class CaptureThread(threading.Thread): """ camera capture thread """ def __init__(self, cameras, msg_queue, interval, image_quality = 95): """init the thread""" threading.Thread.__init__(self) self.cameras = cameras self.msg_queue = msg_queue self.interval = interval self.image_quality = image_quality self.is_stop = False def stop(self): """stop the thread""" self.is_stop = True def run(self): print("CaptureThread started") self.next_time = time.time() + self.interval while not self.is_stop: this_time = time.time() if this_time > self.next_time: data1 = pb.ImagesMessage() for i in range(len(self.cameras)): _, frame = self.cameras[i].read() encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), self.image_quality] _, encimg = cv2.imencode('.jpg', frame, encode_param) if frame is not None: np_array = np.asarray(encimg) # frame 转换为numpy数组 byte_array = np_array.tobytes() # numpy数组转换为byte数组 if i == 0: data1.image1 = byte_array elif i == 1: data1.image2 = byte_array elif i == 2: data1.image3 = byte_array elif i == 3: data1.image4 = byte_array data1_str = data1.SerializeToString() # create protobuf message req = pb.RequestCommand() req.sys_command = pb.SysCommand.FIVE_G_COMMAND req.sub_command = pb.SubCommand.FIVE_G_SEND_IMAGE_SUB_COMMAND req.data1.length = len(data1_str) req.data1.data = data1_str # add message to queue self.msg_queue.put(req) self.next_time += self.interval time.sleep(0.1) for camera in self.cameras: camera.release() print("CaptureThread stopped")