Неизвестная ошибка cv2 при рендеринге кадров JPEG в стороннем потокеPython

Программы на Python
Ответить
Anonymous
 Неизвестная ошибка cv2 при рендеринге кадров JPEG в стороннем потоке

Сообщение Anonymous »

Мой скрипт Python (в macOS, если это имеет значение) запускает сервер веб-сокетов, на который он получает видеоматериалы в виде изображений JPEG. Он помещает эти изображения (

Код: Выделить всё

bytesобъекты 
) в очереди. Их визуализирует другой поток:

Код: Выделить всё

#!/usr/bin/env python3

import asyncio
import queue
import threading

import cv2
import numpy
import websockets

def render_frames(q):
try:
while (frame := q.get()) is not None:
decoded = cv2.imdecode(numpy.frombuffer(frame, numpy.uint8), cv2.IMREAD_COLOR)
assert decoded is not None
cv2.imshow("Footage", decoded)
cv2.waitKey(1)
finally:
cv2.destroyAllWindows()

class Server:
def __init__(self):
self.queue = queue.SimpleQueue()
self.render_thread = threading.Thread(target=render_frames, args=(self.queue,))

async def run(self):
self.render_thread.start()

try:
server = await websockets.serve(self.handle_client, "0.0.0.0", 8000)
await server.wait_closed()
finally:
self.queue.put(None)
self.render_thread.join()

async def handle_client(self, connection):
async for message in connection:
assert not isinstance(message, str)
self.queue.put(message)

def main():
try:
asyncio.run(Server().run())
except KeyboardInterrupt:
pass

if __name__ == "__main__":
main()
Однако строка cv2.imshow вызывает сбой:

cv2.error: Unknown C++ исключение из кода OpenCV

Я записал кадр на диск и подтвердил, что это допустимое изображение JPEG.
Что странно, если я напишу простой скрипт, который берет одно из изображений JPEG и визуализирует его в бесконечном цикле, он работает нормально. Влияет ли на ситуацию присутствие в боковой теме?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ide-thread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»