12

我被困在我的应用程序功能中。我想要类似于 Cam Scanner Cropping 的裁剪功能。CAM-SCANNER 的屏幕是: 我已经创建了类似的裁剪视图。

在此处输入图像描述

在此处输入图像描述

我已经获得了四个角的 CGPoint。但是我怎样才能获得倾斜的裁剪图像。

如果可能的话,请给我一些建议。

4

3 回答 3

5

这是一个透视变换问题。在这种情况下,他们在 2D 平面上绘制 3D 投影。

因为,第一张图像具有四边形的选择角,当您将其转换为矩形时,您将需要添加更多像素信息(插值)或删除一些像素。

所以现在实际的问题是向裁剪后的图像添加额外的像素信息并将其投影以生成第二张图像。它可以通过多种方式实现:

<> 您可以通过应用带有插值的透视变换矩阵来自己实现它。

<> 你可以使用OpenGL

<> 你可以使用OpenCV。..还有更多的方法来实现它。

我已经使用 OpenCV 解决了这个问题。OpenCV 中的以下功能将帮助您实现这一目标。

  1. cvPerspectiveTransform

  2. cvWarpPerspective

第一个函数将使用源和目标投影坐标计算变换矩阵。在您的情况下, src 数组将具有来自所有角落的 CGPoint 值。dest 将具有矩形投影点,例如 {(0,0)(200,0)(200,150)(0,150)}。

获得转换矩阵后,您需要将其传递给第二个函数。你可以访问这个线程

OpenCV 库可能没有其他替代品,但它具有很好的图像处理算法集合。

带有 opencv 库的 iOS 应用程序可在eosgarden 获得

于 2012-05-14T19:21:56.593 回答
3

我看到了两种可能性。第一个是计算倾斜图像的变换矩阵,并将其安装在视图层的 CATransform3D 属性中。

这很简单,假设您知道如何形成进行拉伸的变换矩阵。我从来没有学过如何构建拉伸或倾斜图像的变换矩阵,所以我帮不上什么忙。我建议谷歌搜索转换矩阵和拉伸/倾斜。

另一种方法是将要裁剪的图像部分转换为 OpenGL 纹理并将纹理映射到输出。实际的纹理绘制部分会很容易,但是要完成大约 1000 公斤的 OpenGL 设置,并且要学习很多东西才能完成任何事情。如果你想走这条路,我建议使用新的 iOS 5 GLKit 搜索简单的 2D 纹理示例。

于 2012-05-08T00:18:42.397 回答
0

使用链接中给出的代码:http ://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/

而不是使用 CGRect 和 CGContextClipToRect 尝试使用 CGContextEOClip 或 CGContextClosePath

虽然我没有尝试过这个......但我已经尝试在 TouchesBegan 和 TouchesMoved 和 TouchesEnd 事件上使用 CGContextClosePath 绘制封闭路径。

希望这可以让您更深入地了解您的问题...

于 2012-05-15T17:12:41.097 回答