首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从点到点透视校正UIImage

从点到点透视校正UIImage
EN

Stack Overflow用户
提问于 2011-11-23 07:16:50
回答 4查看 6.3K关注 0票数 15

我正在开发一款应用程序,可以让用户拍摄一张名片或照片。

然后,用户将标记物体的四个角(他们从物体上取下一张照片)-就像在许多文档/图像/名片扫描应用程序中看到的那样:

我的问题是,我如何根据这四点裁剪和固定透视图?我已经搜索了几天,并查看了几个图像处理库,但没有任何运气。

谁能给我指个方向?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-08 19:26:50

在iOS8+中有一个名为CIPerspectiveCorrection的核心图像过滤器。您所需要做的就是传递图像和四个点。

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

票数 8
EN

Stack Overflow用户

发布于 2012-01-30 13:57:58

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-26 10:21:28

我不确定你是否已经尝试过Opencv库,但它有一个非常好的去倾斜图像的方法。我这里有一个小的代码片段,它接受一个角的数组,例如你的四个角,以及要映射到的最终大小。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8235288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档