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

◆ run_operation()

VisionExtractor::output_type MayaFlux::Yantra::VisionExtractor::run_operation ( const input_type &  input)
private

Definition at line 773 of file VisionExtractor.cpp.

774{
775 output_type output;
776 output.metadata = input.metadata;
777
778 const auto supplied = Kakshya::get_metadata_value<std::shared_ptr<Core::VKImage>>(input.metadata, "vision_image");
779 const bool has_image = supplied && *supplied;
780
781 if (!has_image && !input.data) {
782 output.metadata["error"] = std::string("VisionExtractor: missing container");
783 return output;
784 }
785
786 const auto analysis = Kakshya::get_metadata_value<Kinesis::Vision::VisionAnalysis>(
787 input.metadata, "vision_analysis");
788 if (!analysis) {
789 output.metadata["error"] = std::string("VisionExtractor: missing vision_analysis metadata");
790 return output;
791 }
792
793 const auto index = Kakshya::get_metadata_value<size_t>(input.metadata, "container_index").value_or(0);
794 const auto image = has_image ? *supplied : resolve_image(input.data, index);
795 if (!image) {
796 output.metadata["error"] = std::string("VisionExtractor: could not resolve image from container");
797 return output;
798 }
799
800 const uint32_t w = image->get_width();
801 const uint32_t h = image->get_height();
802
803 switch (m_mode) {
805 output.metadata["vision_extraction"] = crop(image, *analysis, m_out_w, m_out_h);
806 break;
808 output.metadata["vision_extraction"] = sample(image, *analysis, w, h);
809 break;
811 output.metadata["vision_extraction"] = patches(image, *analysis, m_patch_w, m_patch_h, w, h);
812 break;
814 output.metadata["vision_extraction"] = crops(image, *analysis, m_tile_w, m_tile_h);
815 break;
817 output.metadata["vision_extraction"] = sample_regions(image, *analysis, w, h);
818 break;
820 output.metadata["vision_extraction"] = sample_points(image, *analysis, m_sample_radius, w, h);
821 break;
823 output.metadata["vision_extraction"] = silhouettes(image, *analysis, m_tile_w, m_tile_h);
824 break;
826 output.metadata["vision_extraction"] = equalize(image, *analysis, w, h);
827 break;
829 output.metadata["vision_extraction"] = expose(image, *analysis, m_exposure_target, w, h);
830 break;
832 output.metadata["vision_extraction"] = edges(image, *analysis, w, h);
833 break;
835 output.metadata["vision_extraction"] = motion_mask(image, *analysis, w, h);
836 break;
838 output.metadata["vision_extraction"] = annotate(image, *analysis, w, h);
839 break;
841 if (const auto selected = select_element(*analysis, m_focus.value_or(ElementFocus {})))
842 output.metadata["vision_extraction"] = *selected;
843 break;
844 }
845
846 return output;
847}
Core::GlobalInputConfig input
Definition Config.cpp:42
IO::ImageData image
Definition Decoder.cpp:47
uint32_t h
Definition InkPress.cpp:29
uint32_t index
Definition VKDevice.cpp:122
std::shared_ptr< Core::VKImage > edges(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
source kept where analysis.detect_edges reaches the edge threshold, transparent elsewhere.
std::vector< glm::vec4 > sample_points(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t radius, uint32_t source_w, uint32_t source_h)
Mean over a (2 * radius + 1) squared window at every keypoint, else every track, in one dispatch,...
std::shared_ptr< Core::VKImage > resolve_image(const std::shared_ptr< Kakshya::SignalSourceContainer > &source, size_t index)
std::shared_ptr< Core::VKImage > crop(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t out_w, uint32_t out_h)
Crop of source at the focused element, or track/keypoint bounds.
std::shared_ptr< Core::VKImage > equalize(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
Histogram equalisation of source from the histogram measure_appearance measured.
Kinesis::Vision::FieldSample sample(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
Mean, min and max over the focused element or track/keypoint bounds.
std::shared_ptr< Core::VKImage > patches(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t patch_w, uint32_t patch_h, uint32_t source_w, uint32_t source_h)
One fixed-size crop per keypoint, else per track, side by side in one atlas.
std::shared_ptr< Core::VKImage > crops(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t tile_w, uint32_t tile_h)
Every find_elements box resampled to tile_w x tile_h, side by side in one atlas (tile_w * count,...
std::shared_ptr< Core::VKImage > expose(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, float target, uint32_t source_w, uint32_t source_h)
source scaled so its measured mean brightness reaches target.
std::optional< ElementFocus > m_focus
std::shared_ptr< Core::VKImage > annotate(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
source with everything the analysis found drawn on it: element boxes (yellow) and contours (cyan),...
std::vector< Kinesis::Vision::FieldSample > sample_regions(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
sample() for every find_elements box in one dispatch, in box order.
std::optional< size_t > select_element(const Kinesis::Vision::VisionAnalysis &analysis, const ElementFocus &focus)
Index into find_elements boxes of the element ranked first by focus, chosen on the GPU from the analy...
std::shared_ptr< Core::VKImage > silhouettes(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t tile_w, uint32_t tile_h)
Silhouette of every element cut from its contour polygons: the outer contour and its holes,...
std::shared_ptr< Core::VKImage > motion_mask(const std::shared_ptr< Core::VKImage > &source, const Kinesis::Vision::VisionAnalysis &analysis, uint32_t source_w, uint32_t source_h)
source kept where analysis.estimate_motion moves faster than the motion limits with enough confidence...
std::unordered_map< std::string, std::any > metadata
Associated metadata.
Definition DataIO.hpp:30

References MayaFlux::Yantra::Annotate, annotate(), MayaFlux::Yantra::Crop, crop(), MayaFlux::Yantra::Crops, crops(), MayaFlux::Yantra::Edges, edges(), MayaFlux::Yantra::Equalize, equalize(), MayaFlux::Yantra::Expose, expose(), h, image, index, input, m_exposure_target, m_focus, m_mode, m_out_h, m_out_w, m_patch_h, m_patch_w, m_sample_radius, m_tile_h, m_tile_w, MayaFlux::Yantra::Datum< T >::metadata, motion_mask(), MayaFlux::Yantra::MotionMask, MayaFlux::Yantra::Patches, patches(), resolve_image(), MayaFlux::Yantra::Sample, sample(), sample_points(), sample_regions(), MayaFlux::Yantra::SamplePoints, MayaFlux::Yantra::SampleRegions, select_element(), MayaFlux::Yantra::SelectElement, MayaFlux::Yantra::Silhouettes, and silhouettes().

Referenced by VisionExtractor().

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