ios - 在 iOS 上设置初始焦距

标签 ios camera focus qr-code

我正在开发一款 iOS 应用程序,其中一项功能是扫描二维码。为此,我使用了优秀的库 ZBar。扫描工作正常,通常很快。但是,当您使用较小的二维码时,扫描时间会稍长一些,这主要是因为自动对焦需要一些时间来调整。我正在试验并注意到可以使用以下代码锁定焦点:

AVCaptureDevice *cameraDevice = readerView.device;
if ([cameraDevice lockForConfiguration:nil]) {
     [cameraDevice setFocusMode:AVCaptureFocusModeLocked];
     [cameraDevice unlockForConfiguration];
}

在成功扫描后使用此代码时,接下来的扫描速度非常快。这让我想知道,我是否可以在扫描一个代码之前以某种方式锁定焦点?该应用程序只会扫描相当小的 QR 码,因此永远不需要关注远处的事物。当然,我可以实现类似点击聚焦之类的功能,但我最好避免这一额外步骤。 有没有办法做到这一点?或者在处理较小的 QR 码时是否有另一种加快处理速度的方法?

//亚历山大

最佳答案

在 iOS7 中,这现在成为可能!

Apple 已将属性 autoFocusRangeRestriction 添加到 AVCaptureDevice 类。此属性属于枚举 AVCaptureAutoFocusRangeRestriction,它具有三个不同的值:

  1. AVCaptureAutoFocusRangeRestrictionNone - 默认,无限制
  2. AVCaptureAutoFocusRangeRestrictionNear - 重要的主题靠近相机
  3. AVCaptureAutoFocusRangeRestrictionFar - 重要的主题远离相机

要检查该方法是否可用,我们应该首先检查属性 autoFocusRangeRestrictionSupported 是否为真。由于它仅在 iOS7 及更高版本中受支持,因此我们还应该使用 respondsToSelector,这样我们就不会在早期的 iO​​S 版本上出现异常。
所以生成的代码应该是这样的:

AVCaptureDevice *cameraDevice = zbarReaderView.device;
if ([cameraDevice respondsToSelector:@selector(isAutoFocusRangeRestrictionSupported)] && cameraDevice.autoFocusRangeRestrictionSupported) {
    // If we are on an iOS version that supports AutoFocusRangeRestriction and the device supports it
    // Set the focus range to "near"
    if ([cameraDevice lockForConfiguration:nil]) {
        cameraDevice.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
        [cameraDevice unlockForConfiguration];
    }
}

根据我的初步测试,这似乎在某种程度上加快了扫描小 QR 码的速度 :)

更新 - iOS8

在 iOS8 中,Apple 为我们提供了许多新的相机 API 供我们使用。这种新方法之一是:

- (void)setFocusModeLockedWithLensPosition:(float)lensPosition completionHandler:(void (^)(CMTime syncTime))handler

此方法通过将镜头移动到 0.0 和 1.0 之间的位置来锁定焦点。我尝试了这个方法,将镜头锁定在接近的值。但是,总的来说,它引起的问题多于它解决的问题。您必须将 QR 码/条形码保持在一个非常特定的距离,当您有不同尺寸的代码时,这可能会导致问题。
但。我想我已经找到了一个很好的替代方法来完全锁定焦点。当用户按下扫描按钮时,我将镜头锁定到近距离,完成后我将相机切换回自动对焦。这给了我们保持自动对焦的好处,但迫使相机从可能找到二维码/条形码的近距离开始。这与:

cameraDevice.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;

和:

cameraDevice.focusPointOfInterest = CGPointMake(0.5,0.5);

产生一个非常活泼的扫描仪。 我还使用 iOS7 中引入的 API 构建了一个自定义扫描器,而不是使用 ZBar。主要是因为 ZBar-libs 已经过时了,当 iPhone 5 引入 ARMv7s 时,我现在不得不为 ARM64 重新编译它。

//亚历山大

关于ios - 在 iOS 上设置初始焦距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782083/

相关文章:

ios - “LABiometryType”仅在iOS 11.0.1或更高版本上可用

javascript - 在旧 iPad 中,符号 '=>'(在 (key,value) => 中)会引发错误

android相机在相机取消的外部SD卡文件夹中创建0kb文件

Android:前置摄像头的手势识别

WPF UserControl 交换并保留键盘焦点

iPhone iOS 4.3 相机焦点方形 - 可以通过编程方式删除吗?

ios - AVFoundation -AVCaptureSession 仅在进入后台并返回断点时停止并开始运行

ios - Push Segue 后改回按钮标题

android - 限制 Android 摄像头

angular - ElementRef 未定义