in opencv-kinfu-samples/main.cpp [89:167]
static void compute_xy_range(const k4a_calibration_t* calibration,
const k4a_calibration_type_t camera,
const int width,
const int height,
float& x_min,
float& x_max,
float& y_min,
float& y_max)
{
// Step outward from the centre point until we find the bounds of valid projection
const float step_u = 0.25f;
const float step_v = 0.25f;
const float min_u = 0;
const float min_v = 0;
const float max_u = (float)width - 1;
const float max_v = (float)height - 1;
const float center_u = 0.5f * width;
const float center_v = 0.5f * height;
int valid;
k4a_float2_t p;
k4a_float3_t ray;
// search x_min
for (float uv[2] = { center_u, center_v }; uv[0] >= min_u; uv[0] -= step_u)
{
p.xy.x = uv[0];
p.xy.y = uv[1];
k4a_calibration_2d_to_3d(calibration, &p, 1.f, camera, camera, &ray, &valid);
if (!valid)
{
break;
}
x_min = ray.xyz.x;
}
// search x_max
for (float uv[2] = { center_u, center_v }; uv[0] <= max_u; uv[0] += step_u)
{
p.xy.x = uv[0];
p.xy.y = uv[1];
k4a_calibration_2d_to_3d(calibration, &p, 1.f, camera, camera, &ray, &valid);
if (!valid)
{
break;
}
x_max = ray.xyz.x;
}
// search y_min
for (float uv[2] = { center_u, center_v }; uv[1] >= min_v; uv[1] -= step_v)
{
p.xy.x = uv[0];
p.xy.y = uv[1];
k4a_calibration_2d_to_3d(calibration, &p, 1.f, camera, camera, &ray, &valid);
if (!valid)
{
break;
}
y_min = ray.xyz.y;
}
// search y_max
for (float uv[2] = { center_u, center_v }; uv[1] <= max_v; uv[1] += step_v)
{
p.xy.x = uv[0];
p.xy.y = uv[1];
k4a_calibration_2d_to_3d(calibration, &p, 1.f, camera, camera, &ray, &valid);
if (!valid)
{
break;
}
y_max = ray.xyz.y;
}
}