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

◆ reduce_tracks()

Kinesis::Vision::TrackObjectsAnalysis MayaFlux::Yantra::VisionAnalyzer::reduce_tracks ( const std::vector< Kinesis::Vision::TrackResult > &  tracks,
uint32_t  w,
uint32_t  h 
)
private

Dispatch track_reduce.comp over tracks and fill centroid/velocity/bounds/mean_speed_px/age stats on the result.

No-op (default fields) when tracks is empty.

Definition at line 91 of file VisionAnalyzer.cpp.

93{
94 Kinesis::Vision::TrackObjectsAnalysis result;
95 result.tracks = tracks;
96
97 if (tracks.empty())
98 return result;
99
100 std::vector<float> track_data;
101 track_data.reserve(tracks.size() * 4);
102 std::vector<float> extra_data;
103 extra_data.reserve(tracks.size() * 2);
104 for (const auto& t : tracks) {
105 track_data.push_back(t.position.x);
106 track_data.push_back(t.position.y);
107 track_data.push_back(t.previous.x);
108 track_data.push_back(t.previous.y);
109 extra_data.push_back(static_cast<float>(t.age));
110 extra_data.push_back(t.tracked ? 1.0F : 0.0F);
111 }
112
113 if (!m_track_reducer) {
114 m_track_reducer = std::make_shared<ShaderExecutionContext<>>(
116 .shader_path = "track_reduce.comp.spv",
117 .workgroup_size = { 256, 1, 1 },
118 .push_constant_size = sizeof(TrackReducePC) });
119 }
120
121 m_track_reducer->input(0, track_data)
122 .output(1, 3 * sizeof(glm::vec4))
123 .input(2, extra_data)
124 .push(TrackReducePC { .count = static_cast<uint32_t>(tracks.size()) });
125
126 const auto output = m_track_reducer->execute(Datum<std::vector<Kakshya::DataVariant>> {}, ExecutionContext {});
127 const auto raw = ShaderExecutionContext<>::read_output<float>(output, 1);
128
129 if (raw.size() >= 12) {
130 const auto n = static_cast<float>(tracks.size());
131 result.centroid = { raw[0] / n, raw[1] / n };
132 result.velocity = { raw[2] / n, raw[3] / n };
133 result.bounds = {
134 .x = raw[4],
135 .y = raw[5],
136 .w = raw[6] - raw[4],
137 .h = raw[7] - raw[5],
138 };
139 result.mean_speed_px = glm::length(glm::vec2 {
140 result.velocity.x * static_cast<float>(w),
141 result.velocity.y * static_cast<float>(h) });
142 result.mean_age = raw[8] / n;
143 result.max_age = static_cast<uint32_t>(std::lround(raw[9]));
144 result.tracked_count = static_cast<uint32_t>(std::lround(raw[10]));
145 result.lost_count = static_cast<uint32_t>(tracks.size()) - result.tracked_count;
146 }
147
148 return result;
149}
Core::GlobalInputConfig input
Definition Config.cpp:42
uint32_t h
Definition InkPress.cpp:29
std::shared_ptr< ShaderExecutionContext<> > m_track_reducer
Portal::Graphics::GpuComputeConfig GpuComputeConfig

References MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::bounds, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::centroid, h, input, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::lost_count, m_track_reducer, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::max_age, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::mean_age, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::mean_speed_px, MayaFlux::Portal::Graphics::GpuComputeConfig::shader_path, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::tracked_count, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::tracks, MayaFlux::Kinesis::Vision::TrackObjectsAnalysis::velocity, and MayaFlux::Kinesis::Vision::BoundingBox::x.

Referenced by assemble().

+ Here is the caller graph for this function: