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

◆ reduce_keypoints()

Kinesis::Vision::DetectFeaturesAnalysis MayaFlux::Yantra::VisionAnalyzer::reduce_keypoints ( const std::vector< Kinesis::Vision::Keypoint > &  keypoints)
private

Dispatch track_reduce.comp over keypoint positions (fed as their own previous, so velocity reduces to zero and is simply not surfaced) and fill centroid/bounds/mean_response on the result.

No-op (default fields) when keypoints is empty. Same shader as reduce_tracks, not a duplicate: a keypoint has no persistent identity or previous position of its own, but its bounds and centroid are the same min/max/sum reduction either way.

Definition at line 151 of file VisionAnalyzer.cpp.

153{
154 Kinesis::Vision::DetectFeaturesAnalysis result;
155 result.keypoints = keypoints;
156
157 if (keypoints.empty())
158 return result;
159
160 std::vector<float> point_data;
161 point_data.reserve(keypoints.size() * 4);
162 std::vector<float> extra_data;
163 extra_data.reserve(keypoints.size() * 2);
164 for (const auto& k : keypoints) {
165 point_data.push_back(k.position.x);
166 point_data.push_back(k.position.y);
167 point_data.push_back(k.position.x);
168 point_data.push_back(k.position.y);
169 extra_data.push_back(k.response);
170 extra_data.push_back(0.0F);
171 }
172
173 if (!m_track_reducer) {
174 m_track_reducer = std::make_shared<ShaderExecutionContext<>>(
176 .shader_path = "track_reduce.comp.spv",
177 .workgroup_size = { 256, 1, 1 },
178 .push_constant_size = sizeof(TrackReducePC) });
179 }
180
181 m_track_reducer->input(0, point_data)
182 .output(1, 3 * sizeof(glm::vec4))
183 .input(2, extra_data)
184 .push(TrackReducePC { .count = static_cast<uint32_t>(keypoints.size()) });
185
186 const auto output = m_track_reducer->execute(Datum<std::vector<Kakshya::DataVariant>> {}, ExecutionContext {});
187 const auto raw = ShaderExecutionContext<>::read_output<float>(output, 1);
188
189 if (raw.size() >= 12) {
190 const auto n = static_cast<float>(keypoints.size());
191 result.centroid = { raw[0] / n, raw[1] / n };
192 result.mean_response = raw[8] / n;
193 result.bounds = {
194 .x = raw[4],
195 .y = raw[5],
196 .w = raw[6] - raw[4],
197 .h = raw[7] - raw[5],
198 };
199 }
200
201 return result;
202}
Core::GlobalInputConfig input
Definition Config.cpp:42
std::shared_ptr< ShaderExecutionContext<> > m_track_reducer
Portal::Graphics::GpuComputeConfig GpuComputeConfig

References MayaFlux::Kinesis::Vision::DetectFeaturesAnalysis::bounds, MayaFlux::Kinesis::Vision::DetectFeaturesAnalysis::centroid, input, MayaFlux::Kinesis::Vision::DetectFeaturesAnalysis::keypoints, m_track_reducer, MayaFlux::Kinesis::Vision::DetectFeaturesAnalysis::mean_response, MayaFlux::Portal::Graphics::GpuComputeConfig::shader_path, and MayaFlux::Kinesis::Vision::BoundingBox::x.

Referenced by assemble().

+ Here is the caller graph for this function: