Обновить

Документ в перспективе, что с ним делать? Корректировка результатов бесконтактного сканирования и фотографий документов

Время на прочтение7 мин
Охват и читатели19K
Всего голосов 37: ↑35 и ↓2+33
Комментарии13

Комментарии 13

Отличная статья. А главное практичная. Спасибо.

По поводу пропорций — почему бы не попросить пользователя указать тип документа — A4, A3 и т.д. для _более_качественного_ устранения перспективы.
Elsedar, спасибо за оценку нашей работы. В принципе, в нашей программе по сканированию есть выбор формата от А5 до А2, это ограничивает область сканирования документа, и коррекция выполняется внутри этой области (контур при этом все равно ищется внутри этой области). Кстати, размер формата не так важен, важны пропорции и ориентация документа. А у форматов А (N) пропорции одинаковые, насколько мне известно.
Действительно, пропорции одинаковые, сразу не сообразил.
А как физический размер документа может ограничивать область сканирования изображения? Ведь чем мельче объект, тем, вероятнее, его будут крупнее фотографировать.
Elsedar, если речь идет о книжном бесконтактном сканере, а я имел в виду именно софт для него в комментарии выше, то сканирующее устройство располагается всегда примерно на одной высоте, поэтому мы можем (конечно, примерно) обозначить величину зоны сканирования для конкретных форматов. В случае съемки «от руки» задание формата, конечно, не имеет смысла, только пропорции.
По началу заголовка сначала подумал, что статья о том, что будет с документами в будущем.
А так, в общем-то, и было задумано ). Многозначный заголовок.
Спасибо за статью, прочитал с интересом.
«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.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации