2016-10-03 4 views
1

У меня плохое поведение при съемке фотографии на устройстве Samsung Galaxy S7.сняты снимки камеры2

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

Проблема особенно заметна при увеличении изображений, но присутствует и при не увеличенной. Я также попытался включить стабилизацию оптического изображения, но проблема не устранена.

Ниже приведены ссылки на изображения образцов, объясняющие проблему.

Native camera image

My camera image

Вот код:

Метод стадии захвата изображение 1:

public void capturePicture() { 
    CameraState state = getState(); 
    if (state != IDLE && state != CLOSING && state != TAKE_PICTURE) { 
      boolean af = false; 
      boolean ae = false; 
      if (isAFEnabled()) { 
       af = true; 
      } else if (isAEEnabled()) { 
       ae = true; 
      } 

      if (!af && !ae) { 
       takePicture(); 
      } else { 
       triggerFocusAndExposure(true); 
      } 
    } 

    return; 
} 

метод для запуска фокуса и экспозиции:

private void triggerFocusAndExposure(boolean picture) { 
    setState(WAIT_PRECAPTURE_PICTURE); 

    if (isAFEnabled()) { 
     previewBuilder.set(CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_START); 
    } 

    if (isAEEnabled()) { 
     previewBuilder.set(CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_START); 
    } 

    try { 
     cameraSession.capture(previewBuilder.build(), new SCameraCaptureSession.CaptureCallback() { 
      @Override public void onCaptureCompleted(SCameraCaptureSession session, SCaptureRequest request, STotalCaptureResult result) { 
       setState(PRECAPTURE_TRIGGERED_PICTURE); 
      } 
     }, backgroundHandler); 
    } catch (CameraAccessException e) { 
     return; 
    } 

    try { 
     previewBuilder.set(CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE); 
     previewBuilder.set(CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE); 
     cameraSession.setRepeatingRequest(previewBuilder.build(), mSessionCaptureCallback, backgroundHandler); 
    } catch (CameraAccessException e) { 
    } 
} 

Методы ждут фокуса и экспозиции:

private void waitPrecapture(STotalCaptureResult result, boolean picture) { 
    // Check if AF/AE triggered and/or finished 
    if ((!isAFTriggered(result) || isAfFinished(result)) && (!isAETriggered(result) || isAEFinished(result))) { 
     takePicture(); 
    } 
} 

private boolean isAFTriggered(STotalCaptureResult result) { 
    Integer afMode = result.get(SCaptureResult.CONTROL_AF_MODE); 
    return afMode != CONTROL_AF_MODE_OFF && 
      afMode != CONTROL_AF_MODE_EDOF; 
} 

private boolean isAfFinished(STotalCaptureResult result) { 
    int afState = result.get(SCaptureResult.CONTROL_AF_STATE); 
    return afState == CONTROL_AF_STATE_FOCUSED_LOCKED || afState == CONTROL_AF_STATE_NOT_FOCUSED_LOCKED 
      || afState == CONTROL_AF_STATE_PASSIVE_FOCUSED || afState == CONTROL_AF_STATE_PASSIVE_UNFOCUSED; 
} 

private boolean isAETriggered(STotalCaptureResult result) { 
    boolean aeMode = result.get(SCaptureResult.CONTROL_AE_MODE) != SCaptureResult.CONTROL_AE_MODE_OFF; 
    return aeMode && cameraCharacteristics.get(SCameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) 
      != SCameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY; 
} 

private boolean isAEFinished(STotalCaptureResult result) { 
    Integer aeState = result.get(SCaptureResult.CONTROL_AE_STATE); 
    return aeState == null || aeState == SCaptureResult.CONTROL_AE_STATE_CONVERGED || aeState == SCaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED 
      || aeState == SCaptureResult.CONTROL_AE_STATE_LOCKED; 
} 

Метод стадии захвата фото 2:

public void takePicture(){ 
    imageReader.setOnImageAvailableListener(reader -> { 
     Image image = reader.acquireLatestImage(); 
     ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
     byte[] bytes = new byte[buffer.remaining()]; 
     buffer.get(bytes); 
     image.close(); 
     singleSubscriber.onSuccess(bytes); 
    }, imageSavingHandler); 

    try { 
     cameraSession.capture(captureBuilder.build(), new SCameraCaptureSession.CaptureCallback() { 
      @Override 
      public void onCaptureCompleted(SCameraCaptureSession session, SCaptureRequest request, STotalCaptureResult result) { 
       if (getState() == CameraState.CLOSING) { 
        return; 
       } 
       cancelAF(); 
      } 

      @Override 
      public void onCaptureStarted(SCameraCaptureSession session, SCaptureRequest request, long timestamp, long frameNumber) { 
       super.onCaptureStarted(session, request, timestamp, frameNumber); 
       shutterCallback.call(); 
      }  

      @Override public void onCaptureFailed(SCameraCaptureSession session, SCaptureRequest request, SCaptureFailure failure) { 
        singleSubscriber.onError(new RuntimeException("Error taking picture, onCaptureFailed")); 
        if (getState() == CameraState.CLOSING) { 
         return; 
        } 
        cancelAF(); 
      } 
     }, backgroundHandler); 

     setState(CameraState.TAKE_PICTURE); 
    } catch (CameraAccessException e) { 
     singleSubscriber.onError(new RuntimeException("Error capturing image", e)); 
    } 
} 
+0

еще код пожалуйста – Vyacheslav

+0

Очень интересно. 'Thanks'. Для чего? Это сайт программирования. Я мало программирую. – greenapps

+0

Какой учебник вы использовали для захвата изображения? – abbath

ответ

7

Я нашел исправить. captureBuilder автоматически устанавливает CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY и CaptureRequest.EDGE_MODE_HIGH_QUALITY, но в моем случае у устройства возникла проблема с этими вариантами. Установка CaptureRequest.NOISE_REDUCTION_MODE_FAST и CaptureRequest.EDGE_MODE_FAST устраняет проблему.

Смежные вопросы