Pure virtual extraction implementation - derived classes implement this.
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
203
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
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
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
@ 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.
@ 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.
@ 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.
T data
The actual computation data.