虽然 SiLo 的回答非常详细,但这里的具体问题由 Ross 的 cmets 在其下方回答,所以我想我会将这些扩展为完整的答案。
我最近需要这样做,以便通过 Swift 与我的 GPUImage 框架交互。对于我的 Harris 角点检测器,我在每个处理过的帧上使用了一个回调块,它提供了一个 C 数组,其中包含 X、Y 坐标对中的 OpenGL 浮点值,以及该数组的大小。我使用 C 数组来提高性能,因为这将在实时视频中每秒提供 30-60 次。在 Objective-C 中,我会使用如下代码进行设置:
UIImage *sourceImage = [UIImage imageNamed:@"ChairTest.png"];
GPUImageHarrisCornerDetector *cornerDetector = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
NSLog(@"Number of corners detected: %d", cornersDetected);
NSLog(@"Corner 1, X: %f, Y: %f", cornerArray[0], cornerArray[1]);
}];
GPUImagePicture *inputPicture = [[GPUImagePicture alloc] initWithImage:sourceImage];
[inputPicture addTarget:cornerDetector];
[inputPicture processImage];
在我破译了正确的闭包语法之后,我无法完全弄清楚如何访问输入 C 数组的值,我将角坐标交给处理块。 Sean Heber's tweet about this 指出了一种方法,我用它把上面的 Objective-C 翻译成下面的 Swift 代码:
let sourceImage = UIImage(named: "ChairTest.png")
let cornerDetector = GPUImageHarrisCornerDetectionFilter()
cornerDetector.cornersDetectedBlock = { (cornerArray:CMutablePointer<GLfloat>, cornersDetected:Int, frameTime:CMTime) in
println("Number of corners detected: \(cornersDetected)")
let corners = UnsafePointer<GLfloat>(cornerArray)
println("Corner 1, X: \(corners[0]) Y: \(corners[1])")
}
let inputPicture = GPUImagePicture(image: sourceImage)
inputPicture.addTarget(cornerDetector)
inputPicture.processImage()
这似乎在功能上是相同的。使用.withUnsafePointer() 可能更安全,但我还没有完全掌握它的语法。