3#include "meta_data.hpp"
4#include "../data_type.hpp"
5#include "cube_range.hpp"
6#include "../_cexports/c_spectral.h"
9#include "linear_access_data.hpp"
16 inline HandleGuard<Spectral::Cube>::HandleGuard(
void * handle) noexcept
17 : HandleGuard<Spectral::Cube>(handle, [](
void* handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
55 Cube& operator=(
const Cube& other) =
delete;
57 Cube& operator=(
Cube&& other) =
default;
58 virtual ~Cube() =
default;
74 return Internal::DoResCallObjectOut<Cube>([&](
void* & cubeOut)
76 return CVB_CALL_CAPI(CVSCreateContinuousCube(numSamples, numLines, numBands,
77 dataType.
NativeDescriptor(),
static_cast<CExports::CVSCubeEncoding
>(bufferLayout),
93 return Internal::DoResCallObjectOut<Cube>([&](
void* & cubeOut)
95 return CVB_CALL_CAPI(CVSCreateDuplicatedContinuousCube(handle_.Handle(),
114 for (
auto pImg : images)
115 imgArr.push_back(pImg->Handle());
116 return Internal::DoResCallObjectOut<Cube>([&](
void* & cubeOut)
118 return CVB_CALL_CAPI(CVSCreateStackedCube(imgArr.data(),
119 imgArr.size(),
static_cast<CExports::CVSCubeEncoding
>(bufferLayout),
133 CExports::CVSCubeType cType = Internal::DoResCallValueOut<CExports::CVSCubeType>([&](CExports::CVSCubeType& val)
135 return CVB_CALL_CAPI(CVSCubeGetType(handle_.Handle(), val));
137 return static_cast<CubeType>(cType);
152 CExports::cvbdatatype_t cType =
153 Internal::DoResCallValueOut<CExports::cvbdatatype_t>([&](CExports::cvbdatatype_t& val)
155 return CVB_CALL_CAPI(CVSCubeGetDatatype(handle_.Handle(), val));
174 return Internal::DoResCallObjectOut<Cube>([&](
void* & obj)
176 return CVB_CALL_CAPI(CVSCreateConvertedCube(handle_.Handle(),
177 static_cast<CExports::CVSCubeEncoding
>(targetView),
202 CExports::CVSCuboid cCuboid = { 0 };
203 cCuboid.Samples = {
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Samples().Min()),
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Samples().Max()) };
204 cCuboid.Lines = {
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Lines().Min()),
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Lines().Max()) };
205 cCuboid.Bands = {
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Bands().Min()),
static_cast<CExports::cvbdim_t
>(spectralCubeoid.
Bands().Max()) };
206 return Internal::DoResCallObjectOut<Cube>([&](
void* & obj)
208 return CVB_CALL_CAPI(CVSCreateCroppedCube(handle_.Handle(),
210 static_cast<CExports::cvbbool_t
>(mapTarget),
230 return Internal::DoResCallObjectOut<Image>([&](
void* & obj)
232 return CVB_CALL_CAPI(CVSCubeGetBufferView(handle_.Handle(),
249 return Internal::DoResCallObjectOut<Spectral::MetaData>([&](
void* & obj)
251 return CVB_CALL_CAPI(CVSCubeGetMetaData(handle_.Handle(),
266 void* pBase =
nullptr;
267 intptr_t sampleInc = 0, lineInc = 0, bandInc = 0;
268 auto code = CExports::MakeErrorCode(CVB_CALL_CAPI(CVSCubeGetLinearAccess(handle_.Handle(), pBase, sampleInc, lineInc, bandInc)));
317 return Internal::DoResCallObjectOut<Cube>([&](
void* & cubeOut)
319 return CVB_CALL_CAPI(CVSLoadEnviFileTyped(
320 EnviHeader.c_str(), EnviBinary.c_str(),
334 CVB_CALL_CAPI_CHECKED(CVSWriteEnviFileTyped(
336 EnviHeader.c_str(), EnviBinary.c_str()));
346 return handle_.Handle();
379 CExports::IMG objH =
nullptr;
380 if (CExports::MakeErrorCode(CVB_CALL_CAPI(CVSCubeGetBufferView(handle_.Handle(), objH))) < 0)
395 CExports::CVSMETADATA objH =
nullptr;
396 if (CExports::MakeErrorCode(CVB_CALL_CAPI(CVSCubeGetMetaData(handle_.Handle(), objH))) < 0)
406 explicit Cube(HandleGuard<Cube>&& guard) noexcept
407 : handle_(std::move(guard))
417 CVB_CALL_CAPI_CHECKED(CVSCubeGetSpectrumAsInteger(handle_.Handle(), sampleIndex, lineIndex,
418 reinterpret_cast<CExports::cvbval_t*
>(0), sz));
420 CVB_CALL_CAPI_CHECKED(CVSCubeGetSpectrumAsInteger(handle_.Handle(), sampleIndex, lineIndex,
421 tmpBuff.data(), sz));
424 for (
auto e : tmpBuff)
425 tmpSpecDens.push_back(
static_cast<int>(e));
426 specDens = tmpSpecDens;
432 CVB_CALL_CAPI_CHECKED(CVSCubeGetSpectrumAsDouble(handle_.Handle(), sampleIndex, lineIndex,
433 reinterpret_cast<double*
>(0), sz));
435 CVB_CALL_CAPI_CHECKED(CVSCubeGetSpectrumAsDouble(handle_.Handle(), sampleIndex, lineIndex,
436 tmpBuff.data(), sz));
442 HandleGuard<Cube> handle_;
447 using Spectral::Cube;
Data type description for an image plane.
Definition: data_type.hpp:28
int NativeDescriptor() const noexcept
Native data type descriptor.
Definition: data_type.hpp:322
static DataType FromNativeDescriptor(int dataTypeDescriptor) noexcept
Construct a data type descriptor from one of the native library's descriptor values.
Definition: data_type.hpp:37
static std::unique_ptr< Image > FromHandle(HandleGuard< Image > &&guard)
Creates an image from a classic API handle.
Definition: decl_image.hpp:153
Spectral Cube object.
Definition: cube.hpp:51
bool TryMetaData(MetaDataPtr &metaDataOut) const noexcept
Retrieves the meta data object of the cube without throwing an exception.
Definition: cube.hpp:393
std::vector< T > SpectralDensity(int sampleIndex, int lineIndex) const
Retrieves spectral density at given pixel.
Definition: cube.hpp:300
MetaDataPtr MetaData() const
Retrieves the meta data object of the cube.
Definition: cube.hpp:247
std::unique_ptr< Cube > Map(CubeRange spectralCubeoid)
Creates a cropped cube.
Definition: cube.hpp:199
LinearAccessData LinearAccess() const
Retrieve linear access of cube data.
Definition: cube.hpp:282
static std::unique_ptr< Cube > Create(int numSamples, int numLines, int numBands, DataType dataType, CubeEncoding bufferLayout=CubeEncoding::BandInterleavedByLine)
Creates a Continuous Cube object.
Definition: cube.hpp:71
std::unique_ptr< Cube > Convert(CubeEncoding targetView) const
Converts cube to given cube encoding targetView.
Definition: cube.hpp:172
std::unique_ptr< Cube > Clone()
Copies the memory to a new instance of a cube.
Definition: cube.hpp:91
bool TryLinearAccess(LinearAccessData &linearAccessOut) const noexcept
Retrieve linear access of cube data without throwing an exception.
Definition: cube.hpp:264
static std::unique_ptr< Cube > FromHandle(HandleGuard< Cube > &&guard)
Creates cube from a classic API handle.
Definition: cube.hpp:359
CubeType Type() const
Retrieves the type of this cube object.
Definition: cube.hpp:131
void Save(Cvb::String EnviHeader, Cvb::String EnviBinary) const
Writes this cube object to ENVI-format.
Definition: cube.hpp:332
bool TryBufferView(ImagePtr &bufferViewOut) const noexcept
Retrieves the buffer view of the cube without throwing an exception.
Definition: cube.hpp:377
static std::unique_ptr< Cube > FromImages(const std::vector< ImagePtr > &images, CubeEncoding bufferLayout)
Initializes a stacked cube using an array of images.
Definition: cube.hpp:111
static std::unique_ptr< Cube > Load(Cvb::String EnviHeader, Cvb::String EnviBinary)
Static function Loads a cube from ENVI.
Definition: cube.hpp:315
void * Handle() const noexcept
Returns C-API style handle to the Cube.
Definition: cube.hpp:344
Cvb::ImagePtr BufferView() const
Retrieves the buffer view of the cube.
Definition: cube.hpp:228
3D rectangle in the samples, lines and bands domain.
Definition: cube_range.hpp:24
ValueRange< int > Samples() const noexcept
Gets the range regarding the samples dimension.
Definition: cube_range.hpp:55
ValueRange< int > Bands() const noexcept
Gets the range regarding bands dimension.
Definition: cube_range.hpp:101
ValueRange< int > Lines() const noexcept
Gets the range regarding lines dimension.
Definition: cube_range.hpp:78
Linear access properties.
Definition: linear_access_data.hpp:21
@ CVC_E_ERROR
Definition: CVCError.h:61
CubeType
Defines the type of the cube.
Definition: spectral.hpp:225
@ StackedCube
Stacked Cube with potentially non-linear buffer.
CubeEncoding
View Perspective: Defines how the mapping between a typical x-y image and samples-lines-bands is done...
Definition: spectral.hpp:211
Root namespace for the Image Manager interface.
Definition: c_barcode.h:15