核心图像CIPerspectiveTransform过滤器:如何使用CIVectors?

Ken*_*rty 1 image-processing objective-c core-image ios

我很难在网上找到任何文档,清楚地解释了如何正确实现Core Image的CIPerspectiveTransform过滤器.尤其是,对于设置CIVector值时inputTopLeft,inputTopRight,inputBottomRight,和inputBottomLeft,什么是这些向量做的形象呢?(即,这些矢量如何扭曲我的图像背后的数学是什么?)

目前这是我正在使用的代码.它不会崩溃,但它不会显示图像:

CIImage *myCIImage = [[CIImage alloc] initWithImage:self.image];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPerspectiveTransform" keysAndValues:@"inputImage", myCIImage, @"inputTopLeft", [CIVector vectorWithX:118 Y:484], @"inputTopRight", [CIVector vectorWithX:646 Y:507], @"inputBottomRight", [CIVector vectorWithX:548 Y:140], @"inputBottomLeft", [CIVector vectorWithX:155 Y:153], nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *transformedImage = [UIImage imageWithCGImage:cgimg];
[self setImage:transformedImage];
CGImageRelease(cgimg);
Run Code Online (Sandbox Code Playgroud)

其他需要注意的事项可能很重要:

  • 我的UIImageView(75pts x 115 pts)已经通过awakeFromNib初始化,并且已经有一个与之关联的图像(151px x 235px).

  • 上面的代码正在UIImageView的- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event函数中实现.我希望能够根据屏幕坐标调整图像的视角,使其看起来像是在3D空间中移动.

  • 此代码适用于iPhone应用程序.

同样,我认为我问的问题是各种参数向量的作用,但我可能会问错误的问题.

以下帖子非常相似,但是询问为什么他的图像会消失而不是如何使用CIVectors进行CIPerspectiveTransform.它也很少受到牵引,也许是因为它过于笼统: 我如何使用CIPerspectiveTransform过滤器

Bra*_*son 6

正如我对链接问题所评论的那样,从iOS 5.1开始,Core Image的iOS实现中没有 CIPerspectiveTransform .这就是为什么你和其他提问者没有看到任何图像的原因,因为很可能你的CIFilter是零.

如果你只是想在图像上实现一种透视形式,那么在iOS上有两种不同的快速方式,正如我在这个答案中描述的那样.一种是在UIImageView的图层上简单地使用正确的CATransform3D,但这仅适用于显示,而不适用于图像调整.

第二种方法是在OpenGL ES中使用适当的3-D变换矩阵来操纵图像.正如我在上面链接的答案中指出的那样,我有一个包装所有这些的开源框架,而FilterShowcase示例中有一个将透视应用于传入视频的示例.您可以轻松地将视频输入与图像交换,并在应用透视效果后从中获取图像.