TrackObjects and EstimateMotion share one sequence. Images that hold their own op's output at the end of each sequence:
The result stays valid however long it is held. Its images are rewritten in place when that sequence runs again.
99{
101
102 const auto analyzer_op =
analyzer();
103 const auto results = analyzer_op->get_shared_results();
105 const size_t lanes = std::min(
results->size(), resolved.size());
106
107 for (size_t lane = 0; lane < lanes; ++lane) {
108 const auto& steps = resolved[lane].sequence.steps;
109 const auto has = [&steps](
VisionOp op) {
110 return std::ranges::any_of(steps, [op](const auto& step) { return step.op == op; });
111 };
112
113 bool serves = false;
114 switch (intent) {
115 case VisionIntent::FindElements:
116 serves = has(VisionOp::ConnectedComponents);
117 break;
118 case VisionIntent::TrackObjects:
119 serves = has(VisionOp::TrackKeypoints);
120 break;
121 case VisionIntent::DetectFeatures:
122 serves = has(VisionOp::HarrisResponse) && !has(VisionOp::TrackKeypoints);
123 break;
124 case VisionIntent::DetectEdges:
125 serves = has(VisionOp::Canny);
126 break;
127 case VisionIntent::EstimateMotion:
128 serves = has(VisionOp::OpticalFlowDense);
129 break;
130 case VisionIntent::MeasureAppearance:
131 serves = has(VisionOp::Sobel);
132 break;
133 default:
134 break;
135 }
136
137 if (serves)
138 return {
results, &(*results)[lane] };
139 }
140
141 return nullptr;
142}
const std::vector< Kinesis::Vision::VisionResult > & results()
The VisionResult of every sequence the analyzer's last completed analysis ran, with each step's image...
std::shared_ptr< VisionAnalyzer > analyzer()
The matrix's "analyze" operation.
VisionOp
Named operations available in a VisionSequence.
std::vector< ResolvedSequence > resolve(const VisionQuery &query)
Resolve a VisionQuery into the ResolvedSequences needed to satisfy every active intent.