
Комментарии 13
По поводу пропорций — почему бы не попросить пользователя указать тип документа — A4, A3 и т.д. для _более_качественного_ устранения перспективы.
«Challenge» в данном контексте = «Входные условия»
Однако, на практике я бы не рекомендовал пользоваться этим безоговорочно, поскольку очень часто можно оказаться близко к особой точке, и тогда решение будет неустойчивым (очень чувствительным к точному определению координат углов).
Можно повысить устойчивость решения, если фокусное расстояние до объекта известно (желательно в тех же единицах, что и геометрические размеры объекта, т.е. в пикселях). Для определенного типа мобильных устройств без оптического и цифрового зума фокусное расстояние до объекта (выраженное в пикселях) является константой.
Что касается фокусного расстояния, мы пока поверхностно изучили вопрос, если есть ссылка на способ перевода фокусного в дистанцию для объекта, который работает независимо от использованной оптики, будем благодарны за наводку.
Наше текущее решение работает и без этих данных, в чем, собственно, и красота, мы не привязаны к источнику получения изображения.
Отлично, как раз думал как применить OpenCV к похожей задаче.
Если есть у кого идеи как исправить искажения изображения с мятого оригинала, буду признателен.
Чуть до кватернионов не добрался. Хотел сперва по уровням областей находить края, потом делить на области и транспонировать в 3D.
Оставлю небольшой комментарий по пропорциям.
Использование параллактического смещения центра за счёт перспективы проекции, как производной для перехода от средних значений к исправленным - это хороший и сильно упростивший систему нахождения пропорций способ. Но! Все вычисления при этом: нахождение пересечения диагоналей, вектор смещения и его проекции на высоту и ширину по серединам, - приходится выполнять в координатах. Система получается громоздковата и плохочитаема. И только на последнем этапе можно перейти от координат к ширине и высоте.
Как альтернативу, предложу схему, использующую разложение общего перспективного искажения на две перпендикулярные составляющие. В простейшем случае рассматривается единичный квадрат, один из углов которого смещается либо строго вверх-вниз, либо строго вправо-влево. Такая схема позволяет производить вычисления сразу в длинах и в некотором смысле она проще:
w_min = min(w_top, w_bottom)
w_max = max(w_top, w_bottom)
w_avg = (w_min + w_max) / 2
w_d = w_max - w_min
h_min = min(h_left, h_right)
h_max = max(h_left, h_right)
h_avg = (h_min + h_max) / 2
h_d = h_max - h_min
w_max_n = sqrt(w_min * w_min + h_d * h_d)
h_max_n = sqrt(h_min * h_min + w_d * w_d)
w_d_max = w_max - w_max_n
h_d_max = h_max - h_max_n
w_d_p = h_d_max * w_avg / h_avg
h_d_p = w_d_max * h_avg / w_avg
w_p = w_avg + w_d_p
h_p = h_avg + h_d_p
p = w_p / h_p
Эта схема также является определённым упрощением, но её легко реализовать. Для случая, рассмотренного в данной статье, эта схема даст w_p = 519, h_p = 740.
Документ в перспективе, что с ним делать? Корректировка результатов бесконтактного сканирования и фотографий документов