Pure virtual analysis implementation - derived classes implement this.
172 {
173 try {
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;
187 for (const auto& dim : structure_info.dimensions) {
189 w = static_cast<uint32_t>(dim.size);
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);
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());
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
229
230 VisionAnalysis analysis;
231 if (const auto* v = std::get_if<std::vector<float>>(&vr.pixel_image))
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
255
257
258 } catch (const std::exception& e) {
260 "VisionAnalyzer: {}", e.what());
263 err.metadata["error"] = std::string(e.what());
264 return err;
265 }
266 }
#define MF_ERROR(comp, ctx,...)
Core::GlobalInputConfig input
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
Datum< InputType > input_type
output_type create_pipeline_output(const input_type &input, const Kinesis::Vision::VisionResult &vr, const DataStructureInfo &info)
Kinesis::Vision::VisionExecutor m_executor
std::vector< float > m_float_storage
Kinesis::Vision::VisionSequence m_sequence
Datum< OutputType > output_type
@ 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.
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.
@ SPATIAL_Y
Spatial Y axis.
@ SPATIAL_X
Spatial X axis (images, tensors)
Kakshya::DataVariant pixel_image
std::unordered_map< std::string, std::any > metadata
Associated metadata.