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

◆ run()

VisionResult MayaFlux::Kinesis::Vision::VisionExecutor::run ( const VisionSequence &  sequence,
std::span< const float >  frame,
uint32_t  w,
uint32_t  h 
)

Execute a VisionSequence on one frame.

Parameters
sequenceOrdered steps to execute.
frameNormalised float input. RGBA (4 floats/pixel) for RgbaToGray/RgbaToHsv; single-channel otherwise.
wFrame width in pixels.
hFrame height in pixels.
Returns
VisionResult with pixel_image (DataVariant) and/or structured output.

Definition at line 156 of file VisionExecutor.cpp.

160{
161 ensure_slots(w, h);
162 const size_t slot_min = static_cast<size_t>(m_slot_w) * m_slot_h * 4;
163 if (slot_vec(k_slot_nxt).size() < slot_min)
164 slot_vec(k_slot_nxt).resize(slot_min);
165 if (slot_vec(k_slot_cur).capacity() < slot_min)
166 slot_vec(k_slot_cur).reserve(slot_min);
167
168 auto& cur_vec = slot_vec(k_slot_cur);
169 cur_vec.assign(frame.begin(), frame.end());
170
171 m_pass.begin(sequence, w, h);
173
174 size_t nxt = k_slot_nxt;
175 auto en = static_cast<Eigen::Index>(m_pass.plane_size());
176 const bool wants_tracking = tracks_keypoints(sequence);
177 std::vector<Keypoint> current_keypoints;
178
179 for (m_pass.index = 0; m_pass.index < sequence.steps.size(); ++m_pass.index) {
180 const auto& step = m_pass.step();
181
182 switch (step.op) {
184 uint32_t new_w = 0, new_h = 0;
185 downsample_2x(slot_vec(m_pass.current), slot_vec(nxt), w, h, m_pass.channels, new_w, new_h);
186 w = new_w;
187 h = new_h;
189 en = static_cast<Eigen::Index>(m_pass.plane_size());
190 std::swap(m_pass.current, nxt);
191 m_pass.result.structured = std::monostate {};
192 break;
193 }
194
197 m_pass.channels = 1;
198 std::swap(m_pass.current, nxt);
199
200 if (wants_tracking) {
203 }
204
205 m_pass.result.structured = std::monostate {};
206 break;
207 }
208
209 case VisionOp::RgbaToHsv: {
211 m_pass.channels = 3;
212 std::swap(m_pass.current, nxt);
213 m_pass.result.structured = std::monostate {};
214 break;
215 }
216
219 m_pass.channels = 4;
220 std::swap(m_pass.current, nxt);
221 m_pass.result.structured = std::monostate {};
222 break;
223 }
224
225 case VisionOp::Threshold: {
226 const auto& p = get_params<ThresholdParams>(step.params, step.op);
227 slot_map_mut(m_pass.current, en) = (slot_map(m_pass.current, en) >= p.value).cast<float>();
228 m_pass.result.structured = std::monostate {};
229 break;
230 }
231
233 const auto& p = get_params<ThresholdAdaptiveParams>(step.params, step.op);
234 threshold_adaptive(slot_vec(m_pass.current), slot_vec(nxt), w, h, p.block_size, p.offset);
235 std::swap(m_pass.current, nxt);
236 m_pass.result.structured = std::monostate {};
237 break;
238 }
239
241 const size_t n = m_pass.plane_size();
243 std::span<const float>(slot_vec(m_pass.current)).first(n),
244 std::span<float>(slot_vec(nxt)).first(n));
245 std::swap(m_pass.current, nxt);
246 m_pass.result.structured = std::monostate {};
247 break;
248 }
249
251 auto m = slot_map_mut(m_pass.current, en);
252 const float mn = m.minCoeff();
253 const float mx = m.maxCoeff();
254 if (mx > mn)
255 m = (m - mn) / (mx - mn);
256 m_pass.result.structured = std::monostate {};
257 break;
258 }
259
261 const auto& p = get_params<NormalizeRangeParams>(step.params, step.op);
262 if (p.hi > p.lo) {
263 auto m = slot_map_mut(m_pass.current, en);
264 m = ((m - p.lo) / (p.hi - p.lo)).max(0.0F).min(1.0F);
265 }
266 m_pass.result.structured = std::monostate {};
267 break;
268 }
269
271 const auto& p = get_params<GaussianBlurParams>(step.params, step.op);
272 const auto& kern = gaussian_kernel(p.sigma);
274 std::swap(m_pass.current, nxt);
275 m_pass.result.structured = std::monostate {};
276 break;
277 }
278
280 const auto& p = get_params<FilterSeparableParams>(step.params, step.op);
281 filter_separable(slot_vec(m_pass.current), slot_vec(k_slot_tmp), slot_vec(nxt), w, h, p.kernel_x, p.kernel_y);
282 std::swap(m_pass.current, nxt);
283 m_pass.result.structured = std::monostate {};
284 break;
285 }
286
287 case VisionOp::Sobel: {
288 GradientResult grad;
290 slot_vec(k_slot_tmp), w, h);
291
292 auto dx = slot_map(k_slot_dx, en);
293 auto dy = slot_map(k_slot_dy, en);
294 slot_map_mut(nxt, en) = (dx.square() + dy.square()).sqrt();
295 const float peak = slot_map(nxt, en).maxCoeff();
296
297 if (peak > 0.0F)
298 slot_map_mut(nxt, en) /= peak;
299
300 grad.dx.assign(slot_vec(k_slot_dx).begin(), slot_vec(k_slot_dx).begin() + en);
301 grad.dy.assign(slot_vec(k_slot_dy).begin(), slot_vec(k_slot_dy).begin() + en);
302 grad.magnitude.assign(slot_vec(nxt).begin(), slot_vec(nxt).begin() + en);
303 grad.angle.resize(static_cast<size_t>(en));
304
305 std::transform(std::execution::par_unseq,
306 slot_vec(k_slot_dx).begin(), slot_vec(k_slot_dx).begin() + en,
307 slot_vec(k_slot_dy).begin(), grad.angle.begin(),
308 [](float gx, float gy) { return std::atan2(gy, gx); });
309
310 m_pass.result.structured = std::move(grad);
311 std::swap(m_pass.current, nxt);
312 break;
313 }
314
315 case VisionOp::Scharr: {
316 GradientResult grad;
318 slot_vec(k_slot_tmp), w, h);
319
320 auto dx = slot_map(k_slot_dx, en);
321 auto dy = slot_map(k_slot_dy, en);
322 slot_map_mut(nxt, en) = (dx.square() + dy.square()).sqrt();
323
324 const float peak = slot_map(nxt, en).maxCoeff();
325 if (peak > 0.0F)
326 slot_map_mut(nxt, en) /= peak;
327
328 grad.dx.assign(slot_vec(k_slot_dx).begin(), slot_vec(k_slot_dx).begin() + en);
329 grad.dy.assign(slot_vec(k_slot_dy).begin(), slot_vec(k_slot_dy).begin() + en);
330 grad.magnitude.assign(slot_vec(nxt).begin(), slot_vec(nxt).begin() + en);
331 grad.angle.resize(static_cast<size_t>(en));
332
333 std::transform(std::execution::par_unseq,
334 slot_vec(k_slot_dx).begin(), slot_vec(k_slot_dx).begin() + en,
335 slot_vec(k_slot_dy).begin(), grad.angle.begin(),
336 [](float gx, float gy) { return std::atan2(gy, gx); });
337
338 m_pass.result.structured = std::move(grad);
339 std::swap(m_pass.current, nxt);
340 break;
341 }
342
343 case VisionOp::Canny: {
344 const auto& p = get_params<CannyParams>(step.params, step.op);
345 canny(slot_vec(m_pass.current), slot_vec(nxt), w, h, p.sigma, p.low_threshold, p.high_threshold);
346 std::swap(m_pass.current, nxt);
347 m_pass.result.structured = std::monostate {};
348 break;
349 }
350
351 case VisionOp::Erode: {
352 const auto& p = get_params<MorphParams>(step.params, step.op);
353 erode(slot_vec(m_pass.current), slot_vec(nxt), w, h, p.radius);
354 std::swap(m_pass.current, nxt);
355 m_pass.result.structured = std::monostate {};
356 break;
357 }
358
359 case VisionOp::Dilate: {
360 const auto& p = get_params<MorphParams>(step.params, step.op);
361 dilate(slot_vec(m_pass.current), slot_vec(nxt), w, h, p.radius);
362 std::swap(m_pass.current, nxt);
363 m_pass.result.structured = std::monostate {};
364 break;
365 }
366
367 case VisionOp::Open: {
368 const auto& p = get_params<MorphParams>(step.params, step.op);
369 open(slot_vec(m_pass.current), slot_vec(k_slot_tmp), slot_vec(nxt), w, h, p.radius);
370 std::swap(m_pass.current, nxt);
371 m_pass.result.structured = std::monostate {};
372 break;
373 }
374
375 case VisionOp::Close: {
376 const auto& p = get_params<MorphParams>(step.params, step.op);
377 close(slot_vec(m_pass.current), slot_vec(k_slot_tmp), slot_vec(nxt), w, h, p.radius);
378 std::swap(m_pass.current, nxt);
379 m_pass.result.structured = std::monostate {};
380 break;
381 }
382
384 const auto& p = get_params<MorphParams>(step.params, step.op);
386 std::swap(m_pass.current, nxt);
387 m_pass.result.structured = std::monostate {};
388 break;
389 }
390
392 const auto& p = get_params<ConnectedComponentsParams>(step.params, step.op);
393 const size_t n = m_pass.plane_size();
394 auto components = connected_components(
395 std::span<const float>(slot_vec(m_pass.current)).subspan(0, n),
396 w, h);
397
398 const auto* next = m_pass.ahead();
399 const bool contours_follow = next && next->op == VisionOp::FindContours;
400 if (p.with_colors) {
401 render_labels(slot_vec(m_pass.current), components.label_map);
402 m_pass.channels = 4;
404 } else if (!contours_follow) {
405 slot_vec(m_pass.current).clear();
406 m_pass.result.w = 0;
407 m_pass.result.h = 0;
408 }
409
410 if (!p.export_labels && !contours_follow)
411 components.label_map.clear();
412 m_pass.result.structured = std::move(components);
413 break;
414 }
415
417 const auto* prev = m_pass.behind();
418 if (!prev || prev->op != VisionOp::ConnectedComponents) {
420 "VisionExecutor: FindContours requires ConnectedComponents as the immediately preceding step");
421 return {};
422 }
423
424 const auto* components = std::get_if<ComponentResult>(&m_pass.result.structured);
425 if (!components) {
427 "VisionExecutor: FindContours requires a connected-component result");
428 return {};
429 }
430
431 const auto& p = get_params<FindContoursParams>(step.params, step.op);
432 auto contours = find_contours(*components, w, h,
433 p.min_area, p.max_contours, p.max_points_per_contour);
434 if (p.as_image) {
435 render_contours(slot_vec(m_pass.current), contours, w, h);
436 m_pass.channels = 4;
438 m_pass.result.structured = std::monostate {};
439 } else {
440 m_pass.result.structured = std::move(contours);
441 slot_vec(m_pass.current).clear();
442 m_pass.result.w = 0;
443 m_pass.result.h = 0;
444 }
445 break;
446 }
447
449 const auto& p = get_params<HarrisParams>(step.params, step.op);
455 slot_vec(nxt),
456 w, h, p.k, gaussian_kernel(p.sigma));
457 std::swap(m_pass.current, nxt);
458 m_pass.result.structured = std::monostate {};
459 break;
460 }
461
463 const auto& p = get_params<ExtractPeaksParams>(step.params, step.op);
464 auto kpts = extract_peaks(slot_vec(m_pass.current), w, h, p.threshold, p.nms_radius);
465 const auto* next = m_pass.ahead();
466 const bool peaks_feed_track = next && next->op == VisionOp::TrackKeypoints;
467 if (peaks_feed_track)
468 current_keypoints = kpts;
469 else
470 m_prev_keypoints = kpts;
471
472 if (wants_tracking && !peaks_feed_track)
473 std::swap(std::get<std::vector<float>>(m_prev_gray), m_curr_gray_cache);
474
475 m_pass.result.structured = std::move(kpts);
476 if (!peaks_feed_track) {
477 slot_vec(m_pass.current).clear();
478 m_pass.result.w = 0;
479 m_pass.result.h = 0;
480 }
481 break;
482 }
483
485 const auto& p = get_params<TrackKeypointsParams>(step.params, step.op);
486 const auto* prev = m_pass.behind();
487 const bool peaks_feed_track = prev && prev->op == VisionOp::ExtractPeaks;
488 const auto curr_gray = peaks_feed_track
489 ? std::span<const float>(m_curr_gray_cache)
490 : std::span<const float>(slot_vec(m_pass.current)).first(m_pass.plane_size());
491 auto& prev_vec = std::get<std::vector<float>>(m_prev_gray);
492 std::vector<TrackResult> tracked;
493 if (!prev_vec.empty() && !m_prev_keypoints.empty()) {
494 std::vector<glm::vec2> prev_pos;
495 prev_pos.reserve(m_prev_keypoints.size());
496 for (const auto& kp : m_prev_keypoints)
497 prev_pos.push_back(kp.position);
498
499 tracked = track_keypoints(
500 prev_vec, curr_gray,
501 w, h, prev_pos,
502 p.window_radius, p.max_iterations,
503 p.eigen_threshold, p.error_threshold,
504 p.forward_backward_threshold);
505 }
506
507 if (peaks_feed_track) {
508 std::swap(prev_vec, m_curr_gray_cache);
509 m_prev_keypoints = std::move(current_keypoints);
510 } else {
511 std::swap(prev_vec, slot_vec(m_pass.current));
512 }
513 m_pass.result.structured = std::move(tracked);
514 slot_vec(m_pass.current).clear();
515 m_pass.result.w = 0;
516 m_pass.result.h = 0;
517 break;
518 }
519
520 case VisionOp::Snapshot: {
521 if (slot_vec(m_pass.current).empty())
522 break;
523 const size_t n = m_pass.plane_size() * m_pass.channels;
524 SnapshotEntry entry;
525 entry.pixels.assign(slot_vec(m_pass.current).begin(), slot_vec(m_pass.current).begin() + n);
526 entry.w = w;
527 entry.h = h;
528 entry.channels = m_pass.channels;
529 m_pass.result.snapshots.push_back(std::move(entry));
530 break;
531 }
532
535 "VisionExecutor: OpticalFlowDense has no CPU implementation");
536 break;
537 }
538 }
539
540 if (!slot_vec(m_pass.current).empty())
542
544 slot_vec(m_pass.current).reserve(static_cast<size_t>(m_slot_w) * m_slot_h * 4);
545
546 VisionResult out = std::move(m_pass.result);
547 m_pass.result = VisionResult {};
548 return out;
549}
#define MF_ERROR(comp, ctx,...)
std::optional< glm::vec3 > position
Definition Decoder.cpp:93
glm::vec2 current
uint32_t h
Definition InkPress.cpp:29
glm::ivec3 max
std::vector< float > * out
std::array< Kakshya::DataVariant, k_slot_count > m_slots
Eigen::Map< Eigen::ArrayXf > slot_map_mut(size_t i, Eigen::Index n) noexcept
Zero-copy mutable Eigen::Map<ArrayXf> over slot i.
std::vector< float > & slot_vec(size_t i) noexcept
Mutable reference to the vector<float> inside slot i.
CpuVisionPass m_pass
Walk state for the current run: sequence position, geometry, working slot index, and the result under...
void ensure_slots(uint32_t w, uint32_t h)
Ensure all slots are sized to n_pixels floats.
const std::vector< float > & gaussian_kernel(float sigma)
Return a reference to the precomputed 1D Gaussian kernel for sigma.
Eigen::Map< const Eigen::ArrayXf > slot_map(size_t i, Eigen::Index n) const noexcept
Zero-copy read-only Eigen::Map<const ArrayXf> over slot i.
@ Runtime
General runtime operations (default fallback)
@ Kinesis
General mathematical and physics algorithns.
std::vector< double > peak(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Peak amplitude per window.
Definition Analysis.cpp:51
void rgba_to_gray(std::span< const float > rgba, std::span< float > dst, uint32_t w, uint32_t h)
Convert RGBA to luminance gray using BT.601 coefficients.
Definition PixelOps.cpp:18
std::vector< float > filter_separable(std::span< const float > src, uint32_t w, uint32_t h, std::span< const float > kernel_x, std::span< const float > kernel_y)
Apply a separable 2D filter via two 1D passes.
std::vector< float > canny(std::span< const float > gray, uint32_t w, uint32_t h, float sigma, float low_threshold, float high_threshold)
Canny edge detector.
Definition Gradient.cpp:130
void gray_to_rgba(std::span< const float > gray, std::span< float > dst, uint32_t w, uint32_t h)
Global threshold writing into caller-supplied buffer.
Definition PixelOps.cpp:118
std::vector< Keypoint > extract_peaks(std::span< const float > response, uint32_t w, uint32_t h, float threshold, uint32_t nms_radius)
Extract peaks from a response map via non-maximum suppression.
Definition Harris.cpp:197
void erode(std::span< const float > mask, std::span< float > dst, uint32_t w, uint32_t h, uint32_t radius)
Erosion writing into dst.
std::vector< float > harris_response(std::span< const float > gray, uint32_t w, uint32_t h, float k, float sigma)
Compute the Harris corner response map.
Definition Harris.cpp:36
ComponentResult connected_components(std::span< const float > mask, uint32_t w, uint32_t h)
Label connected foreground components in a binary mask.
void rgba_to_hsv(std::span< const float > rgba, std::span< float > dst, uint32_t w, uint32_t h)
Convert RGBA to HSV writing into caller-supplied buffer.
Definition PixelOps.cpp:94
void close(std::span< const float > mask, std::span< float > tmp, std::span< float > dst, uint32_t w, uint32_t h, uint32_t radius)
Morphological closing writing into dst.
void sobel(std::span< const float > gray, std::span< float > dx, std::span< float > dy, std::span< float > tmp, uint32_t w, uint32_t h)
Sobel gradient writing dx and dy into caller-supplied buffers.
Definition Gradient.cpp:64
std::vector< Contour > find_contours(std::span< const float > mask, uint32_t w, uint32_t h, float min_area, uint32_t max_contours, uint32_t max_points_per_contour)
Extract outer and hole contours from a binary mask.
Definition Contours.cpp:111
void dilate(std::span< const float > mask, std::span< float > dst, uint32_t w, uint32_t h, uint32_t radius)
Dilation writing into dst.
bool tracks_keypoints(const VisionSequence &seq)
True when any step tracks keypoints.
Definition VisionOp.hpp:717
void scharr(std::span< const float > gray, std::span< float > dx, std::span< float > dy, std::span< float > tmp, uint32_t w, uint32_t h)
Scharr gradient writing dx and dy into caller-supplied buffers.
Definition Gradient.cpp:97
std::vector< TrackResult > track_keypoints(std::span< const float > prev_gray, std::span< const float > curr_gray, uint32_t w, uint32_t h, std::span< const glm::vec2 > prev_points, uint32_t window_radius, uint32_t max_iterations, float eigen_threshold, float error_threshold, float forward_backward_threshold)
Track keypoints from prev_gray to curr_gray via Lucas-Kanade.
void threshold_otsu(std::span< const float > gray, std::span< float > dst)
Otsu threshold writing into caller-supplied buffer.
Definition PixelOps.cpp:279
void threshold_adaptive(std::span< const float > gray, std::span< float > dst, uint32_t w, uint32_t h, uint32_t block_size, float offset)
Adaptive threshold writing into caller-supplied buffer.
Definition PixelOps.cpp:238
void downsample_2x(std::span< const float > src, std::span< float > dst, uint32_t w, uint32_t h, uint32_t &new_w, uint32_t &new_h)
2x box-filter downsample writing into a caller-supplied buffer.
Definition PixelOps.cpp:423
void morph_gradient(std::span< const float > mask, std::span< float > tmp, std::span< float > dst, uint32_t w, uint32_t h, uint32_t radius)
Morphological gradient (dilate - erode) writing into dst.
void open(std::span< const float > mask, std::span< float > tmp, std::span< float > dst, uint32_t w, uint32_t h, uint32_t radius)
Morphological opening writing into dst.
std::shared_ptr< Vruta::Routine > sequence(std::vector< std::pair< double, std::function< void()> > > sequence, Vruta::ProcessingToken token)
Creates a temporal sequence that executes callbacks at specified time offsets.
Definition Tasks.cpp:46
void begin(const VisionSequence &seq, uint32_t width, uint32_t height)
Reset the walk band for a fresh run.
const VisionStep & step() const noexcept
const VisionStep * behind(size_t offset=1) const noexcept
Op at offset steps back, or nullptr before the start.
const VisionStep * ahead(size_t offset=1) const noexcept
Op at offset steps ahead, or nullptr past the end.
void set_geometry(uint32_t width, uint32_t height) noexcept
std::vector< SnapshotEntry > snapshots

References MayaFlux::Kinesis::Vision::VisionPass< Handle >::ahead(), MayaFlux::Kinesis::Vision::GradientResult::angle, MayaFlux::Kinesis::Vision::VisionPass< Handle >::begin(), MayaFlux::Kinesis::Vision::VisionPass< Handle >::behind(), MayaFlux::Kinesis::Vision::canny(), MayaFlux::Kinesis::Vision::Canny, MayaFlux::Kinesis::Vision::SnapshotEntry::channels, MayaFlux::Kinesis::Vision::VisionPass< Handle >::channels, MayaFlux::Kinesis::Vision::close(), MayaFlux::Kinesis::Vision::Close, MayaFlux::Kinesis::Vision::connected_components(), MayaFlux::Kinesis::Vision::ConnectedComponents, MayaFlux::Kinesis::Vision::VisionPass< Handle >::current, MayaFlux::Kinesis::Vision::dilate(), MayaFlux::Kinesis::Vision::Dilate, MayaFlux::Kinesis::Vision::Downsample2x, MayaFlux::Kinesis::Vision::downsample_2x(), MayaFlux::Kinesis::Vision::GradientResult::dx, MayaFlux::Kinesis::Vision::GradientResult::dy, ensure_slots(), MayaFlux::Kinesis::Vision::erode(), MayaFlux::Kinesis::Vision::Erode, MayaFlux::Kinesis::Vision::extract_peaks(), MayaFlux::Kinesis::Vision::ExtractPeaks, MayaFlux::Kinesis::Vision::filter_separable(), MayaFlux::Kinesis::Vision::FilterSeparable, MayaFlux::Kinesis::Vision::find_contours(), MayaFlux::Kinesis::Vision::FindContours, gaussian_kernel(), MayaFlux::Kinesis::Vision::GaussianBlur, MayaFlux::Kinesis::Vision::gray_to_rgba(), MayaFlux::Kinesis::Vision::GrayToRgba, MayaFlux::Kinesis::Vision::SnapshotEntry::h, MayaFlux::Kinesis::Vision::VisionResult::h, h, MayaFlux::Kinesis::Vision::harris_response(), MayaFlux::Kinesis::Vision::HarrisResponse, MayaFlux::Kinesis::Vision::VisionPass< Handle >::index, k_slot_cur, k_slot_dx, k_slot_dy, k_slot_ixx, k_slot_ixy, k_slot_iyy, k_slot_nxt, k_slot_sxx, k_slot_sxy, k_slot_syy, k_slot_tmp, MayaFlux::Journal::Kinesis, m_curr_gray_cache, m_pass, m_prev_gray, m_prev_keypoints, m_slot_h, m_slot_w, m_slots, MayaFlux::Kinesis::Vision::GradientResult::magnitude, max, MF_ERROR, MayaFlux::Kinesis::Vision::morph_gradient(), MayaFlux::Kinesis::Vision::MorphGradient, MayaFlux::Kinesis::Vision::NormalizeInplace, MayaFlux::Kinesis::Vision::NormalizeRange, MayaFlux::Kinesis::Vision::VisionStep::op, MayaFlux::Kinesis::Vision::open(), MayaFlux::Kinesis::Vision::Open, MayaFlux::Kinesis::Vision::OpticalFlowDense, out, MayaFlux::Kinesis::Vision::VisionResult::pixel_image, MayaFlux::Kinesis::Vision::SnapshotEntry::pixels, MayaFlux::Kinesis::Vision::VisionPass< Handle >::plane_size(), MayaFlux::Kinesis::Vision::VisionPass< Handle >::result, MayaFlux::Kinesis::Vision::rgba_to_gray(), MayaFlux::Kinesis::Vision::rgba_to_hsv(), MayaFlux::Kinesis::Vision::RgbaToGray, MayaFlux::Kinesis::Vision::RgbaToHsv, MayaFlux::Journal::Runtime, MayaFlux::Kinesis::Vision::scharr(), MayaFlux::Kinesis::Vision::Scharr, MayaFlux::Kinesis::Vision::VisionPass< Handle >::set_geometry(), slot_map(), slot_map_mut(), slot_vec(), MayaFlux::Kinesis::Vision::Snapshot, MayaFlux::Kinesis::Vision::VisionResult::snapshots, MayaFlux::Kinesis::Vision::sobel(), MayaFlux::Kinesis::Vision::Sobel, MayaFlux::Kinesis::Vision::VisionPass< Handle >::step(), MayaFlux::Kinesis::Vision::VisionResult::structured, MayaFlux::Kinesis::Vision::Threshold, MayaFlux::Kinesis::Vision::threshold_adaptive(), MayaFlux::Kinesis::Vision::threshold_otsu(), MayaFlux::Kinesis::Vision::ThresholdAdaptive, MayaFlux::Kinesis::Vision::ThresholdOtsu, MayaFlux::Kinesis::Vision::track_keypoints(), MayaFlux::Kinesis::Vision::TrackKeypoints, MayaFlux::Kinesis::Vision::tracks_keypoints(), MayaFlux::Kinesis::Vision::SnapshotEntry::w, and MayaFlux::Kinesis::Vision::VisionResult::w.

Referenced by MayaFlux::Kakshya::VisionProcessor::process(), and MayaFlux::Buffers::ImageCVProcessor< T >::processing_function().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: