ну вопрос говорит сам за себя
У меня есть некоторый контур, и я хочу получить из него лучший четырехугольник
Вы должны найти подходящее значение для epsilon
с помощью метода вложенных интервалов, так как количество точек увеличивается с уменьшением epsion
, Вполне возможно, что значение 4 угловых точек не может быть достигнуто, поскольку число точек может увеличиться с 3 до 5 при определенном значении эпсилона.
Если вы хотите исключить этот случай, вам может потребоваться самостоятельно реализовать алгоритм Рамера-Дугласа-Пекера и изменить его, чтобы получить заданное количество баллов. (Кстати, вы просите «лучшие» 4 угла. Вы должны указать, что лучше всего означает. approxPolyDp()
не претендует на оптимальное решение!)
Кроме этого, я не вижу способа заставить approxPolyDP()
вернуть 4 балла.
У меня была проблема с картами с закругленными углами, где даже если я получил approxPolyDP()
чтобы вернуть только 4 точки / края, это никогда не было лучшим, потому что «углы» часто выбирались так, чтобы быть ближе к этим закругленным краям. Мое решение заключалось в увеличении числа точек, возвращаемых за углы, а затем моя проблема позволила мне относительно безопасно предположить, что четыре самых длинных найденных ребра представляли стороны. Возьмите эти четыре самых длинных ребра по порядку и найдите, где каждая пара пересекается, и у вас есть точки четырехугольника.
В качестве бонуса у вас уже есть длины, так что вы можете подавать точки на ваше перспективное преобразование в правильном порядке, чтобы оно не было сдавлено и растянуто неправильно.