现有UIImage上的GPUImage Harris Corner Detection提供黑屏输出

时间:2013-11-25 01:02:58

标签: ios objective-c gpuimage

我已成功将一个十字准线发生器和哈里斯角点检测滤镜添加到GPUImageStillCamera输出,以及来自GPUImageVideoCamera的实时视频。

我现在正试图在UIImageView上设置照片,但不断将黑屏作为输出。我一直在阅读GitHub上针对Brad Larson的GPUImage项目列出的问题,但它们似乎更多地与混合类型过滤器有关,并且遵循这些建议我仍然面临同样的问题。

我尝试更改每行代码以遵循我看到的各种示例,并在Filter演示项目中遵循Brad的示例代码,但结果始终相同。

我目前的代码是,一旦我拍了照片(我检查以确保它不仅仅是一张黑色照片):

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:self.photoView.image];

GPUImageHarrisCornerDetectionFilter *cornerFilter1 = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[cornerFilter1 setThreshold:0.1f];
[cornerFilter1 forceProcessingAtSize:self.photoView.frame.size];

GPUImageCrosshairGenerator *crossGen = [[GPUImageCrosshairGenerator alloc] init];
crossGen.crosshairWidth = 15.0;
[crossGen forceProcessingAtSize:self.photoView.frame.size];

[cornerFilter1 setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime, BOOL endUpdating)
{
    [crossGen renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];


[stillImageSource addTarget:crossGen];
[crossGen addTarget:cornerFilter1];

[crossGen prepareForImageCapture];
[stillImageSource processImage];

UIImage *currentFilteredImage = [crossGen imageFromCurrentlyProcessedOutput];
UIImageWriteToSavedPhotosAlbum(currentFilteredImage, nil, nil, nil);
[self.photoView setImage:currentFilteredImage];

我在两个过滤器上都尝试了prepareForImageCapture,两者都没有,按相反的顺序添加两个目标,在任一过滤器上调用imageFromCurrentlyProcessedOutput,我已经尝试过没有十字准线发生器,我'尝试使用.h文件中声明的局部变量和变量。我已尝试在每个过滤器上使用和不使用forceProcessingAtSize

我无法想到其他任何我没有尝试过输出的东西。该应用程序在Xcode 5.0.1的iPhone 7.0上运行。标准过滤器适用于照片,例如GPUImageSobelEdgeDetectionFilter测试应用中包含的简单SimpleImageFilter

有什么建议吗?我将输出保存到相机胶卷,所以我可以检查它不仅仅是我没有正确显示它。我怀疑这是一个愚蠢的错误,但我不知道现在还有什么可以尝试。

感谢。

编辑添加:角落检测肯定有效,因为根据我设置的阈值,它会返回6到511个角落。

3 个答案:

答案 0 :(得分:4)

上述问题是您没有按正确的顺序链接过滤器。 Harris角点检测器接收输入图像,找到其中的角点,并提供回调块以返回这些角点。 GPUImageCrosshairGenerator接收这些点并创建角点的可视化表示。

您在上面的代码中所拥有的是image-> GPUImageCrosshairGenerator-> GPUImageHarrisCornerDetectionFilter,它不会真正做任何事情。

你的答案中的代码直接从图像转到GPUImageHarrisCornerDetectionFilter,但你不想使用它的图像输出。如您所见,它会生成一个图像,其中的角由黑色背景上的白点标识。相反,使用回调块,回调块处理它并返回一个标准化角坐标数组供您使用。

如果您需要这些可见,您可以获取该坐标数组并将其提供给GPUImageCrosshairGenerator以创建可见的十字准线,但该图像需要与原始图像混合才有意义。这就是我在FilterShowcase示例中所做的。

答案 1 :(得分:0)

我似乎解决了问题,再次尝试不同的变化,现在返回的图像是黑色的,但在找到的角落的位置有白点。我完全删除了GPUImageCrosshairGenerator。这项工作的代码是:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:self.photoView.image];

GPUImageHarrisCornerDetectionFilter *cornerFilter1 = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[cornerFilter1 setThreshold:0.1f];
[cornerFilter1 forceProcessingAtSize:self.photoView.frame.size];

[stillImageSource addTarget:cornerFilter1];
[cornerFilter1 prepareForImageCapture];
[stillImageSource processImage];

UIImage *currentFilteredImage = [cornerFilter1 imageFromCurrentlyProcessedOutput];
UIImageWriteToSavedPhotosAlbum(currentFilteredImage, nil, nil, nil);
[self.photoView setImage:currentFilteredImage];

我不需要为我的应用程序添加十字准线 - 我只是想解析角落的位置以提供一些裁剪,但我需要点可见以检查角落是否被正确检测到。我不确定黑色上的白点是否是这个过滤器的预期结果,但我猜是这样的。

答案 2 :(得分:0)

更新了Swift 2的代码:

 let stillImageSource: GPUImagePicture = GPUImagePicture(image: image)
 let cornerFilter1: GPUImageHarrisCornerDetectionFilter = GPUImageHarrisCornerDetectionFilter()
 cornerFilter1.threshold = 0.1

 cornerFilter1.forceProcessingAtSize(image.size)
 stillImageSource.addTarget(cornerFilter1)
 stillImageSource.processImage()
 let tmp: UIImage = cornerFilter1.imageByFilteringImage(image)