0

我想达到与 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,sensitivityblurSizevalues 。

这是新代码:

- (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

4

0 回答 0