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

◆ fill_elements()

std::shared_ptr< Core::VKImage > MayaFlux::Yantra::VisionExtractor::fill_elements ( const std::shared_ptr< Core::VKImage > &  source,
const Kinesis::Vision::FindElementsAnalysis &  elements,
const std::vector< size_t > &  indices,
uint32_t  tile_w,
uint32_t  tile_h 
)
private

Definition at line 399 of file VisionExtractor.cpp.

404{
405 if (indices.empty() || tile_w == 0 || tile_h == 0)
406 return nullptr;
407
408 std::vector<float> points;
409 std::vector<uint32_t> polygons;
410 std::vector<uint32_t> table;
411 table.reserve(indices.size() * 6);
412
413 for (const auto index : indices) {
414 const auto& box = elements.boxes[index];
415 const uint32_t label = box.label_id != 0 ? box.label_id : static_cast<uint32_t>(index + 1U);
416
417 const auto first_polygon = static_cast<uint32_t>(polygons.size() / 2);
418 uint32_t polygon_count = 0;
419 for (const auto& contour : elements.contours) {
420 const bool owned = contour.label_id == label || (contour.label_id == 0 && contour.parent_label == label);
421 if (!owned || contour.points.size() < 3)
422 continue;
423
424 polygons.push_back(static_cast<uint32_t>(points.size() / 2));
425 polygons.push_back(static_cast<uint32_t>(contour.points.size()));
426 for (const auto& p : contour.points)
427 points.insert(points.end(), { p.x, p.y });
428 ++polygon_count;
429 }
430
431 table.insert(table.end(), {
432 std::bit_cast<uint32_t>(box.x),
433 std::bit_cast<uint32_t>(box.y),
434 std::bit_cast<uint32_t>(box.w),
435 std::bit_cast<uint32_t>(box.h),
436 first_polygon,
437 polygon_count,
438 });
439 }
440
441 if (points.empty())
442 points.assign(2, 0.0F);
443 if (polygons.empty())
444 polygons.assign(2, 0U);
445
446 const auto count = static_cast<uint32_t>(indices.size());
447
448 auto& ctx = image_context();
449 use_shader(ctx, "contour_fill.comp.spv", k_wg_image, sizeof(AtlasPC));
450 ctx.stage_image(source);
451 ctx.set_binding_data(3, std::span<const float>(points));
452 ctx.set_binding_data(4, std::span<const uint32_t>(polygons));
453 ctx.set_binding_data(5, std::span<const uint32_t>(table));
454 ctx.set_push_constants(AtlasPC { .tile_w = tile_w, .tile_h = tile_h, .count = count });
455 return dispatch_image(ctx, tile_w * count, tile_h);
456}
uint32_t label
Definition Contours.cpp:16
std::vector< uint32_t > indices
std::vector< glm::vec2 > * points
uint32_t index
Definition VKDevice.cpp:122
size_t count
uint32_t tile_h
uint32_t tile_w
TextureExecutionContext & image_context()
The two contexts every method shares, one shader swapped in per call.

References MayaFlux::Kinesis::Vision::FindElementsAnalysis::boxes, MayaFlux::Kinesis::Vision::FindElementsAnalysis::contours, count, image_context(), index, indices, label, points, tile_h, and tile_w.

Referenced by silhouette(), and silhouettes().

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