我已成功将一个十字准线发生器和哈里斯角点检测滤镜添加到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个角落。
答案 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)