我正在制作一个应用程序,我会让用户拍照,例如名片或照片。
然后,用户将标记对象的四个角(他们拍摄了一张照片) - 就像在很多文档/图像/名片扫描应用中看到的那样:
我的问题是如何根据这四点来裁剪和修复视角?我一直在寻找几天,看着几个图像处理库没有任何运气。
任何一个能指出我正确方向的人?
答案 0 :(得分:4)
从iOS8 +开始,Core for Core为CIPerspectiveCorrection。您需要做的就是传递图像和四个点。
另外还有一个支持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,但我没有检查解决方案。