Always in compacted (unsorted) order; sort the returned list yourself if you need top-K-by-area order. For occasional host access, not per-frame use. Valid for one more run after the result was delivered.
491{
492 const auto& view = result.buffers.contours;
493 if (!view.meta || !view.meta->mapped_ptr || !view.points || !view.points->mapped_ptr
494 || !view.area_perim || !view.area_perim->mapped_ptr) {
495 return {};
496 }
497
498 const auto* meta = static_cast<const glm::uvec4*>(view.meta->mapped_ptr);
499 const auto*
points =
static_cast<const glm::vec2*
>(view.points->mapped_ptr);
500 const auto* area_perim = static_cast<const glm::vec2*>(view.area_perim->mapped_ptr);
501
502 const size_t meta_capacity = view.meta->size_bytes / sizeof(glm::uvec4);
503 const size_t area_capacity = view.area_perim->size_bytes / sizeof(glm::vec2);
504 const size_t points_capacity = view.points->size_bytes / sizeof(glm::vec2);
505 const auto count =
static_cast<uint32_t
>(
506 std::min<size_t>({ view.count, meta_capacity, area_capacity }));
507 const auto points_written = static_cast<uint32_t>(std::min<size_t>(view.points_written, points_capacity));
508
509 std::vector<Kinesis::Vision::Contour>
out;
511 for (uint32_t idx = 0; idx <
count; ++idx) {
512 const auto& m = meta[idx];
513 if (m.y < 3U)
514 continue;
515 if (m.x > points_written || m.y > points_written - m.x)
516 continue;
517
518 std::vector<glm::vec2> pts(
points + m.x,
points + m.x + m.y);
519 const glm::vec2 ap = area_perim[idx];
520 out.push_back({ .points = std::move(pts), .area = ap.x, .perimeter = ap.y, .parent_label = m.z, .label_id = m.w });
521 }
523}
std::vector< glm::vec2 > * points
std::vector< float > * out