我想达到与 GPUImage FilterShowcase 中的“Harris Corner detection”相同的效果,但使用 aGPUImagePicture
而不是 a GPUImageVideoCamera
。
我无法让过滤器链工作。这是我当前的代码:
-(UIImage*)addHarrisCornerToImage:(UIImage*)inputImage
{
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageHarrisCornerDetectionFilter *cornerDetectionFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[(GPUImageHarrisCornerDetectionFilter *)_filter setThreshold:0.20];
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 15.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
[(GPUImageHarrisCornerDetectionFilter *)_filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
[crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[stillImageSource addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];
[crosshairGenerator addTarget:blendFilter];
GPUImagePicture *crosshairImageSource = [[GPUImagePicture alloc] initWithImage:[crosshairGenerator imageFromCurrentlyProcessedOutput]];
[crosshairImageSource addTarget:cornerDetectionFilter];
[stillImageSource addTarget:cornerDetectionFilter];
[stillImageSource processImage];
UIImage *imageWithCorners = [cornerDetectionFilter imageFromCurrentlyProcessedOutput];
return imageWithCorners;
}
如果我使用视频源作为源,它可以正常工作,它看起来像这样:
-(void)addHarrisCorner
{
_videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
_videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(10, 150, 300, 300)];
_filter = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[(GPUImageHarrisCornerDetectionFilter *)_filter setThreshold:0.20];
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 15.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
[(GPUImageHarrisCornerDetectionFilter *)_filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
[crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[_videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];
[crosshairGenerator addTarget:blendFilter];
[blendFilter addTarget:filteredVideoView];
[_videoCamera addTarget:_filter];
[_filter addTarget:filteredVideoView];
[_videoCamera startCameraCapture];
[[self view] addSubview:filteredVideoView];
}
我真的不确定 GPUImagePicture *crosshairImageSource = [[GPUImagePicture alloc] initWithImage:[crosshairGenerator imageFromCurrentlyProcessedOutput]];
和/或是否应该[stillImageSource processImage];
在我添加的每个过滤器之后使用。
有人能指出我正确的方向吗?
谢谢
* 更新 *
通过查看 GPUImage 文件夹中的 FeatureExtractionTest,我设法让它工作了一些,但它没有找到任何角落。输出是Number of corners: 0
。我一直在玩threshold
,sensitivity
和blurSize
values 。
这是新代码:
- (void)testCornerDetectorWithPicture:(UIImage *)image
{
// GPUImagePicture *pictureInput = [[GPUImagePicture alloc] initWithImage:image];
GPUImagePicture *pictureInput = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"testCorner.png"]];
_harrisCornerFilter = [[GPUImageHarrisCornerDetectionFilter alloc] init];
_harrisCornerFilter.threshold = 0.2;
_harrisCornerFilter.sensitivity = 5.0;
_harrisCornerFilter.blurSize = 1.0;
[pictureInput removeAllTargets];
[pictureInput addTarget:_harrisCornerFilter];
__weak typeof(self) weakSelf = self;
[_harrisCornerFilter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 10.0;
[crosshairGenerator setCrosshairColorRed:1.0 green:0.0 blue:0.0];
[crosshairGenerator forceProcessingAtSize:[pictureInput outputImageSize]];
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:[pictureInput outputImageSize]];
[pictureInput addTarget:blendFilter];
[crosshairGenerator addTarget:blendFilter];
[blendFilter prepareForImageCapture];
NSLog(@"Number of corners: %d", cornersDetected);
[crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *crosshairResult = [blendFilter imageFromCurrentlyProcessedOutput];
[weakSelf useImageWithCornersWithImage:crosshairResult];
});
}];
[pictureInput processImage];
}
这是我使用的测试图像:
* 更新 2 * 这似乎是一个 iOS7 问题。设法让我的代码在 iOS6 设备上运行。将进一步调查。
* 更新 3 * 使用 iOS7 时确实是一个错误。在此处归档:https ://github.com/BradLarson/GPUImage/issues/1205