Менеджер многопроцессорности не может выбрать <класс 'cv2.Mat'>

Я написал многопроцессную программу для анализа изображений с камеры. Первый процесс постоянно считывает изображение с камеры, второй анализирует это изображение, третий содержит HTTP-сервер для возврата изображения. Обмен кадрами осуществляется с помощью multiprocessing.Manager.

import multiprocessing
import cv2

manager = multiprocessing.Manager()
frame = manager.Value(cv2.typing.MatLike, None)

Следующий код инициализирует ValueProxy для обмена кадрами между процессами. Этот код отлично работает на моем компьютере. Однако при развертывании этой программы на другом компьютере возникает следующая ошибка:

Traceback (most recent call last):
  File "/home/tablo/Apps/rvp-camera-service/src/main.py", line 7, in <module>
    camera_service = CameraService()
  File "/home/tablo/Apps/rvp-camera-service/src/camera_service.py", line 53, in __init__
    self.frame = self.manager.Value(cv2.typing.MatLike, None)
  File "/usr/lib/python3.10/multiprocessing/managers.py", line 723, in temp
    token, exp = self._create(typeid, *args, **kwds)
  File "/usr/lib/python3.10/multiprocessing/managers.py", line 608, in _create
    id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
  File "/usr/lib/python3.10/multiprocessing/managers.py", line 89, in dispatch
    c.send((id, methodname, args, kwds))
  File "/usr/lib/python3.10/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib/python3.10/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class 'cv2.Mat'>: it's not the same object as cv2.Mat

Обе системы имеют opencv 4.9.0 и python 3.10.6. Пока не понимаю, почему поведение другое

cv2.Mat не должно существовать ни в текущих пакетах opencv-python, ни в каких-либо пакетах последних 10+ лет. это все пустые массивы. что ты сделал? требуется минимальный воспроизводимый пример.
Christoph Rackwitz 21.05.2024 15:16

@Кристоф Раквитц. Я исправил. Это минимально воспроизводимый пример. cv.Mat — это оболочка для массива numpy. Хранит дополнительную информацию о метаданных о том, как интерпретировать и обрабатывать массив numpy для базового кода C++.

Кирилл Сыроежкин 21.05.2024 15:28

@ChristophRackwitz Здесь: github.com/opencv/opencv/blob/… Я тоже был довольно озадачен...

Dan Mašek 21.05.2024 15:31

очаровательный. комментарий/строка документации утверждает «дополнительные метаданные». выглядит как один атрибут, и IDK, если он вообще что-то делает. Ну что ж. «печать», вероятно, многое объясняет.

Christoph Rackwitz 21.05.2024 16:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что мне помогло, так это изменение первого аргумента в объявлении ValueProxy (с cv2.typing.MatLike на cv2.Mat).

Другие вопросы по теме