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

◆ extract_implementation()

template<ComputeData InputType = std::shared_ptr<Kakshya::SignalSourceContainer>, ComputeData OutputType = std::vector<Kakshya::DataVariant>>
output_type MayaFlux::Yantra::VisionExtractor< InputType, OutputType >::extract_implementation ( const input_type input)
inlineoverrideprotectedvirtual

Pure virtual extraction implementation - derived classes implement this.

Parameters
inputInput data with metadata
Returns
Raw extraction output before scope processing

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

Definition at line 175 of file VisionExtractor.hpp.

176 {
177 const auto analysis_it = input.metadata.find("vision_analysis");
178 if (analysis_it == input.metadata.end() || !analysis_it->second.has_value()) {
179 error<std::runtime_error>(
182 std::source_location::current(),
183 "VisionExtractor: no vision_analysis in input metadata");
184 }
185
186 const auto& analysis = safe_any_cast_or_throw<VisionAnalysis>(
187 analysis_it->second);
188
189 if (analysis.pixel_image.empty()) {
190 error<std::runtime_error>(
193 std::source_location::current(),
194 "VisionExtractor: VisionAnalysis carries no pixel data");
195 }
196
197 const uint32_t w = analysis.w;
198 const uint32_t h = analysis.h;
199 const auto channels = static_cast<uint32_t>(
200 analysis.pixel_image.size() / (static_cast<size_t>(w) * h));
201
202 const auto [nx, ny, nw, nh] = compute_normalised_rect(analysis);
203
204 Kakshya::Region region = Kakshya::normalised_rect_to_region(nx, ny, nw, nh, w, h);
205
206 const auto crop_w = static_cast<uint32_t>(
207 region.end_coordinates[1] - region.start_coordinates[1] + 1);
208 const auto crop_h = static_cast<uint32_t>(
209 region.end_coordinates[0] - region.start_coordinates[0] + 1);
210
211 const uint32_t stride = w * channels;
212 const uint32_t crop_stride = crop_w * channels;
213 std::vector<float> cropped(static_cast<size_t>(crop_w) * crop_h * channels);
214
215 const float* src = analysis.pixel_image.data();
216 float* dst = cropped.data();
217
218 const auto y0 = static_cast<uint32_t>(region.start_coordinates[0]);
219 const auto x0 = static_cast<uint32_t>(region.start_coordinates[1]);
220
221 for (uint32_t row = 0; row < crop_h; ++row) {
222 std::memcpy(
223 dst + static_cast<size_t>(row * crop_stride),
224 src + (static_cast<size_t>(y0 + row) * stride) + static_cast<size_t>(x0 * channels),
225 crop_stride * sizeof(float));
226 }
227
229 const auto& contour = analysis.frame.contours[m_index];
230 const float origin_x = nx;
231 const float origin_y = ny;
232 const float scale_x = nw / static_cast<float>(crop_w);
233 const float scale_y = nh / static_cast<float>(crop_h);
235 std::span<float>(cropped),
236 crop_w, crop_h, channels,
237 contour,
238 origin_x, origin_y, scale_x, scale_y);
239 }
240
241 output_type out;
242 if constexpr (std::is_same_v<OutputType, std::vector<Kakshya::DataVariant>>) {
243 out.data = std::vector<Kakshya::DataVariant> { std::move(cropped) };
244 } else {
245 out.data = OperationHelper::reconstruct_from_double<OutputType>({}, {});
246 }
247
248 out.dimensions = { Kakshya::DataDimension::spatial_2d(crop_w, crop_h) };
249 out.modality = (channels == 1)
252 out.metadata = input.metadata;
253 out.metadata["crop_w"] = crop_w;
254 out.metadata["crop_h"] = crop_h;
255 out.metadata["vision_extractor_mode"] = static_cast<int>(m_mode);
256 out.metadata["vision_extractor_index"] = m_index;
257 return out;
258 }
Core::GlobalInputConfig input
Definition Config.cpp:38
uint32_t h
Definition InkPress.cpp:28
std::array< float, 4 > compute_normalised_rect(const VisionAnalysis &analysis) const
Compute the normalised crop rectangle for a given VisionAnalysis.
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:164
@ IMAGE_COLOR
2D RGB/RGBA image
@ IMAGE_2D
2D image (grayscale or single channel)
Region normalised_rect_to_region(float nx, float ny, float nw, float nh, uint32_t pixel_w, uint32_t pixel_h)
Convert a normalised image rectangle to a pixel-space Region.
void apply_contour_mask(std::span< float > pixels, uint32_t w, uint32_t h, uint32_t channels, const Contour &contour, float origin_x, float origin_y, float scale_x, float scale_y)
Zero all pixels in pixels that fall outside contour.
Definition Contours.cpp:211
@ CONTOUR_MASKED
Crop the tight bounding rect of a Contour; zero pixels outside polygon.
static DataDimension spatial_2d(uint64_t width, uint64_t height)
Convenience constructor for a 2D spatial dimension.
Definition NDData.cpp:85
T data
The actual computation data.
Definition DataIO.hpp:25

References MayaFlux::Kinesis::Vision::apply_contour_mask(), MayaFlux::Yantra::VisionExtractor< InputType, OutputType >::compute_normalised_rect(), MayaFlux::Journal::ComputeMatrix, MayaFlux::Yantra::CONTOUR_MASKED, MayaFlux::Yantra::Datum< T >::data, MayaFlux::Yantra::Datum< T >::dimensions, MayaFlux::Kakshya::Region::end_coordinates, h, MayaFlux::Kakshya::IMAGE_2D, MayaFlux::Kakshya::IMAGE_COLOR, input, MayaFlux::Yantra::VisionExtractor< InputType, OutputType >::m_index, MayaFlux::Yantra::VisionExtractor< InputType, OutputType >::m_mode, MayaFlux::Yantra::Datum< T >::metadata, MayaFlux::Yantra::Datum< T >::modality, MayaFlux::Kakshya::normalised_rect_to_region(), MayaFlux::Kakshya::DataDimension::spatial_2d(), MayaFlux::Kakshya::Region::start_coordinates, and MayaFlux::Journal::Yantra.

+ Here is the call graph for this function: