이미지 분석

이미지 분석 사용 사례에서는 이미지 처리, 컴퓨터 비전 또는 머신러닝 추론을 진행할 수 있도록 CPU에서 액세스 가능한 이미지를 앱에 제공합니다. 애플리케이션은 각 프레임에서 실행되는 분석 메서드를 구현합니다.

구현

이미지는 이미지 분석이 실행되는 실행자와 ImageAnalysis.Analyzer 매개변수를 setAnalyzer() 메서드에 전달하여 처리됩니다. 언제든지 분석 도구 하나만 등록할 수 있습니다. 새로운 분석 도구를 등록하면 기존 분석 도구가 대체됩니다.

이 주제의 코드 예에는 이러한 처리 방법뿐만 아니라 이미지 분석 사용 사례와 미리보기 사용 사례를 LifecycleOwner에 결합하는 방법이 나와 있습니다. 미리보기 사용 사례 만들기에 관한 내용을 읽어보려면 미리보기 구현을 참고하세요.

이미지 분석은 차단 및 비차단의 두 가지 모드에서 작동할 수 있습니다. 차단 모드는 STRATEGY_BLOCK_PRODUCERsetBackpressureStrategy()를 호출하여 사용 설정됩니다. 이 모드에서 실행자는 카메라에서 전송되는 프레임을 순차적으로 수신합니다. 이는 analyze() 메서드가 현재 프레임 속도에서 단일 프레임의 지연 시간보다 오래 걸리면 메서드가 반환할 때까지 새 프레임이 파이프라인에 진입하지 못하게 차단되므로 프레임이 더 이상 최신 상태가 아닐 수 있음을 뜻합니다.

STRATEGY_KEEP_ONLY_LATESTsetBackpressureStrategy()를 호출하면 비차단 모드가 사용 설정됩니다. 이 모드에서 실행자는 analyze() 메서드가 호출되는 시점에 카메라에서 마지막으로 사용 가능한 프레임을 수신합니다. analyze() 메서드의 현재 프레임 속도가 단일 프레임의 지연 시간보다 느린 경우 analyze()가 다음번에 데이터를 수신할 때 카메라 파이프라인에서 사용 가능한 최신 프레임을 가져오도록 몇몇 프레임을 건너뛸 수 있습니다.

analyze()에서 반환하기 전에 image.close()를 호출하여 이미지 참조를 닫습니다. 그렇게 하면 추가 이미지 생성 차단(미리보기 중단 발생)과 잠재적인 이미지 누락이 방지됩니다. 메서드는 분석 메서드 외에 이미지 참조를 전달하는 대신 분석을 완료하거나 사본을 만들어야 합니다.

Kotlin

val imageAnalysis = ImageAnalysis.Builder()
    .setTargetResolution(Size(1280, 720))
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .build()

imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { image ->
    val rotationDegrees = image.imageInfo.rotationDegrees
    // insert your code here.
})

cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)

자바

ImageAnalysis imageAnalysis =
    new ImageAnalysis.Builder()
        .setTargetResolution(new Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build();

imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
    @Override
    public void analyze(@NonNull ImageProxy image) {
        int rotationDegrees = image.getImageInfo().getRotationDegrees();
            // insert your code here.
        }
    });

cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);

CameraX에서는 YUV_420_888 형식의 이미지를 생성합니다.

추가 리소스

CameraX에 관해 자세히 알아보려면 다음 추가 리소스를 참고하세요.

Codelab

  • CameraX 시작하기
  • 코드 샘플

  • 공식 CameraX 샘플 앱