Я пытаюсь перенести фреймворк 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
, но это ничего не изменит.
Я полностью озадачен. Как это поведение можно объяснить? Что еще я могу сделать?