xrt: add hand_tracking_image_boundary_info

This commit is contained in:
Moses Turner 2022-06-19 21:34:46 +01:00
parent db85ea2df5
commit 8040224b39
6 changed files with 71 additions and 5 deletions

View file

@ -286,7 +286,26 @@ ht_device_create_index(struct xrt_prober *xp, struct t_stereo_camera_calibration
if (use_old_rgb) {
sync = t_hand_tracking_sync_old_rgb_create(calib);
} 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);
@ -340,6 +359,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
struct t_stereo_camera_calibration *calib,
enum hand_tracking_output_space output_space,
enum hand_tracking_algorithm algorithm_choice,
struct hand_tracking_image_boundary_info boundary_info,
struct xrt_slam_sinks **out_sinks,
struct xrt_device **out_device)
{
@ -347,7 +367,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
XRT_TRACE_MARKER();
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);
@ -380,7 +400,11 @@ ht_device_create_depthai_ov9282()
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);

View file

@ -57,6 +57,7 @@ ht_device_create(struct xrt_frame_context *xfctx,
struct t_stereo_camera_calibration *calib,
enum hand_tracking_output_space output_space,
enum hand_tracking_algorithm algorithm_choice,
struct hand_tracking_image_boundary_info boundary_info,
struct xrt_slam_sinks **out_sinks,
struct xrt_device **out_device);

View file

@ -1486,11 +1486,17 @@ wmr_hmd_hand_track(struct wmr_hmd *wh,
struct xrt_device *device = NULL;
#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, //
stereo_calib, //
HT_OUTPUT_SPACE_LEFT_CAMERA, //
HT_ALGORITHM_MERCURY, //
boundary_info, //
&sinks, //
&device);
if (create_status != 0) {

View file

@ -30,6 +30,37 @@ enum hand_tracking_algorithm
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.
*/

View file

@ -8,6 +8,7 @@
* @ingroup aux_tracking
*/
#pragma once
#include "xrt/xrt_defines.h"
#include "tracking/t_tracking.h"
#include "tracking/t_hand_tracking.h"
@ -22,7 +23,8 @@ extern "C" {
*/
struct t_hand_tracking_sync *
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
} // extern "C"

View file

@ -491,7 +491,9 @@ HandTracking::cCallbackDestroy(t_hand_tracking_sync *ht_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();