Как получить координату z из рамки глубины, полученной на примере PyGinectV2 BodyGame
Поработав некоторое время с примером pyKinect2 BodyGame и проведя некоторое исследование, я не смог понять, как получить значение z соединения, используя координаты x и y из этого соединения.
Автор упомянул:
Вам нужно получить z из фрейма глубины, используя x и y, которые вы получили из оригинального сообщения body_joints_to_depth_space на github
Поэтому я получаю координаты X и Y сустава в глубине пространства:
depth_points = self._kinect.body_joints_to_depth_space(joints)
x = depth_points[PyKinectV2.JointType_Head].x
y = depth_points[PyKinectV2.JointType_Head].y
соединения - это массив указателей (я не знаю точно, из-за отсутствующей документации библиотеки), которые хранят данные скелетных соединений, доставленных использованной оболочкой kinect. Но я до сих пор понятия не имею, чтобы получить координату Z.
Вызов функции
if self._kinect.has_new_depth_frame():
self._depth = self._kinect.get_last_depth_frame()
извлекает последний кадр глубины из устройства. self._depth - это массив значений глубины (не матрица), и я попытался проиндексировать соответствующее значение глубины, используя x и y. (х = горизонтальное положение, у = вертикальное положение)
Первым вариантом был классический индексный вызов матрицы:
z = self._depth[x,y]
но, как я уже говорил, self._depth является массивом. Поэтому я попробовал второй вариант, который означает индексирование линейного массива с использованием ширины исходной матрицы изображения.
z = self._depth[ y * self._frame_surface.get_width() + x ]
но я получил индекс за исключением границ.
self._frame_surface.get_width () - это ширина матрицы изображения, если я правильно ее интерпретирую. (Как я уже упоминал ранее, нет документации по pyKinectV2 lib).
Итак, вопрос еще существует. Как получить значение z для скелета?
2 ответа
joint_points_depth = self._kinect.body_joints_to_depth_space(joints)
x= self.round_int(int(joint_points_depth[PyKinectV2.JointType_SpineMid].x))
y= self.round_int(int(joint_points_depth[PyKinectV2.JointType_SpineMid].y))
z = int(self._depth[ y * 512 + x ] ) ## Its in Millimeters
Z даст вам расстояние между вами и камерой
Прежде всего, я хочу отметить, что я не эксперт по библиотеке PyKinectV2. Но у меня есть хороший опыт в Kinect V2 SDK. После того, как я нашел исходный код библиотеки pyKinectV2, я увидел, что pyKinectV2 - это просто оболочка для Kinect v2 Official SDK, поэтому мой ответ должен быть действительным для pyKinectV2, если в нем реализованы все функции SDK.
joints[PyKinectV2.JointType_Head].position
должен вернуть CameraSpacePoint
который должен содержать координаты x,y,z сустава в пространстве камеры.
joints[PyKinectV2.JointType_Head].position.X
joints[PyKinectV2.JointType_Head].position.Y
joints[PyKinectV2.JointType_Head].position.Z
Театрально, это Z
значение должно быть равно значению глубины этой конкретной точки.
Если вы хотите найти соответствующий пиксель глубины в кадре глубины, вы можете использовать
self._mapper.MapCameraPointToDepthSpace(joints[PyKinectV2.JointType_Head].position)
Который вернет DepthSpacePoint
, Это то, что использует Kinect SDK и что pyKinectV2 использует внутри.
Ваше предположение верно, глубина кадра составляет массив 1D 512 x 424. Во-первых, проверьте значение self._frame_surface.get_width()
, Должен вернуться 512
, Я пытался искать _frame_surface
объект в источнике pyKinectV2, но я не смог его найти, поэтому, пожалуйста, сначала проверьте его, так как Kinect v2 выводит разные данные кадра, может быть вероятность того, что _frame_surface
относится к другому кадру, разрешение которого отличается от глубины кадра, например, цветная рамка имеет разрешение 1920 x 1080.
Наконец, всегда лучше проверить индекс, прежде чем обращаться к нему из массива следующим образом:
if (y * 512 + x) =< 512*424:
z = self._depth[ y * 512 + x ]
Помните одну вещь: нет никакой гарантии, что всегда есть соответствующий пиксель глубины, и его значение глубины - глубина сустава. Поскольку кадр соединений (Skeleton) получается после того, как кадр BodyIndex идет по сложному алгоритму.