Сортировать координаты сверху вниз слева направо

Я извлек 110 координат из контуров светодиодного массива 10×11, используя C ++ и OpenCV, и сохранил их в векторе. Теперь я хочу отсортировать их слева направо, чтобы определить, включен ли светодиод в определенной строке и столбце. Я предварительно отсортировал координаты по y-позиции, чтобы убедиться, что первые 10 координат в векторе, представляющем первую строку светодиодов в моем изображении.

vector<Point2f> centers;

bool compareY(Point2f p1, Point2f p2){
if(p1.y < p2.y) return true;
if(p1.y > p2.y) return false;
}

sort(centers.begin(), centers.end(), compareY);

Теперь я должен отсортировать их по x-позиции. Проблема заключается в том, что положение х от первого светодиода во втором ряду или в любом другом ряду может быть немного меньше, чем у первого светодиода в первом ряду. В связи с этим их необходимо сортировать из центров [0] в центры [9], из центров [10] в центры [20] … ряд за рядом. Кто-нибудь знает, как это сделать?

Заранее спасибо!

РЕДАКТИРОВАТЬ: удалось отсортировать точки, но мой алгоритм, основанный на обнаружении контуров, не достаточно надежен, чтобы обнаружить все светодиоды. У кого-нибудь есть идея для надежного метода их обнаружения?

1

Решение

Если вы хотите выполнить лексикографическую сортировку по координате Y, а затем по координате X, вам просто нужно предоставить подходящую функцию сравнения, которая действительно реализует строгое слабое упорядочение с использованием. Например

#include <tuple>

bool compareYX(const Point2f& p1, const Point2f& p2)
{
return std::tie(p1.y, p1.x) < std::tie(p2.y, p2.x);
}

Вы также можете выполнить лексикографическое сравнение вручную, но это довольно подвержено ошибкам.

7

Другие решения


По вопросам рекламы [email protected]