【问题标题】:AVCaptureSession is not giving a good photo quality and good resolutionAVCaptureSession 没有提供良好的照片质量和良好的分辨率
【发布时间】:2012-06-13 06:16:05
【问题描述】:

我正在与AVCaptureSession 合作拍摄图像。它工作正常 但没有给出好的解决方案。我将它与 iPhone Camera 拍摄的图像进行比较,发现 iPhone Camera Image 比AVCaptureSession 图像要好很多。

我在 stackOverflow 上看到了 3-4 个关于此的链接,但找不到任何解决方案。

我也试过所有的预设

AVCaptureSessionPresetPhoto, 
AVCaptureSessionPresetHigh, 
AVCaptureSessionPresetMedium, 
AVCaptureSessionPresetLow, 
AVCaptureSessionPreset352x288, 
AVCaptureSessionPreset640x480, 
AVCaptureSessionPreset1280x720, 
AVCaptureSessionPreset1920x1080, 
AVCaptureSessionPresetiFrame960x540, 
AVCaptureSessionPresetiFrame1280x720, 

但静止图像质量较差。如果我的问题不够清楚或遗漏了什么,请告诉我。

【问题讨论】:

  • 我建议你看看这个来自苹果的示例应用程序developer.apple.com/library/ios/#samplecode/AVCam/Listings/…
  • @AnkitSrivastava - 我已经使用此示例代码捕获了一张图像,但静止图像并不好。
  • 你为 sessionPreset.. 设置了什么值?
  • 设备上的iOS版本是什么...?
  • 为了获得最佳静止图像,sessionPreset 属性应为 AVCaptureSessionPresetPhoto..

标签: iphone objective-c ios5 camera avcapturesession


【解决方案1】:

只需在文件中添加这行代码

self.captureSession.sessionPreset = .photo

你会得到一个很棒的分辨率,就像来自苹果的集成相机应用程序一样。

【讨论】:

  • 对于 Swift 5,self.captureSession.sessionPreset = .photo.
【解决方案2】:

我们在使用该代码参考时遇到了同样的问题。使用 iPad 前置摄像头拍摄的照片尤其糟糕。

我们通过在设置捕获管理器和调用捕获图像方法之间添加 1 秒延迟来解决此问题。这对我们产生了足够大的影响,我们对结果感到满意。相机似乎需要一些时间来打开快门并执行自动对焦/白平衡默认选项。

[NSTimer scheduledTimerWithTimeInterval:1.0 
    target:self.captureManager 
    selector:@selector(captureStillImage) 
    userInfo:nil repeats:NO];

【讨论】:

  • 是的,我也试过这个,但我想我不应该担心它,因为苹果示例代码 AVCam 捕获的图像质量也很差......只有 iPhone 原装 cam 捕捉到好的图片... :-)
【解决方案3】:

当使用带有 AVCaptureStillImageOutput 的预设 AVCaptureSessionPresetPhoto 时,我能够在 iPhone 4S 上以 3268x2448 的分辨率捕捉图像,这与内置相机应用程序产生的分辨率完全相同。 iPhone 4、Retina iPad 等设备也是如此,因此如果您使用带有静止图像输入的预设,您将从-captureStillImageAsynchronouslyFromConnection:completionHandler: 返回一个样本缓冲区,即本机相机分辨率。

关于照片质量,请记住,内置相机应用程序能够通过快速获取不同曝光级别的图像来捕捉高动态范围 (HDR) 照片。我们无法通过标准的 AV Foundation API 访问它,因此我们只能得到一张处于定义曝光级别的图像。

如果您关闭 HDR,图像质量看起来与我相同。这是使用 AVCaptureStillImageOutput 捕获的照片的放大部分:

这是内置照片应用程序中的一个:

忽略由于相机方向的微小变化而导致的轻微照明差异,两种方式拍摄的图像的分辨率和保真度似乎是相同的。

我使用来自my open source GPUImage framework 的 SimplePhotoFilter 示例应用程序捕获了第一张图像,将默认的 GPUImageSketchFilter 替换为 GPUImageGammaFilter,该 GPUImageGammaFilter 没有调整任何伽玛,只是充当了一个传递。

【讨论】:

  • 感谢您的回复!!一个月前我下载了你的 GPUImage 框架,并在我的测试应用程序中使用了它,发现它很棒。我当前的应用程序支持关闭按钮上的所有方向和闪光灯,GPUImage 框架本身就是一个大项目,我只想使用它的一部分......并且无法做到这一点,我的相机视图在横向上是 359x280,所以 GPUImage 很难为我使用。 :-(
  • 是否可以设置除上述之外的任何其他预设..?
  • @VakulSaini - 只需查看 GPUImageStillCamera 和 GPUImageVideoCamera 类,您可以在其中看到我如何设置 AV Foundation 输入和捕捉照片。此代码有效,因此您自己的实现应以此为基础。我不确定您为什么要询问其他预设,因为如果您要拍照,您会想要使用 AVCaptureSessionPresetPhoto 进行最高分辨率的拍摄。其他任何东西的分辨率都会低于原生相机。
  • 嗨@BradLarson,您知道如何稳定视频的早期帧,如以下问题所述:stackoverflow.com/questions/34912050/…?我们正在捕捉视频,但如果用户快速点击,我们会从视频中提取静止图像,而不是呈现完整视频。不幸的是,静止图像最终往往会变得模糊。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2016-12-07
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多