GPUImage FilterShowcase の「ハリス コーナー検出」と同じ効果を実現したいのですが、 のGPUImagePicture
代わりに を使用し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
値で遊んでいます。
新しいコードは次のとおりです。
- (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];
}
そして、これは私が使用するテスト画像です:
* UPDATE 2 * これは iOS7 の問題のようです。コードを iOS6 デバイスで動作させることができました。さらに調査します。
* UPDATE 3 * iOS7 使用時のバグです。ここに提出: https://github.com/BradLarson/GPUImage/issues/1205