Фронтальная камера не фокусируется автоматически - PullRequest
2 голосов
/ 25 апреля 2019

Текущее поведение

Я использую react-native-camera с iPad / iPhone и использую фронтальную камеру для сканирования штрих-кодов (Code39, Code128,QR и т. Д.) Однако при использовании фронтальной камеры она не фокусируется на штрих-коде или на предметах, которые я слегка прилегаю к камере.Задняя камера работает абсолютно идеально, однако фронтальная камера не работает.

Я не смог протестировать Android, так как я строю не для Android, а только для iOS.Похоже, я не могу найти никакой информации о фокусировке фронтальной камеры.

Если бы я стоял на заднем плане, поднесите мой Code39 близко к камере, но оставьте небольшой зазор внизу, этоне пытался сфокусироваться на карте, но оставался сосредоточенным на мне в фоновом режиме.

Я также поднял проблему здесь на их странице GitHub, но пришел сюда, чтобы посмотреть, побежал ли кто-нибудьк этому раньше, имеет обходной путь и т. д.

Ожидаемое поведение

Я ожидаю, что камера увидит, что код занимает намного больше экрана, чем яутра, сосредоточиться на нем, прочитать код и приступить к выполнению кода onBarCodeRead

Что я пытался это исправить?

  • Отключить autoFocus, поскольку это было исправлением для Android, здесь не повезло.
  • Вручную установите focusDepth.
  • Вручную установите autoFocusPointOfInterest в центр экрана.
  • Изменитьzoom до 0,2 и медленно увеличиваться до точки, где это начинает выглядеть глупо.
  • Установите onGoogleVisionBarcodesDetected на простоconsole.log что-то, как это было еще одно исправление для Android.
  • Обновление react-native-camera@2.6.0
  • Обновление в главной ветви в react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git

Как можноЯ воссоздаю его?

  • Создать новый реактивный проект
  • yarn add react-native-camera / npm install react-native-camera --save
  • установить type={RNCamera.Constants.Type.front} для использования фронтальной камеры.
  • set autoFocus={RNCamera.Constants.AutoFocus.on} (В любом случае он включен по умолчанию, это просто гарантирует.
  • set onBarCodeRead={() => alert('barcode found')}
  • Попробуйте отсканировать Code39 / Code128 - (можно создать здесь)
  • Попробуйте отсканировать его, и вы обнаружите, что камера не будет фокусироваться на нем, однако сфокусируйтесь на фоне.Это также верно, если вы закрываете камеру пальцем, когда вы отводите палец в сторону, вы ожидаете, что камера не сфокусирована на фоне, и попытаетесь перефокусироваться.Это не тот случай, он останется сфокусированным на среднем / большом расстоянии.

Используемое программное обеспечение и версии

  • iOS: 12.1.4
  • реакция-нативная камера: ^ 2.1.1 / 2.6.0
  • реакция-нативная: 0,57,7
  • реакция: 16,6,1

Код

Я рендерил камеру в react-native-modal, и я поместил свой код ниже.

<RNCamera 
  style={styles.camera}
  type={RNCamera.Constants.Type.front}
  flashMode={RNCamera.Constants.FlashMode.off}
  autoFocus={RNCamera.Constants.AutoFocus.on}
  captureAudio={false}
  onBarCodeRead={(barcode) => {
    if (this.state.isModalVisible) {
      this.setState({
        isModalVisible : false
      }, () => this.captureQR(barcode.data));
    }
}}>

Соответствующий код пакета

Я нашел код, который кажется уместным:

в RNCamera.m метод updateFocusDepth

- (void)updateFocusDepth
{
    AVCaptureDevice *device = [self.videoCaptureDeviceInput device];
    NSError *error = nil;

    if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
        return;
    }

    if (![device respondsToSelector:@selector(isLockingFocusWithCustomLensPositionSupported)] || ![device isLockingFocusWithCustomLensPositionSupported]) {
        RCTLogWarn(@"%s: Setting focusDepth isn't supported for this camera device", __func__);
        return;
    }

    if (![device lockForConfiguration:&error]) {
        if (error) {
            RCTLogError(@"%s: %@", __func__, error);
        }
        return;
    }

    __weak __typeof__(device) weakDevice = device;
    [device setFocusModeLockedWithLensPosition:self.focusDepth completionHandler:^(CMTime syncTime) {
        [weakDevice unlockForConfiguration];
    }];
}

Более конкретно, только этот раздел здесь:

Если device.position == RNCameraTypeFront, он просто вернется, если не соответствует ни одному из других критериев.

    if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
        return;
    }

1 Ответ

3 голосов
/ 03 мая 2019

IOS имеет три Focus Modes.Вам необходимо использовать AVCaptureFocusModeContinuousAutoFocus

AVCaptureFocusModeContinuousAutoFocus : при необходимости камера непрерывно автоматически фокусируется.

Вы используете isFocusModeSupported : метод, чтобы определить, поддерживает ли устройство данный focus mode, затем установить режим с помощью свойства focusMode.

react-native-camera изменит фокус в двух различных сценариях (вы можете установитьточка останова с xcode на этих строках):

  1. focusWithMode метод установит фокус только в том случае, если ваша фронтальная камера поддерживает isFocusPointOfInterestSupported и AVCaptureFocusModeContinuousAutoFocus

Метод изменит режим фокусировки [device setFocusMode:focusMode]; на AVCaptureFocusModeContinuousAutoFocus, только если возвращается следующее условие true

[device isFocusPointOfInterestSupported] && [device isFocusModeSupported:focusMode]

Если условие возвращает false, нет autofocus, , но картинка может быть сфокусирована на ExposureMode [device setExposureMode:exposureMode];

updateAutoFocusPointOfInterest изменяет фокус, когда пользователь нажимает на экран, основываясь на x, y координатах своего прикосновения.

Поскольку имеется несколько сообщений ( post 1 , post 2 , post 3 , post 4 ) в stackoverflow, заявив, что разные версии iphone не поддерживают все типы автофокусировки спередняя камера, я предлагаю вам установить точки останова на этой строке кодов и проверить значения isFocusModeSupported и isFocusPointOfInterestSupported

...