MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ analyze_implementation()

template<ComputeData InputType = std::vector<Kakshya::DataVariant>, ComputeData OutputType = std::vector<Kakshya::DataVariant>>
output_type MayaFlux::Yantra::VisionAnalyzer< InputType, OutputType >::analyze_implementation ( const input_type input)
inlineoverrideprotectedvirtual

Pure virtual analysis implementation - derived classes implement this.

Parameters
inputInput data with metadata
Returns
Raw analysis output before granularity formatting

Implements MayaFlux::Yantra::UniversalAnalyzer< InputType, OutputType >.

Definition at line 171 of file VisionAnalyzer.hpp.

172 {
173 try {
174 auto [native_spans, structure_info] = OperationHelper::extract_structured_native(
175 const_cast<input_type&>(input));
176
177 if (native_spans.empty()) {
178 error<std::runtime_error>(
181 std::source_location::current(),
182 "VisionAnalyzer: no pixel data in input");
183 }
184
185 uint32_t w = 0;
186 uint32_t h = 0;
187 for (const auto& dim : structure_info.dimensions) {
189 w = static_cast<uint32_t>(dim.size);
190 } else if (dim.role == Kakshya::DataDimension::Role::SPATIAL_Y) {
191 h = static_cast<uint32_t>(dim.size);
192 }
193 }
194 if (w == 0)
195 w = Kakshya::get_metadata_value<uint32_t>(input.metadata, "width").value_or(0);
196 if (h == 0)
197 h = Kakshya::get_metadata_value<uint32_t>(input.metadata, "height").value_or(0);
198
199 if (w == 0 || h == 0) {
200 error<std::runtime_error>(
203 std::source_location::current(),
204 "VisionAnalyzer: width/height not resolvable from dimensions or metadata");
205 }
206
207 auto frame = std::visit([&](const auto& span) -> std::span<const float> {
208 using ElemT = typename std::decay_t<decltype(span)>::value_type;
209 if constexpr (std::is_same_v<ElemT, float>) {
210 return span;
211 } else {
212 using VecT = std::vector<ElemT>;
213 VecT tmp(span.begin(), span.end());
214 Kakshya::DataVariant var(std::move(tmp));
216 }
217 },
218 native_spans[0]);
219
220 if (frame.empty()) {
221 error<std::runtime_error>(
224 std::source_location::current(),
225 "VisionAnalyzer: normalisation produced empty frame");
226 }
227
228 const Kinesis::Vision::VisionResult vr = m_executor.run(m_sequence, frame, w, h);
229
230 VisionAnalysis analysis;
231 if (const auto* v = std::get_if<std::vector<float>>(&vr.pixel_image))
232 analysis.pixel_image = *v;
233
234 analysis.w = vr.w;
235 analysis.h = vr.h;
236
237 std::visit([&](const auto& s) {
238 using T = std::decay_t<decltype(s)>;
239 if constexpr (std::is_same_v<T, Kinesis::Vision::GradientResult>) {
240 analysis.frame.gradient = s;
241 } else if constexpr (std::is_same_v<T, Kinesis::Vision::ComponentResult>) {
242 analysis.frame.components = s;
243 analysis.frame.boxes = s.boxes;
244 } else if constexpr (std::is_same_v<T, std::vector<Kinesis::Vision::Contour>>) {
245 analysis.frame.contours = s;
246 } else if constexpr (std::is_same_v<T, std::vector<Kinesis::Vision::Keypoint>>) {
247 analysis.frame.keypoints = s;
248 } else if constexpr (std::is_same_v<T, std::vector<Kinesis::Vision::TrackResult>>) {
249 analysis.frame.tracks = s;
250 }
251 },
252 vr.structured);
253
254 this->store_current_analysis(analysis);
255
256 return create_pipeline_output(input, vr, structure_info);
257
258 } catch (const std::exception& e) {
260 "VisionAnalyzer: {}", e.what());
261 output_type err;
262 err.metadata = input.metadata;
263 err.metadata["error"] = std::string(e.what());
264 return err;
265 }
266 }
#define MF_ERROR(comp, ctx,...)
Core::GlobalInputConfig input
Definition Config.cpp:38
uint32_t h
Definition InkPress.cpp:28
VisionResult run(const VisionSequence &sequence, std::span< const float > frame, uint32_t w, uint32_t h)
Execute a VisionSequence on one frame.
static std::tuple< std::vector< Kakshya::DataSpanVariant >, DataStructureInfo > extract_structured_native(T &compute_data)
Extract native-typed channel spans and structure metadata from a Datum or direct ComputeData,...
void store_current_analysis(AnalysisResultType &&result) const
output_type create_pipeline_output(const input_type &input, const Kinesis::Vision::VisionResult &vr, const DataStructureInfo &info)
Kinesis::Vision::VisionExecutor m_executor
Kinesis::Vision::VisionSequence m_sequence
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
std::span< const float > as_normalised_float(const DataVariant &variant, std::vector< float > &storage)
Extract a DataVariant holding pixel data as a normalised float span.
Definition DataUtils.cpp:61
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:102
@ SPATIAL_X
Spatial X axis (images, tensors)
std::unordered_map< std::string, std::any > metadata
Associated metadata.
Definition DataIO.hpp:28

References MayaFlux::Kakshya::as_normalised_float(), MayaFlux::Yantra::DetectionSummary::boxes, MayaFlux::Yantra::DetectionSummary::components, MayaFlux::Journal::ComputeMatrix, MayaFlux::Yantra::DetectionSummary::contours, MayaFlux::Yantra::VisionAnalyzer< InputType, OutputType >::create_pipeline_output(), MayaFlux::Yantra::OperationHelper::extract_structured_native(), MayaFlux::Yantra::VisionAnalysis::frame, MayaFlux::Yantra::DetectionSummary::gradient, MayaFlux::Kinesis::Vision::VisionResult::h, h, MayaFlux::Yantra::VisionAnalysis::h, input, MayaFlux::Yantra::DetectionSummary::keypoints, MayaFlux::Yantra::VisionAnalyzer< InputType, OutputType >::m_executor, MayaFlux::Yantra::VisionAnalyzer< InputType, OutputType >::m_float_storage, MayaFlux::Yantra::VisionAnalyzer< InputType, OutputType >::m_sequence, MayaFlux::Yantra::Datum< T >::metadata, MF_ERROR, MayaFlux::Kinesis::Vision::VisionResult::pixel_image, MayaFlux::Yantra::VisionAnalysis::pixel_image, MayaFlux::Kinesis::Vision::VisionExecutor::run(), MayaFlux::Kakshya::DataDimension::SPATIAL_X, MayaFlux::Kakshya::DataDimension::SPATIAL_Y, MayaFlux::Yantra::UniversalAnalyzer< InputType, OutputType >::store_current_analysis(), MayaFlux::Kinesis::Vision::VisionResult::structured, MayaFlux::Yantra::DetectionSummary::tracks, MayaFlux::Kinesis::Vision::VisionResult::w, MayaFlux::Yantra::VisionAnalysis::w, and MayaFlux::Journal::Yantra.

+ Here is the call graph for this function: