Как отфильтровать похожие круги в векторе на C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Как отфильтровать похожие круги в векторе на C++

Сообщение Гость »

Я работаю над проектом компьютерного зрения на C++. У меня есть вектор кругов, который я обрабатываю.
Мой текущий подход таков:
Инициируется цикл, который продолжается до тех пор, пока во allCircles остаются круги.
В начале каждой итерации первый круг в allCircles принимается в качестве опорного круга (initialCircle).
Этот круг будет использоваться для сравнения со всеми другими кругами, чтобы проверить, соответствуют ли они критериям группировки на основе близости.
Этот опорный круг затем добавляется в tmpcircles, который будет содержать все круги, которые считаются принадлежащими к той же группе, что и опорный круг для текущей итерации.
Опорный круг удаляется из allCircles, поскольку он теперь обрабатывается.
Второй цикл перебирает оставшиеся круги во всех кругах.
Для каждого круга вычисляет расстояние до опорного круга.
Если расстояние между Центр круга и центр опорного круга меньше определенного порога, считается, что этот круг находится недалеко от опорного круга.
Круги, находящиеся в пределах этого порога расстояния, добавляются в tmpcircles и удаляются из allCircles, указывая на то, что они находятся в пределах этого порогового значения расстояния. были обработаны и сгруппированы.
После сравнения опорного круга со всеми остальными, если tmpcircles содержит более одного круга (концентричность), это означает, что группа была сформирована.
Этот процесс повторяется, принимая следующий круг в allCircles в качестве нового опорного круга, пока в allCircles не останется кругов.
В результате могут получиться действительно похожие круги, как вы можете видеть на изображениях ниже, вот почему Я подумал ввести еще одно условие рядом с расстоянием, чтобы отфильтровать эти круги, если они есть, прежде чем добавлять круг в группу, и исключить тот из похожих кругов, который находится ближе к центру опорного круга или если они имеют один и тот же центр, тогда оставьте вариант с большим радиусом, но я не смог придумать, как это сделать наиболее эффективно.

Код: Выделить всё

struct Circle {
cv::Point2f Center;
double Radius;
};

Код: Выделить всё

std::vector allCircles; // contains all circles to be filtered
std::vector tmpcircles;
std::vector circles;

while (!allCircles.empty()) {
tmpcircles.clear();

// Take the first circle from allCircles and use it as a reference
Circle initialCircle = allCircles.front();
tmpcircles.push_back(initialCircle); // Add it to tmpcircles
allCircles.erase(allCircles.begin()); // Remove the initial circle from allCircles

auto it = allCircles.begin();
while (it != allCircles.end()) {

double dist = std::pow(it->Center.x - initialCircle.Center.x, 2) +
std::pow(it->Center.y - initialCircle.Center.y, 2);

if (dist < 10) {
tmpcircles.push_back(*it);
it = allCircles.erase(it); // Remove the circle from allCircles and move to next
} else {
++it; // Move to next circle
}
}

if (tmpcircles.size() > 1) {
circles.insert(circles.end(), tmpcircles.begin(), tmpcircles.end());
}
}
Пример:

Код: Выделить всё

Input:
[ Center: 1034,1136, Radius: 595.683]
[ Center: 1039,1137, Radius: 594.781]
[ Center: 1039,1137, Radius: 137.478]
[ Center: 1039,1137, Radius: 136.571]
[ Center: 1039,1137, Radius: 92.1536]
[ Center: 1039,1137, Radius: 91.2505]
[ Center: 1039,1137, Radius: 1280.59]
[ Center: 1034,1135, Radius: 1276.93]

expected output for a group:
[ Center: 1039,1137, Radius: 594.781]
[ Center: 1039,1137, Radius: 137.478]
[ Center: 1039,1137, Radius: 92.1536]
[ Center: 1039,1137, Radius: 1280.59]

Визуализация:
Одна группа:
[img]https://i. stack.imgur.com/BXdDJ.png[/img]

Несколько групп выглядят так:
[img]https://i .stack.imgur.com/Lspjo.png[/img]
Каким будет наиболее оптимизированный или эффективный способ реализовать критерии разницы размеров рядом с проверкой расстояния для относительно больших (~ 150) наборов данных кругов?
Будем очень признательны за любые предложения или примеры кода.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ector-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»