现有UIImage上的GPUImage Harrisangular点检测提供了黑屏输出

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

我现在试图让这个工作在UIImageView上的照片集,但不断得到一个黑屏作为输出。 我一直在阅读GitHub上列出的与Brad Larson的GPUImage项目有关的问题,但是他们似乎更多的是关于混合types的filter,在那里我仍然面临同样的问题。

我已经尝试改变每一行代码以遵循我所见过的各种示例,并遵循Brad示例项目中的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 ,我试过没有十字线发生器,我试过使用局部variables和声明中的variables。 h文件。 我已经尝试过和没有每个filter上的forceProcessingAtSize

我想不出其他的东西,我没有试图得到输出。 该应用程序正在Xcode 5.0.1中的iPhone 7.0上运行。 标准filter在照片上工作,例如SimpleImageFiltertesting应用程序中包含的简单GPUImageSobelEdgeDetectionFilter

有什么build议么? 我将输出保存到相机胶卷,这样我就可以检查它不只是我没有正确显示它。 我怀疑这是一个愚蠢的错误,但是对于现在还有什么其他的尝试是不知所措的。

谢谢。

编辑添加:angular落检测肯定工作,根据我设置的阈值,它返回6至511个angular落之间。

上面的问题是,你没有按正确的顺序链接filter。 Harrisangular点检测器接收input图像,find其中的angular点,并提供callback块以返回这些angular点。 GPUImageCrosshairGenerator接受这些点并创buildangular的直观表示。

你在上面的代码是image-> GPUImageCrosshairGenerator-> GPUImageHarrisCornerDetectionFilter,它不会做任何事情。

你的答案中的代码直接从图像到GPUImageHarrisCornerDetectionFilter,但是你不想使用它的图像输出。 正如您所看到的,它会生成一个图像,其中angular落由黑色背景上的白色点标识。 而是使用callback块,该callback块处理该callback块,并返回一组标准angular点坐标供您使用。

如果您需要这些图像可见,则可以使用该数组坐标并将其input到GPUImageCrosshairGenerator中以创build可见的十字准线,但该图像需要与原始图像混合才能有意义。 这就是我在FilterShowcase示例中所做的。

我似乎已经解决了问题,再次尝试不同的变化,现在返回的图像是黑色的,但在find的angular落的位置有白点。 我完全删除了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]; 

我不需要为我的应用程序添加十字准线 – 我只是想parsingangular落的位置以提供一些裁剪,但是我需要点可见来检查angular落被正确检测。 我不确定黑色的白点是否是这个滤镜的预期结果,但是我认为是这样的。

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)