0

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です。thresholdsensitivityおよび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

4

0 に答える 0