Перспективная коррекция UIImage из очков - PullRequest
7 голосов
/ 23 ноября 2011

Я работаю над приложением, в котором я позволю пользователю сделать снимок, например, визитной карточки или фотографии.

Затем пользователь отметит четыре угла объекта (которые он сделалкартинка выключена) - Как это видно во многих приложениях для сканирования документов / изображений / визитных карточек:

enter image description here

Мой вопрос: как мне обрезать и исправить перспективу в соответствии с этимичетыре очка?Я искал несколько дней и безуспешно просматривал несколько библиотек обработки изображений.

Кто-нибудь, кто может указать мне правильное направление?

Ответы [ 4 ]

4 голосов
/ 08 ноября 2017

В iOS8 + есть фильтр для базового образа, который называется CIPerspectiveCorrection . Все, что вам нужно сделать, это передать изображение и четыре очка. Perspective Correction

Также есть еще один фильтр, поддерживающий iOS6 +, который называется CIPerspectiveTransform , который можно использовать аналогичным образом (перекошенное изображение).

2 голосов
/ 26 ноября 2014

Я не уверен, что вы уже пробовали библиотеку Opencv, но у нее есть очень хороший способ выровнять изображение.У меня есть небольшой фрагмент кода, который принимает массив углов, например, ваши четыре угла и конечный размер для сопоставления.

Вы можете прочитать страницу руководства для warpPerspective на сайте OpenCV .

cv::Mat deskew(cv::Mat& capturedFrame, cv::Point2f source_points[], cv::Size finalSize)
{
    cv::Point2f dest_points[4];

    // Output of deskew operation has same color space as source frame, but
    // is proportional to the area the document occupied; this is to reduce
    // blur effects from a scaling component.
    cv::Mat deskewedMat = cv::Mat(finalSize, capturedFrame.type());

    cv::Size s = capturedFrame.size();

    // Deskew to full output image corners
    dest_points[0] = cv::Point2f(0,s.height); // lower left
    dest_points[1] = cv::Point2f(0,0);        // upper left
    dest_points[2] = cv::Point2f(s.width,0);  // upper right
    dest_points[3] = cv::Point2f(s.width,s.height);  // lower right

    // Build quandrangle "de-skew" transform matrix values
    cv::Mat transform = cv::getPerspectiveTransform( source_points, dest_points  );
    // Apply the deskew transform
    cv::warpPerspective( capturedFrame, deskewedMat, transform, s, cv::INTER_CUBIC );

    return deskewedMat;
}
1 голос
/ 30 января 2012

Если бы это изображение было загружено в качестве текстуры, было бы чрезвычайно просто исказить его с помощью OpenGL.Вы бы буквально просто нарисовали полноэкранный квад и использовали желтые точки коррекции в качестве координаты UV в каждой точке.

0 голосов
/ 30 января 2012

Я не знаю точное решение вашего случая, но есть подход для трапеции: http://www.comp.nus.edu.sg/~tants/tsm/TSM_recipe.html - идея состоит в том, чтобы непрерывно строить матрицу преобразования.Теоретически вы можете добавить преобразование, которое преобразует вашу форму в трапецию.

И есть много таких вопросов: https://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle, но я не проверял решения.

...