Аффинное преобразование, простое вращение и масштабирование или что-то еще полностью? - PullRequest
12 голосов
/ 18 октября 2011

Сценарий выглядит так: у меня есть фотография бумаги, которую я хотел бы сделать с помощью 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 с подизображением нормализованного . Я не беспокоюсь о возможном искажении изображения прямо сейчас, я просто ищу способ определить, сколько вращения нужно сделать на подизображении и как его применить и получить более прямоугольную область .

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

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

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

1 голос
/ 18 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...