【问题标题】:Swift5: obtain brightness/light level from the cameraSwift5:从相机获取亮度/亮度级别
【发布时间】:2022-01-11 14:50:54
【问题描述】:

我有这段代码,它是 AVCaptureMetadataOutputObjectsDelegate 的扩展:

internal func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        guard let captureSession = captureSession else { return }
        captureSession.stopRunning()
        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let stringValue = readableObject.stringValue else { return }
            AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            found(code: stringValue)
        }
    }

当它“查看”一个二维码时被调用:

let metadataOutput = AVCaptureMetadataOutput()
        
        if (captureSession.canAddOutput(metadataOutput)) {
            captureSession.addOutput(metadataOutput)
            metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            metadataOutput.metadataObjectTypes = [.qr]

我想做的是增加一个新功能,就是一打开摄像头就知道后置摄像头的亮度是多少。

我发现他们到处都在使用这个:

func captureOutput(_ output: AVCaptureOutput, 
                  didOutput sampleBuffer: CMSampleBuffer, 
                       from connection: AVCaptureConnection)

但在我看来,它已经不在 AvFoundation 中了。

【问题讨论】:

  • 您提到的最后一种方法来自AVCaptureVideoDataOutputSampleBufferDelegate,效果很好。使用myVideoOutput.setSampleBufferDelegate(...
  • miVideoOutput 在我的情况下是什么?我只有这个:captureSession = AVCaptureSession() let videoInput: AVCaptureDeviceInputlet metadataOutput = AVCaptureMetadataOutput()

标签: swift camera qr-code


【解决方案1】:

我假设您提到的相机的“亮度”是某种光度指标。我知道几种测量方法。

我想,你的代码中一定已经定义了一个 videoDevice:let videoDevice: AVCaptureDevice。如果不单独存放,请从videoInput.videoDevice获取。

  • 检查videoDevice.iso。值越低 - 照明条件越亮。它是一个 KVO 属性,因此您可以实时观察它的变化。

  • 检查videoDevice.exposureDuration。相同:值越低→光照条件越亮。曝光持续时间基本上是 iOS 系统相机为获得更好的夜间模式拍摄而调整的时间。

  • 正如您所提到的,您还可以从相机获取实时像素缓冲区进行分析。喜欢构建直方图并将亮像素与暗像素进行比较等。

在你的相机类中:

/// You already have the session
private let session = AVCaptureSession()

/// Define a video output (probably you did that already, 
/// otherwise how would your camera scan QRs at all)
private let videoOutput = AVCaptureVideoDataOutput()

/// Define a queue for sample buffer
private let videoSampleBufferQueue = DispatchQueue(label: "videoSampleBufferQueue")

然后将输出添加到会话中:

if session.canAddOutput(videoOutput){
    session.addOutput(videoOutput)
}
videoOutput.setSampleBufferDelegate(self, queue: videoSampleBufferQueue)

并实现AVCaptureVideoDataOutputSampleBufferDelegate

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    // Handle the pixelBuffer the way you like
}

【讨论】:

  • 太棒了!我已经收到了,非常感谢。只需要你编辑一点,在第二个代码块中它写着output,它应该写成videoOutput
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-01-14
  • 2019-11-28
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多