Support yaml for ArFrameMetadata

This commit is contained in:
Georg Hagen
2024-12-04 21:35:49 +01:00
parent 007eefc688
commit 88047ce740
3 changed files with 126 additions and 41 deletions

View File

@@ -5,8 +5,9 @@
*/
#include "ArFrameMetadata.hpp"
#include "Extensions/RymlConverters.hpp"
#include <fmt/format.h>
#include <pugixml.hpp>
#include <yaml-cpp/yaml.h>
#include <sstream>
namespace OpenVulkano::AR
@@ -45,18 +46,21 @@ namespace OpenVulkano::AR
}
}
template<glm::length_t SIZE, typename T, glm::qualifier Q>
void MatToYaml(const glm::mat<SIZE, SIZE, T, Q>& mat, std::ostream& stream, const std::string& nl = "\n")
template<typename T, int S>
void ReadMat(const ryml::NodeRef& node, T& mat)
{
for(int r = 0 ; r < SIZE; r++)
if (!node.is_seq()) return;
int row = 0;
for(auto iter = node.begin(); iter != node.end() && row < S; ++iter)
{
stream << nl << "- [";
for (int c = 0; c < SIZE; c++)
const auto rowNode = *iter;
int col = 0;
for(auto colIter = rowNode.begin(); colIter != rowNode.end() && col < S; ++colIter)
{
if (c) stream << ',';
stream << ' ' << mat[c][r];
(*colIter) >> mat[col][row];
col++;
}
stream << " ]";
row++;
}
}
}
@@ -89,32 +93,82 @@ namespace OpenVulkano::AR
return frameData;
}
ArFrameMetadata ArFrameMetadata::FromYaml(const char* xml, size_t length)
ArFrameMetadata ArFrameMetadata::FromYaml(const char* yaml, size_t length)
{
ArFrameMetadata frameData;
//TODO
ryml::Tree tree;
ryml::parse_in_arena(c4::csubstr(yaml, length), &tree);
ryml::NodeRef root = tree.rootref();
ryml::NodeRef camNode = root["Camera"];
ReadMat<Math::Matrix4f, 4>(camNode["Transform"], frameData.transformation);
ReadMat<Math::Matrix4f, 4>(camNode["Projection"], frameData.projection);
Math::Matrix3f intrinsic;
Math::Vector2i res;
camNode["Resolution"] >> res;
ReadMat<Math::Matrix3f, 3>(camNode["Intrinsics"], intrinsic);
frameData.intrinsic = {intrinsic, res};
camNode["ExposureDuration"] >> frameData.exposureTime;
camNode["ExposureOffset"] >> frameData.exposureOffset;
uint64_t nanos;
root["Timestamp"] >> nanos;
frameData.timestamp = nanos;
root["TimestampDepth"] >> nanos;
frameData.timestampDepth = nanos;
std::string tracking;
ryml::NodeRef trackingNode = root["TrackingState"];
trackingNode["Camera"] >> tracking;
frameData.trackingState = ArTrackingState::GetFromName(tracking);
ryml::NodeRef lightNode = root["Light"];
lightNode["Intensity"] >> frameData.lightIntensity;
lightNode["ColorTemp"] >> frameData.lightColorTemp;
return frameData;
}
std::string ArFrameMetadata::ToYaml() const
{
std::stringstream meta;
meta << std::setprecision(std::numeric_limits<double>::digits10);
meta << "camera:\n transform: ";
MatToYaml(transformation, meta, "\n ");
meta << "\n projection";
MatToYaml(projection, meta, "\n ");
meta << "\n resolution:\n width: " << intrinsic.GetResolution().x << "\n height: " << intrinsic.GetResolution().y;
meta << "\n intrinsics: ";
MatToYaml(intrinsic.cameraMatrix, meta, "\n ");
meta << "\n exposureDuration: " << exposureTime << "\n exposureOffset: " << exposureOffset;
meta << "\ntimestamp: " << timestamp.GetSeconds();
meta << "\ntimestampDepth: " << timestampDepth.GetNanos();
meta << "\ntrackingState: \n camera: " << trackingState.GetName();
meta << "\nlight:\n intensity: " << lightIntensity << "\n colorTemp: " << lightColorTemp;
return meta.str();
const auto& camMat = intrinsic.GetMatrix();
std::string meta = fmt::format(R"(Camera:
Transform:
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
Projection:
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
- [ {}, {}, {}, {} ]
Resolution: '({},{})'
Intrinsics:
- [ {}, {}, {} ]
- [ {}, {}, {} ]
- [ {}, {}, {} ]
ExposureDuration: {}
ExposureOffset: {}
Timestamp: {}
TimestampDepth: {}
TrackingState:
Camera: {}
Light:
Intensity: {}
ColorTemp: {}
)",
transformation[0][0], transformation[1][0], transformation[2][0], transformation[3][0],
transformation[0][1], transformation[1][1], transformation[2][1], transformation[3][1],
transformation[0][2], transformation[1][2], transformation[2][2], transformation[3][2],
transformation[0][3], transformation[1][3], transformation[2][3], transformation[3][3],
projection[0][0], projection[1][0], projection[2][0], projection[3][0],
projection[0][1], projection[1][1], projection[2][1], projection[3][1],
projection[0][2], projection[1][2], projection[2][2], projection[3][2],
projection[0][3], projection[1][3], projection[2][3], projection[3][3],
intrinsic.GetResolution().x, intrinsic.GetResolution().y,
camMat[0][0], camMat[1][0], camMat[2][0],
camMat[0][1], camMat[1][1], camMat[2][1],
camMat[0][2], camMat[1][2], camMat[2][2],
exposureTime, exposureOffset, timestamp.GetNanos(), timestampDepth.GetNanos(),
trackingState.GetName(), lightIntensity, lightColorTemp
);
return meta;
}
std::string ArFrameMetadata::ToXML() const
@@ -128,7 +182,7 @@ namespace OpenVulkano::AR
MatToXML(projection, meta, "\n\t\t\t");
meta << "\n\t\t</projection>\n\t\t<resolution>\n\t\t\t<width>" << intrinsic.GetResolution().x << "</width>\n\t\t\t";
meta << "<height>" << intrinsic.GetResolution().y << "</height>\n\t\t</resolution>\n\t\t<intrinsics>";
MatToXML(intrinsic.cameraMatrix, meta, "\n\t\t\t");
MatToXML(intrinsic.GetMatrix(), meta, "\n\t\t\t");
meta << "</intrinsics>\n\t\t<exposureDuration>" << exposureTime << "</exposureDuration>\n\t\t<exposureOffset>" << exposureOffset;
meta << "</exposureOffset>\n\t</camera>\n\t";
meta << "<timestamp>" << timestamp.GetSeconds() << "</timestamp>\n\t";