从点到角度对UIImage的透视校正

时间:2011-11-22 23:16:50

标签: iphone ios image-processing quartz-2d

我正在制作一个应用程序,我会让用户拍照,例如名片或照片。

然后,用户将标记对象的四个角(他们拍摄了一张照片) - 就像在很多文档/图像/名片扫描应用中看到的那样:

enter image description here

我的问题是如何根据这四点来裁剪和修复视角?我一直在寻找几天,看着几个图像处理库没有任何运气。

任何一个能指出我正确方向的人?

4 个答案:

答案 0 :(得分:4)

从iOS8 +开始,Core for Core为CIPerspectiveCorrection。您需要做的就是传递图像和四​​个点。Perspective Correction

另外还有一个支持iOS6 +的过滤器名为CIPerspectiveTransform,可以类似的方式使用(倾斜图像)。

答案 1 :(得分:2)

我不确定您是否已经尝试过Opencv库,但它有一种非常好的方法来校正图像。我在这里有一个小片段,它带有一系列角落,例如你的四个角落,以及最终尺寸来映射它。

您可以在warpPerspective上阅读OpenCV site的手册页。

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;
}

答案 2 :(得分:1)

如果将此图像作为纹理加载,则使用OpenGL将其倾斜非常简单。你只需绘制一个全屏四边形并使用黄色校正点作为每个点的UV坐标。

答案 3 :(得分:0)

我不知道你的案例的确切解决方案,但有梯形的方法:http://www.comp.nus.edu.sg/~tants/tsm/TSM_recipe.html - 我们的想法是不断建立转换矩阵。从理论上讲,您可以添加将您的形状转换为特征的转换。

还有很多这样的问题:https://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle,但我没有检查解决方案。