jjzjj

iOS + AV 基础。具有相同手动曝光设置的不同照片亮度

coder 2024-01-23 原文

我使用 AVFoundation 来拍照。麻烦的是,即使曝光持续时间、ISO 和白平衡的设置不变,我也会得到不同亮度的照片。手电筒、闪光灯和所有可能的稳定性都被禁用。

此问题也出现在介绍使用相机的标准 Apple 应用程序中:https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112

这是我通过这个应用程序拍摄的视频,除了在 session 初始化期间设置手动曝光外,没有任何变化:

https://www.youtube.com/watch?v=g9NOWGVeftI

请注意突然变亮,如果数码相机的曝光设置是恒定的(不,这不是设置曝光设置和调用完成处理程序的时刻;设置已经设置)。

增亮并不总是发生,但无论如何,如果我将相机移开并再次瞄准物体,可能会有明显的亮度差异。但是如果我在不移动相机的情况下拍摄一系列照片,亮度是相同的。

(当然,实物照片是在相同光线下拍摄的)

可能这种增亮是设置自定义曝光设置的一部分(因为它通常首先发生),它的后期激活是我应该加快的过程,但我不知道该怎么做。

我在 iPod Touch 5 和 iPad Air 上有这种效果。我想它也可能发生在其他 iOS 设备上。

似乎场景亮度会影响最终图像亮度(以及预览图层的亮度)。设备不只是设置给定的曝光设置;它在当前场景亮度的基础上增加了一些校正,当可见场景的普通亮度变化很大时,改变这个校正。

如果我用手合上相机,然后将手移开并拍一张照片,它会比以前没有合上相机拍摄的照片更亮。

可能不仅仅是 [仅] 亮度,还有对比度,因为当我将相机从白色显示器移开时,当屏幕外的 [相对较暗] 物体变得可见时,瞬间会变亮。

曝光目标偏移在增亮前略小于零,在增亮后略大于零。

我认为这个值是这个意外调整所基于的参数(如在自动曝光模式下)。

但是尝试通过观察目标偏移的变化和设置相等的曝光目标偏差来防止它失败,因为目标偏移一直在变化,并且工作相机不可能永久地改变它的目标偏差。

尝试通过设置曝光目标偏差强制调整,使曝光目标偏移值在捕获之前远离零,但也失败了,因为没有任何反应,我可以在尝试补偿后进行增亮。即使在自定义模式下,目标偏差也会影响曝光偏移[对客户端可见],但它似乎不会影响负责曝光的部分的设备行为。

我还发现在锁定曝光模式下没有亮度跳跃(或者我错过了它们……)。我尝试在设置自定义曝光值后设置此模式,但问题是在锁定模式下,设备不仅会修复当前曝光值,还会进行初始调整以更改曝光设置。

我在拍摄照片后从 exif 数据和 AVCaptureDevice 实例中获得的曝光值在跳转后没有改变。我尝试通过 KVO 观察曝光值,但没有任何可疑之处。当我设置自定义模式曝光持续时间和 ISO 被更改几次,然后调用完成处理程序。增亮可以稍后,但它不会影响我可以获得的当前曝光值。

这一切都令人困惑。如何提供图像亮度和曝光设置之间的直接关系?

最佳答案

修修补补后,我想出了如何轻松锁定曝光的方法。 在主相机初始化期间添加:

device.exposureMode = AVCaptureDevice.ExposureMode.custom

一旦设备被锁定以进行配置

和(非常重要)

device.exposureMode = AVCaptureDevice.ExposureMode.locked

这两者都确保:
1.您可以使用自定义设置初始化相机
2. 更改后相机保持完全锁定状态

您的相机初始化代码应如下所示:

 try device.lockForConfiguration()  
          device.exposureMode = AVCaptureDevice.ExposureMode.custom 
          device.setExposureModeCustom(duration: durationCust, iso: minISO, completionHandler: nil)
          device.setWhiteBalanceModeLocked(with: deviceGains) {
                    (timestamp:CMTime) -> Void in
            }
          device.exposureMode = AVCaptureDevice.ExposureMode.locked
            device.unlockForConfiguration()

当您想主动更改曝光参数时,不要在实际更改曝光之外将曝光重新声明为锁定或自定义。函数中的代码应如下所示:

try device.lockForConfiguration()
                 device.setExposureModeCustom(duration: durationCust, iso: minISO, completionHandler: nil)
             device.unlockForConfiguration()

我很高兴解决这个问题 - 我希望有人觉得它有用:)

关于iOS + AV 基础。具有相同手动曝光设置的不同照片亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34511431/

有关iOS + AV 基础。具有相同手动曝光设置的不同照片亮度的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  10. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

随机推荐