in body-tracking-samples/offline_processor/main.cpp [86:184]
bool process_mkv_offline(const char* input_path, const char* output_path)
{
k4a_playback_t playback_handle = nullptr;
k4a_result_t result = k4a_playback_open(input_path, &playback_handle);
if (result != K4A_RESULT_SUCCEEDED)
{
cerr << "Cannot open recording at " << input_path << endl;
return false;
}
k4a_calibration_t calibration;
result = k4a_playback_get_calibration(playback_handle, &calibration);
if (result != K4A_RESULT_SUCCEEDED)
{
cerr << "Failed to get calibration" << endl;
return false;
}
k4abt_tracker_t tracker = NULL;
k4abt_tracker_configuration_t tracker_config = K4ABT_TRACKER_CONFIG_DEFAULT;
if (K4A_RESULT_SUCCEEDED != k4abt_tracker_create(&calibration, tracker_config, &tracker))
{
cerr << "Body tracker initialization failed!" << endl;
return false;
}
json json_output;
json_output["k4abt_sdk_version"] = K4ABT_VERSION_STR;
json_output["source_file"] = input_path;
// Store all joint names to the json
json_output["joint_names"] = json::array();
for (int i = 0; i < (int)K4ABT_JOINT_COUNT; i++)
{
json_output["joint_names"].push_back(g_jointNames.find((k4abt_joint_id_t)i)->second);
}
// Store all bone linkings to the json
json_output["bone_list"] = json::array();
for (int i = 0; i < (int)g_boneList.size(); i++)
{
json_output["bone_list"].push_back({ g_jointNames.find(g_boneList[i].first)->second,
g_jointNames.find(g_boneList[i].second)->second });
}
cout << "Tracking " << input_path << endl;
int frame_count = 0;
json frames_json = json::array();
bool success = true;
while (true)
{
k4a_capture_t capture_handle = nullptr;
k4a_stream_result_t stream_result = k4a_playback_get_next_capture(playback_handle, &capture_handle);
if (stream_result == K4A_STREAM_RESULT_EOF)
{
break;
}
cout << "frame " << frame_count << '\r';
if (stream_result == K4A_STREAM_RESULT_SUCCEEDED)
{
// Only try to predict joints when capture contains depth image
if (check_depth_image_exists(capture_handle))
{
success = predict_joints(frames_json, frame_count, tracker, capture_handle);
k4a_capture_release(capture_handle);
if (!success)
{
cerr << "Predict joints failed for clip at frame " << frame_count << endl;
break;
}
}
}
else
{
success = false;
cerr << "Stream error for clip at frame " << frame_count << endl;
break;
}
frame_count++;
}
if (success)
{
json_output["frames"] = frames_json;
cout << endl << "DONE " << endl;
cout << "Total read " << frame_count << " frames" << endl;
std::ofstream output_file(output_path);
output_file << std::setw(4) << json_output << std::endl;
cout << "Results saved in " << output_path;
}
k4a_playback_close(playback_handle);
return success;
}