Files
OpenVulkano/openVulkanoCpp/AR/ArFrame.h

114 lines
2.9 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "Math/Math.hpp"
#include "Math/Timestamp.hpp"
#include "Math/Pose.hpp"
#include "Math/CameraIntrinsic.hpp"
#include "ArDepthFormat.hpp"
#include "ArTrackingState.hpp"
namespace openVulkanoCpp::AR
{
class ArImage
{
public:
void* data;
Math::Vector2ui resolution;
};
class ArImagePlanar
{
public:
enum class Format { NV12, NV21, RGB, BGR };
ArImage luminescenceOrColor;
ArImage uv;
Math::CameraIntrinsic intrinsic;
Format format = Format::NV12;
[[nodiscard]] Math::Vector4uc Sample(uint32_t x, uint32_t y, bool asRgb = true) const
{
const uint8_t* lumColBuffer = static_cast<const uint8_t*>(luminescenceOrColor.data);
if (format == Format::BGR)
{
size_t idx = (y * luminescenceOrColor.resolution.x + x) * 3;
return { lumColBuffer[idx + 2], lumColBuffer[idx + 1], lumColBuffer[idx], 255 };
}
else if (format == Format::RGB)
{
size_t idx = (y * luminescenceOrColor.resolution.x + x) * 3;
return { lumColBuffer[idx], lumColBuffer[idx + 1], lumColBuffer[idx + 2], 255 };
}
int iUV = ((y / 2) * uv.resolution.x + x / 2) * 2;
Math::Vector4uc sample(
lumColBuffer[y * luminescenceOrColor.resolution.x + x],
static_cast<const uint8_t*>(uv.data)[iUV],
static_cast<const uint8_t*>(uv.data)[iUV+1],
255);
if (asRgb)
{
Math::Vector4f c(sample);
Math::Matrix4f conversionMatrix(
Math::Vector4f(+1.0000f, +1.0000f, +1.0000f, +0.0000f),
Math::Vector4f(+0.0000f, -0.3441f, +1.7720f, +0.0000f),
Math::Vector4f(+1.4020f, -0.7141f, +0.0000f, +0.0000f),
Math::Vector4f(-0.7010f, +0.5291f, -0.8860f, +1.0000f)
);
sample = Math::Utils::clamp(conversionMatrix * c, 0.0f, 255.0f);
}
return sample;
}
};
class ArDepthImage
{
public:
ArImage depth;
ArImage confidence;
ArDepthFormat format;
Math::CameraIntrinsic intrinsic;
};
class ArFrame
{
protected:
ArFrame() = default;
public:
virtual ~ArFrame() = default;
[[nodiscard]] virtual ArTrackingState GetTrackingState() = 0;
[[nodiscard]] virtual Math::PoseF GetPose() = 0;
[[nodiscard]] virtual Math::Timestamp GetTimestamp() = 0;
//[[nodiscard]] virtual Math::Timestamp GetTimestampDepth() = 0;
[[nodiscard]] virtual ArImagePlanar GetCameraImage() = 0;
[[nodiscard]] virtual ArDepthImage GetDepthImage() = 0;
[[nodiscard]] virtual const Math::Matrix4f& GetCameraTransformation() = 0;
[[nodiscard]] virtual Math::Matrix4f GetCameraViewForCurrentDeviceOrientation() = 0;
[[nodiscard]] virtual Math::Matrix4f GetCameraProjection(Math::Vector2f viewportSize, float near = 0.25f, float far = 250.0f) = 0;
[[nodiscard]] virtual float GetConfidenceNormalisationFactor() = 0;
[[nodiscard]] virtual float GetColorTemperature() const = 0;
};
}