Я написал многопроцессную программу для анализа изображений с камеры. Первый процесс постоянно считывает изображение с камеры, второй анализирует это изображение, третий содержит 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. Пока не понимаю, почему поведение другое
@Кристоф Раквитц. Я исправил. Это минимально воспроизводимый пример. cv.Mat — это оболочка для массива numpy. Хранит дополнительную информацию о метаданных о том, как интерпретировать и обрабатывать массив numpy для базового кода C++.
@ChristophRackwitz Здесь: github.com/opencv/opencv/blob/… Я тоже был довольно озадачен...
очаровательный. комментарий/строка документации утверждает «дополнительные метаданные». выглядит как один атрибут, и IDK, если он вообще что-то делает. Ну что ж. «печать», вероятно, многое объясняет.
@ChristophRackwitz Соответствующий коммит — здесь изменение документации наиболее полезно. Похоже на средство, позволяющее предоставлять входные данные, соответствующие многомерным cv::Mat (те, которые вы могли бы построить с помощью this или подобных конструкторов).






Что мне помогло, так это изменение первого аргумента в объявлении ValueProxy (с cv2.typing.MatLike на cv2.Mat).
cv2.Matне должно существовать ни в текущих пакетах opencv-python, ни в каких-либо пакетах последних 10+ лет. это все пустые массивы. что ты сделал? требуется минимальный воспроизводимый пример.