GPUImage不同的预览到输出

时间:2013-11-29 17:06:19

标签: ios iphone camera gpuimage

第一次使用不同的GPUImage过滤器时,我看到奇怪的表现,其中GPUImage在实时预览和输出的照片之间显示出相当大的差异。

我目前正在使用GPUImageSobelEdgeDetectionFilter进行此操作,如下所示;

difference

在左侧,我有设备屏幕的屏幕截图,右边是输出的照片。它似乎显着降低了检测到的线条的厚度和清晰度,从而输出了非常不同的图像。

我尝试过打开和关闭SmoothlyScaleOutput,但由于我目前没有缩放图像,因此不应该影响它。

过滤器设置如此;

        filterforphoto = [[GPUImageSobelEdgeDetectionFilter alloc] init];
        [(GPUImageSobelEdgeDetectionFilter *)filterforphoto setShouldSmoothlyScaleOutput:NO];
        [stillCamera addTarget:filterforphoto];

        [filterforphoto addTarget:primaryView];
        [stillCamera startCameraCapture];

        [(GPUImageSobelEdgeDetectionFilter *)filterforphoto setEdgeStrength:1.0];

这张照片是这样的;

        [stillCamera capturePhotoAsImageProcessedUpToFilter:filterforphoto withCompletionHandler:^(UIImage *processedImage, NSError *error){

有谁知道为什么GPUImage正在解释实时相机与输出的照片有什么不同?仅仅是因为预览的质量远低于最终图像,因此在全分辨率图像上看起来会有所不同吗?

谢谢,

(请注意,请忽略左右图像上略有不同的尺寸,我没有尽可能地照亮它们)

1 个答案:

答案 0 :(得分:1)

原因确实是因为实时预览和照片之间的分辨率不同。

边缘检测滤波器(以及其他类似滤波器)工作的方式是它们立即对当前正在处理的像素两侧的像素进行采样。当您以照片的形式提供更高分辨率的输入时,这意味着边缘检测发生在图像的小得多的相对区域上。这也是为什么当应用于静态照片与实时预览时,某个像素半径的高斯模糊显得更弱的原因。

要将边缘检测锁定为某个相对大小,您可以在过滤器上手动设置texelWidthtexelHeight属性。这些值分别是目标图像的1 /宽度和1 /高度。如果您根据实时预览的大小设置这些值,则应在最终照片中看到一致的边缘大小。由于分辨率较高,一些细节可能略有不同,但它应该大致相同。