GPUImage 不同的预览输出

Posted

技术标签:

【中文标题】GPUImage 不同的预览输出【英文标题】:GPUImage Different Preview to Output 【发布时间】:2013-11-29 17:06:19 【问题描述】:

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

我目前正在使用 GPUImageSobelEdgeDetectionFilter 遇到这种情况,如下所示;

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

我尝试过开启和关闭 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 对实时相机的解释与输出的照片如此不同?仅仅是因为预览的质量比最终图像低得多,因此在全分辨率图像上看起来确实不同吗?

谢谢,

(p.s. 请忽略左右图像的尺寸略有不同,我没有把它们点亮,因为我本来可以做到的)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢布拉德 - 一如既往的救世主。在晚上对这个进行了修补后,它可以完成我需要的一切并且完全有意义。再次感谢。 如何获得实时预览的大小?我在网上找不到任何东西来获得这个价值。

以上是关于GPUImage 不同的预览输出的主要内容,如果未能解决你的问题,请参考以下文章

美颜相机-GPUImage/openGL相机预览性能问题分析及优化

美颜相机-GPUImage/openGL相机预览性能问题分析及优化

美颜相机-GPUImage/openGL相机预览性能问题分析及优化

重用滤镜导致GPUImage黑屏

GPUImage过滤视频

GPUImage的filter 响应处理链 的理解笔记