ndarray.copy блокирует на неопределенный срок - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь перенести фреймворк pyZed в DNN DeepPrior ++ , чтобы он работал с глубинной камерой ZED M. Для этого я создаю class ZCameraDevice(CameraDevice): в файле DeepPrior ++ cameradevice.py. После инициализации класс получает доступ к камере, и когда запрашивается информация о глубине, он приносит объект типа PyMat от ZED. Я могу преобразовать это в numy ndarray, используя метод d = mydepth.get_data(), как реализовано здесь .

Однако теперь любой запрос типа d.copy(), numpy.copy(d) или даже mydepth.get_data().copy вызывает зависание потока производителя. Не генерируется исключение, но любой оператор (включая сбой, операторы печати и т. Д.) Ниже строки копирования никогда не выполняется, кажется, что поток останавливается.

Вот код, который я добавил к cameradevice.py:

try:
    import pyzed.camera as zcam
    import pyzed.core as core
    import pyzed.defines as sl
    import pyzed.types as tp
    ZCAM_IMPORTED = True
except ImportError:
    print "Warning: zcam modules not found, disabling ZCameraDevice"
    ZCAM_IMPORTED = False

и позже:

if ZCAM_IMPORTED:
    class ZCameraDevice(CameraDevice):
        """
        Class for ZED cameras, including ZED m
        """

        def __init__(self, mirror=False):
            """
            Initialize device
            :param mirror: mirror image
            """

            super(ZCameraDevice, self).__init__(mirror)

        def start(self):
            """
            Start device
            return: None
            """
            self.zed = zcam.PyZEDCamera()

            self.init_params = zcam.PyInitParameters()
            self.init_params.camera_resolution = sl.PyRESOLUTION.PyRESOLUTION_HD720
            self.init_params.depth_mode = sl.PyDEPTH_MODE.PyDEPTH_MODE_PERFORMANCE
            self.init_params.coordinate_units = sl.PyUNIT.PyUNIT_MILLIMETER

            err = self.zed.open(self.init_params)
            if err != tp.PyERROR_CODE.PySUCCESS:
                print("Failed to open zcam!")
                exit(1)

            self.runtime_parameters = zcam.PyRuntimeParameters()
            self.runtime_parameters.sensing_mode = sl.PySENSING_MODE.PySENSING_MODE_STANDARD

            self.depth = core.PyMat()
            self.rgb = core.PyMat()

        def stop(self):
            """
            Stop device
            :return: None
            """
            self.zed.close()

        def getDepth(self):
            """
            Return a median smoothed depth image
            :return: depth data as numpy array
            """
            if self.zed.grab(self.runtime_parameters) == tp.PyERROR_CODE.PySUCCESS:
                self.zed.retrieve_image(self.depth, sl.PyVIEW.PyVIEW_DEPTH)
                return True, self.depth.get_data()
            else:
                return False, None

        def getRGB(self):
            """
            Return a bit color image
            :return: color image as numpy array
            """
            if self.zed.grab(self.runtime_parameters) == tp.PyERROR_CODE.PySUCCESS:
                self.zed.retrieve_image(self.rgb, sl.PyVIEW.PyVIEW_LEFT)
            else:
                return False, None
            return True, self.rgb.get_data()

        def getRGBD(self):
            """
            Return a color + depth image
            :return: RGB-D image as 4-channel numpy array
            """
            if self.zed.grab(self.runtime_parameters) == tp.PyERROR_CODE.PySUCCESS:
                self.zed.retrieve_image(self.depth, sl.PyVIEW.PyVIEW_DEPTH)
                self.zed.retrieve_image(self.rgb, sl.PyVIEW.PyVIEW_LEFT)
            else:
                return False, None, None
            return True, self.rgb.get_data(), self.depth.get_data()

Я не могу воспроизвести поведение вне DeepPrior ++, даже при использовании потоков. Я могу скопировать ndarray один раз, используя numpy.copy_to, но затем копия не может быть скопирована дальше. Я подумал, что это может быть проблема с сборщиком мусора и владельцем данных, и попытался сохранить любую информацию в виде полей внутри класса ZCameraDevice, но это ничего не изменит.

Я полностью озадачен. Как это поведение можно объяснить? Что еще я могу сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...