Orange Pi Zero. CPU 100%. При использовани opencv-python

Мой код для передачи видео с веб камеры по UDP:

class CamServer(Thread):

def __init__(self, port, cam) -> None:
    super().__init__()
    self.port = port
    self.cam = cam
    self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)

def run(self):
    global CONNECTION
    
    try:
        self.server_socket.bind(('', self.port))
    except socket.error as exc:
        print(exc)
        sys.exit(1)

    while True:
        try:
            _, addr = self.server_socket.recvfrom(BUFF_SIZE)
            print("Connected by: ", addr)

            vid = cv2.VideoCapture(self.cam, cv2.CAP_V4L2) #cv2.CAP_DSHOW
            # vid = cv2.VideoCapture(self.cam) # TEST
            CONNECTION = True             
        except: print("Disconnection from: ", addr)

        while vid.isOpened():
            if CONNECTION == False:
                cv2.destroyAllWindows()
                vid.release()
                break
            
            ret, frame = vid.read()
            if ret:
                frame = imutils.resize(frame, width=640)
                _, buffer = cv2.imencode('.jpg',frame,[cv2.IMWRITE_JPEG_QUALITY,80])
               #_, buffer = cv2.imencode('.jpg',frame)
                buffer = buffer.tobytes()
                buffer_size = len(buffer)
                num_of_packs = 1

                if buffer_size > BUFF_SIZE:
                    num_of_packs = math.ceil(buffer_size/BUFF_SIZE)
                
                frame_info = {"packs":num_of_packs}
                self.server_socket.sendto(pickle.dumps(frame_info), addr)
                left = 0
                right = BUFF_SIZE

                for i in range(num_of_packs):
                    data = buffer[left:right]
                    left = right
                    right += BUFF_SIZE
                    self.server_socket.sendto(data, addr)

Если запускать на Windows то процессор используется на 2%. На Orange Pi Zero (Armbian) 100% загрузка даже если закомментировать все начиная от:

ret, frame = vid.read()

Пробовал устанавливать time.sleep(.1) - немного помагает (80% CPU) но тогда сильно падает FPS. Может кто то сталкивался с этим? Как "разгрузить" процессор?


Ответы (0 шт):