Я работаю над кодом OpenCV в C ++, который в основном пытается определить граничные точки страницы в изображении. Я использую функцию findCountours (), чтобы найти контуры, и после этого я пытаюсь найти четырехугольники, используя функцию приблизительныйPolDP (), и рассматриваю только четырехугольники только с 4 точками. Мой код основан в основном на коде squares.cpp в примерах OpenCV.
Это сработало и вернуло 4 очка. И я был счастлив … но это счастье было недолгим. 🙁 Вскоре я понял, что порядок, в котором возвращаются точки, выглядит случайным (разным для разных изображений). Я хочу, чтобы алгоритм возвращал 4 точки только в определенном порядке (скажем, сверху слева, затем сверху справа). затем внизу справа и затем внизу слева.
Получение точек в одном и том же фиксированном порядке имеет решающее значение для моего приложения, и, следовательно, мой вопрос: «Есть ли способ установить порядок, в котором эти точки обнаруживаются и возвращаются алгоритмом» (код почти такой же, как квадраты. cpp пример OpenCV). Любая помощь будет по достоинству оценена.
И само собой разумеется, TIA. : D
Если pointsVector
имеет тип vector<cv::Point>
и он имеет ровно четыре координаты прямоугольника или квадрата, которые вам нужны, используйте следующий код.
struct sortY {
bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.y < pt2.y);}
} mySortY;
struct sortX {
bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.x < pt2.x);}
} mySortX;
std::sort(pointsVector.begin(),pointsVector.end(),mySortY);
std::sort(pointsVector.begin(),pointsVector.begin()+2,mySortX);
std::sort(pointsVector.begin()+2,pointsVector.end(),mySortX);
Приведенный выше код будет сортировать pointsVector
в следующем порядке: topLeft, topRight, bottomLeft, bottomRight