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. Может кто то сталкивался с этим? Как "разгрузить" процессор?