Подтвердить что ты не робот

Аффинное преобразование, простое вращение и масштабирование или что-то еще?

Сценарий выглядит следующим образом: у меня есть фотография бумаги, которую я хотел бы сделать с помощью OCR. Поэтому в качестве примера ввода возьмите изображение ниже:

orig_image

После успешного обнаружения области, которая соответствует бумаге, я остаюсь с vector<Point> из 4 координат, которые определяют его местоположение внутри изображения. Обратите внимание, что эти координаты, вероятно, не соответствуют идеальному прямоугольнику из-за расстояния камеры и угла при съемке. Для просмотра я подключил точки в суб-изображении, чтобы вы могли видеть, что я имею в виду:

detected_image

В этом случае точки: [1215, 43], [52, 67], [56, 869] и [1216, 884]

В этот момент мне нужно настроить эти точки, чтобы они выравнивались по горизонтали. Что я имею в виду? Если вы заметили область субизображения выше, она немного повернута: точки с правой стороны изображения расположены немного выше точек на другой стороне.

Другими словами, мы имеем изображение A, которое было преувеличено с целью выглядеть немного более искаженным/повернутым, чем реальность, а затем изображение B - вот что Я хотел бы получить окончательный результат этой процедуры:

A) bad_rect B) ok_rect

Я не уверен, что какие методы можно использовать для достижения этого преобразования. Приложение также должно автоматически определять, сколько нужно сделать, поскольку я не контролирую процедуру получения изображения.

Цель состоит в том, чтобы иметь новый Mat с нормализованным суб-изображением. Я не беспокоюсь о возможном искажении изображения прямо сейчас, я просто ищу способ определить, как много поворота должно выполняться на суб-изображении и как его применять и получить более прямоугольную область.

4b9b3361

Ответ 1

Я думаю, http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/ и http://felix.abecassis.me/2011/10/opencv-bounding-box-skew-angle/ пригодится. Вышеупомянутые должности не охватывают перспективы деформирования (только вращение). Чтобы получить наилучшие результаты, вам нужно будет использовать warpPerspective (возможно, в сочетании с getRotationMatrix2D). Используйте углы между сегментами линии, чтобы узнать, сколько вам нужно, чтобы исказить перспективу. Предполагается, что они всегда должны быть на 90 градусов и что ближайший к 90 градусам является "ближайшим" вектором в отношении перспективы.

Не забудьте нормализовать свои векторы!

Ответ 2

Он вызвал коррекцию трапецеидальности или трапецию. Он преобразует форму, которая выглядит как трапеция в прямоугольник.

Программа сканирования книг предлагает методы для исправления этого артефакта, вы можете проверить его.