1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2024 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include <assert.h>
#include <k4a/k4a.h>
#include <math.h>
#include <atomic>
#include <csignal>
#include <ctime>
#include <iostream>
#include "open3d/Open3D.h"
using namespace open3d;
void PrintHelp() {
using namespace open3d;
PrintOpen3DVersion();
// clang-format off
utility::LogInfo("Usage:");
utility::LogInfo(" > AzureKinectViewer [options]");
utility::LogInfo("Basic options:");
utility::LogInfo(" --help, -h : Print help information.");
utility::LogInfo(" --config : Config .json file (default: none)");
utility::LogInfo(" --list : List the currently connected K4A devices");
utility::LogInfo(" --device : Specify the device index to use (default: 0)");
utility::LogInfo(" -a : Align depth with color image (default: disabled)");
// clang-format on
utility::LogInfo("");
}
int main(int argc, char **argv) {
if (argc < 1 ||
utility::ProgramOptionExistsAny(argc, argv, {"-h", "--help"})) {
PrintHelp();
return 1;
}
if (utility::ProgramOptionExists(argc, argv, "--list")) {
io::AzureKinectSensor::ListDevices();
return 0;
}
io::AzureKinectSensorConfig sensor_config;
if (utility::ProgramOptionExists(argc, argv, "--config")) {
auto config_filename =
utility::GetProgramOptionAsString(argc, argv, "--config", "");
if (!io::ReadIJsonConvertibleFromJSON(config_filename, sensor_config)) {
utility::LogInfo("Invalid sensor config");
return 1;
}
} else {
utility::LogInfo("Use default sensor config");
}
int sensor_index =
utility::GetProgramOptionAsInt(argc, argv, "--device", 0);
if (sensor_index < 0 || sensor_index > 255) {
utility::LogWarning("Sensor index must between [0, 255]: {}",
sensor_index);
return 1;
}
bool enable_align_depth_to_color =
utility::ProgramOptionExists(argc, argv, "-a");
// Init sensor
io::AzureKinectSensor sensor(sensor_config);
if (!sensor.Connect(sensor_index)) {
utility::LogWarning("Failed to connect to sensor, abort.");
return 1;
}
// Start viewing
bool flag_exit = false;
bool is_geometry_added = false;
visualization::VisualizerWithKeyCallback vis;
vis.RegisterKeyCallback(GLFW_KEY_ESCAPE,
[&](visualization::Visualizer *vis) {
flag_exit = true;
return false;
});
vis.CreateVisualizerWindow("Open3D Azure Kinect Recorder", 1920, 540);
do {
auto im_rgbd = sensor.CaptureFrame(enable_align_depth_to_color);
if (im_rgbd == nullptr) {
utility::LogInfo("Invalid capture, skipping this frame");
continue;
}
if (!is_geometry_added) {
vis.AddGeometry(im_rgbd);
is_geometry_added = true;
}
// Update visualizer
vis.UpdateGeometry();
vis.PollEvents();
vis.UpdateRender();
} while (!flag_exit);
return 0;
}
|