mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-29 11:06:18 +00:00
xrt: add hand_tracking_image_boundary_info
This commit is contained in:
parent
db85ea2df5
commit
8040224b39
|
@ -286,7 +286,26 @@ ht_device_create_index(struct xrt_prober *xp, struct t_stereo_camera_calibration
|
||||||
if (use_old_rgb) {
|
if (use_old_rgb) {
|
||||||
sync = t_hand_tracking_sync_old_rgb_create(calib);
|
sync = t_hand_tracking_sync_old_rgb_create(calib);
|
||||||
} else {
|
} else {
|
||||||
sync = t_hand_tracking_sync_mercury_create(calib, HT_OUTPUT_SPACE_LEFT_CAMERA);
|
|
||||||
|
struct hand_tracking_image_boundary_info info;
|
||||||
|
info.views[0].type = HT_IMAGE_BOUNDARY_CIRCLE;
|
||||||
|
info.views[1].type = HT_IMAGE_BOUNDARY_CIRCLE;
|
||||||
|
|
||||||
|
|
||||||
|
//!@todo This changes by like 50ish pixels from device to device. For now, the solution is simple: just
|
||||||
|
//! make the circle a bit bigger than we'd like.
|
||||||
|
// Maybe later we can do vignette calibration? Write a tiny optimizer that tries to fit Index's
|
||||||
|
// gradient? Unsure.
|
||||||
|
info.views[0].boundary.circle.normalized_center.x = 0.5f;
|
||||||
|
info.views[0].boundary.circle.normalized_center.y = 0.5f;
|
||||||
|
|
||||||
|
info.views[1].boundary.circle.normalized_center.x = 0.5f;
|
||||||
|
info.views[1].boundary.circle.normalized_center.y = 0.5f;
|
||||||
|
|
||||||
|
info.views[0].boundary.circle.normalized_radius = 0.55;
|
||||||
|
info.views[1].boundary.circle.normalized_radius = 0.55;
|
||||||
|
|
||||||
|
sync = t_hand_tracking_sync_mercury_create(calib, HT_OUTPUT_SPACE_LEFT_CAMERA, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ht_device *htd = ht_device_create_common(calib, true, &finder.xfctx, sync);
|
struct ht_device *htd = ht_device_create_common(calib, true, &finder.xfctx, sync);
|
||||||
|
@ -340,6 +359,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
|
||||||
struct t_stereo_camera_calibration *calib,
|
struct t_stereo_camera_calibration *calib,
|
||||||
enum hand_tracking_output_space output_space,
|
enum hand_tracking_output_space output_space,
|
||||||
enum hand_tracking_algorithm algorithm_choice,
|
enum hand_tracking_algorithm algorithm_choice,
|
||||||
|
struct hand_tracking_image_boundary_info boundary_info,
|
||||||
struct xrt_slam_sinks **out_sinks,
|
struct xrt_slam_sinks **out_sinks,
|
||||||
struct xrt_device **out_device)
|
struct xrt_device **out_device)
|
||||||
{
|
{
|
||||||
|
@ -347,7 +367,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
|
||||||
XRT_TRACE_MARKER();
|
XRT_TRACE_MARKER();
|
||||||
assert(calib != NULL);
|
assert(calib != NULL);
|
||||||
|
|
||||||
struct t_hand_tracking_sync *sync = t_hand_tracking_sync_mercury_create(calib, output_space);
|
struct t_hand_tracking_sync *sync = t_hand_tracking_sync_mercury_create(calib, output_space, boundary_info);
|
||||||
|
|
||||||
struct ht_device *htd = ht_device_create_common(calib, false, xfctx, sync);
|
struct ht_device *htd = ht_device_create_common(calib, false, xfctx, sync);
|
||||||
|
|
||||||
|
@ -380,7 +400,11 @@ ht_device_create_depthai_ov9282()
|
||||||
|
|
||||||
struct t_hand_tracking_sync *sync;
|
struct t_hand_tracking_sync *sync;
|
||||||
|
|
||||||
sync = t_hand_tracking_sync_mercury_create(calib, HT_OUTPUT_SPACE_LEFT_CAMERA);
|
struct hand_tracking_image_boundary_info info;
|
||||||
|
info.views[0].type = HT_IMAGE_BOUNDARY_NONE;
|
||||||
|
info.views[1].type = HT_IMAGE_BOUNDARY_NONE;
|
||||||
|
|
||||||
|
sync = t_hand_tracking_sync_mercury_create(calib, HT_OUTPUT_SPACE_LEFT_CAMERA, info);
|
||||||
|
|
||||||
struct ht_device *htd = ht_device_create_common(calib, true, &xfctx, sync);
|
struct ht_device *htd = ht_device_create_common(calib, true, &xfctx, sync);
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
|
||||||
struct t_stereo_camera_calibration *calib,
|
struct t_stereo_camera_calibration *calib,
|
||||||
enum hand_tracking_output_space output_space,
|
enum hand_tracking_output_space output_space,
|
||||||
enum hand_tracking_algorithm algorithm_choice,
|
enum hand_tracking_algorithm algorithm_choice,
|
||||||
|
struct hand_tracking_image_boundary_info boundary_info,
|
||||||
struct xrt_slam_sinks **out_sinks,
|
struct xrt_slam_sinks **out_sinks,
|
||||||
struct xrt_device **out_device);
|
struct xrt_device **out_device);
|
||||||
|
|
||||||
|
|
|
@ -1486,11 +1486,17 @@ wmr_hmd_hand_track(struct wmr_hmd *wh,
|
||||||
struct xrt_device *device = NULL;
|
struct xrt_device *device = NULL;
|
||||||
|
|
||||||
#ifdef XRT_BUILD_DRIVER_HANDTRACKING
|
#ifdef XRT_BUILD_DRIVER_HANDTRACKING
|
||||||
|
//!@todo Turning it off is okay for now, but we should plug metric_radius (or whatever it's called) in, at some
|
||||||
|
//! point.
|
||||||
|
struct hand_tracking_image_boundary_info boundary_info;
|
||||||
|
boundary_info.views[0].type = HT_IMAGE_BOUNDARY_NONE;
|
||||||
|
boundary_info.views[1].type = HT_IMAGE_BOUNDARY_NONE;
|
||||||
|
|
||||||
int create_status = ht_device_create(&wh->tracking.xfctx, //
|
int create_status = ht_device_create(&wh->tracking.xfctx, //
|
||||||
stereo_calib, //
|
stereo_calib, //
|
||||||
HT_OUTPUT_SPACE_LEFT_CAMERA, //
|
HT_OUTPUT_SPACE_LEFT_CAMERA, //
|
||||||
HT_ALGORITHM_MERCURY, //
|
HT_ALGORITHM_MERCURY, //
|
||||||
|
boundary_info, //
|
||||||
&sinks, //
|
&sinks, //
|
||||||
&device);
|
&device);
|
||||||
if (create_status != 0) {
|
if (create_status != 0) {
|
||||||
|
|
|
@ -30,6 +30,37 @@ enum hand_tracking_algorithm
|
||||||
HT_ALGORITHM_OLD_RGB
|
HT_ALGORITHM_OLD_RGB
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum hand_tracking_image_boundary_type
|
||||||
|
{
|
||||||
|
HT_IMAGE_BOUNDARY_NONE,
|
||||||
|
HT_IMAGE_BOUNDARY_CIRCLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hand_tracking_image_boundary_circle
|
||||||
|
{
|
||||||
|
// The center, in normalized 0-1 UV coordinates.
|
||||||
|
// Should probably be between 0 and 1 in pixel coordinates.
|
||||||
|
struct xrt_vec2 normalized_center;
|
||||||
|
// The radius, divided by the image width.
|
||||||
|
// For Index, should be around 0.5.
|
||||||
|
float normalized_radius;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hand_tracking_image_boundary_info_one_view
|
||||||
|
{
|
||||||
|
enum hand_tracking_image_boundary_type type;
|
||||||
|
union {
|
||||||
|
struct hand_tracking_image_boundary_circle circle;
|
||||||
|
} boundary;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct hand_tracking_image_boundary_info
|
||||||
|
{
|
||||||
|
//!@todo Hardcoded to 2 - needs to increase as we support headsets with more cameras.
|
||||||
|
struct hand_tracking_image_boundary_info_one_view views[2];
|
||||||
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Synchronously processes frames and returns two hands.
|
* Synchronously processes frames and returns two hands.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
* @ingroup aux_tracking
|
* @ingroup aux_tracking
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "xrt/xrt_defines.h"
|
||||||
#include "tracking/t_tracking.h"
|
#include "tracking/t_tracking.h"
|
||||||
#include "tracking/t_hand_tracking.h"
|
#include "tracking/t_hand_tracking.h"
|
||||||
|
|
||||||
|
@ -22,7 +23,8 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
struct t_hand_tracking_sync *
|
struct t_hand_tracking_sync *
|
||||||
t_hand_tracking_sync_mercury_create(struct t_stereo_camera_calibration *calib,
|
t_hand_tracking_sync_mercury_create(struct t_stereo_camera_calibration *calib,
|
||||||
enum hand_tracking_output_space output_space);
|
enum hand_tracking_output_space output_space,
|
||||||
|
struct hand_tracking_image_boundary_info boundary_info);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
|
@ -491,7 +491,9 @@ HandTracking::cCallbackDestroy(t_hand_tracking_sync *ht_sync)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern "C" t_hand_tracking_sync *
|
extern "C" t_hand_tracking_sync *
|
||||||
t_hand_tracking_sync_mercury_create(struct t_stereo_camera_calibration *calib, hand_tracking_output_space output_space)
|
t_hand_tracking_sync_mercury_create(struct t_stereo_camera_calibration *calib,
|
||||||
|
enum hand_tracking_output_space output_space,
|
||||||
|
struct hand_tracking_image_boundary_info boundary_info)
|
||||||
{
|
{
|
||||||
XRT_TRACE_MARKER();
|
XRT_TRACE_MARKER();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue