민프

[Android][CameraX - 1] 얼굴을 비춰줄 Camera PreView를 구현해보자!! 본문

[Android]

[Android][CameraX - 1] 얼굴을 비춰줄 Camera PreView를 구현해보자!!

민프야 2021. 7. 26. 18:36

저번 포스트 에서는

https://minf.tistory.com/28

선택한 이미지에서의 얼굴인식을 해보았는데

이번에는 기기의 카메라로 실시간 얼굴인식이 될 수 있도록
Camera Preview를 구현해보자!

 

안드로이드 카메라 API는

Camera API -> Camera2 API -> CameraX API로 이어졌다.

CameraX의 가장 큰 특징은 Android JetPack으로 Android카메라 구현 및 작업을 쉽게 구현할 수 있고

ML kit에서 제공되고 있는 ARCore 등 비전 분석을 사용하는 간단한 코드 기반으로 이미지를 분석 할 수 있다. 

 

Google에서 말하는 CameraX 아키텍쳐의 주요 장점은

다음과 같다.


사용 편의성

그림 1. CameraX는 Android 5.0(API 수준 21) 이상을 타겟팅하며 대부분의 Android 기기에서 지원됩니다.

 

CameraX는 실행해야 하는 작업에만 집중할 수 있도록 사용 사례를 도입하여 기기별 차이를 관리하는 데 시간을 낭비할 필요가 없습니다. 다음은 몇 가지 기본적인 사용 사례입니다.

  • 미리보기: 화면에 이미지를 가져옵니다.
  • 이미지 분석: MLKit로 전달하는 경우와 같이 알고리즘에 사용할 수 있도록 버퍼에 원활하게 액세스할 수 있습니다.
  • 이미지 캡처: 고화질 이미지를 저장합니다.

이러한 사용 사례는 Android 5.0(API 수준 21) 이상을 실행하는 모든 기기에서 작동하며, 출시된 대부분의 기기에 동일한 코드를 사용할 수 있습니다.

기기 간 일관성

그림 2. 자동화된 CameraX Test Lab은 여러 기기 유형과 제조업체에 걸쳐 일관된 API 환경을 보장합니다.

 

여러 앱에 걸쳐 일관된 카메라 동작을 관리하는 것은 어려운 일입니다. 가로세로 비율, 방향, 회전, 미리보기 크기, 고해상도 이미지 크기를 포함하여 많은 것을 고려해야 하기 때문입니다.

 

CameraX를 사용하면 이러한 기본적인 동작이 자동으로 해결됩니다.

 

Google은 여러 가지 기기와 Android 5.0(API 수준 21) 이후의 모든 운영체제 버전에서 다양한 카메라 동작을 테스트하는 자동화된 CameraX Test Lab에 투자하고 있습니다. 이러한 테스트는 지속적으로 실행되며 광범위한 문제를 식별하여 해결합니다.

 

시간이 지남에 따라 테스트 부담을 크게 줄여가는 것이 목표입니다.

새로운 카메라 환경

그림 3. CameraX는 인물 사진 효과와 같은 새로운 인앱 환경을 제공합니다. CameraX를 사용하는 Huawei Mate 20 Pro에서 빛망울 효과로 캡처한 이미지.

 

CameraX에는 단 두 줄의 코드로 기기에 기본 설치되어 있는 네이티브 카메라 앱과 동일한 기능을 이용할 수 있게 해주는 확장 프로그램이라는 선택적 부가기능이 있습니다.

 

사용할 수 있는 첫 번째 기능 세트에는 인물 사진, HDR, 야간 및 뷰티가 포함되어 있습니다. 이러한 기능은 지원되는 기기에서 이용할 수 있습니다.

우수사례

Monzo가 CameraX를 활용해 개발을 간소화한 방법을 알아보려면 우수사례를 참고하세요.


따라서 이번에는 CameraX를 이용해서 PreView를 구현해보려고 한다.

 

CameraX 개발문서에 보면

PreviewView를 사용하기 위한 글이 있는데

순서를 잘 보면서 구현해보아야겠다.

 

 

1. 미리보기 구현

미리보기를 구현하려면 PreViewView를 사용해야 한다.

https://developer.android.com/reference/kotlin/androidx/camera/view/PreviewView
카메라가 활성화되면 이미지 미리보기가 PreviewView 내부 영역으로 스트리밍 된다.

 

1-1. PreviewView를 레이아웃에 추가합니다.

<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>

1-2. ProcessCameraProvider를 요청합니다.

class ProcessCameraProvider : LifecycleCameraProvider
--------------------------------------------------------


import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

public class MainActivity extends AppCompatActivity {
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    }
}

ProcessCameraProvider는 단어 그대로 카메라 제공자 이다.

실행 중인 카메라 장치와 같은 리소스에 제공된 수명 주기로 범위가 지정 된다.

 

수명 주기의 상태는 카메라가 언제 열리고, 시작되고, 중지되고, 닫힐지 결정할 수 있다.

LifecycleOwner의 수명 주기의 상태는 밑에 사진과 같다.

1-3. CameraProvider 사용 가능 여부 확인

CameraProvider를 요청한 후에는 뷰를 만들때 초기화에 성공했는지 확인해주는 코드이다.

        //CameraProview 사용 가능 여부 확인
        cameraProviderFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    bindImageAnalysis(cameraProvider);
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, ContextCompat.getMainExecutor(this));
        //CameraProview 사용 가능 여부 확인

1-4. 카메라 선택 및 수명 주기와 사용 사례 결합

CameraProvider를 만들고 확인한 후에는 다음 작업을 실행합니다.

  1. Preview를 만듭니다.
  2. 원하는 카메라 LensFacing 옵션을 지정합니다.
  3. 선택한 카메라와 사용 사례를 수명 주기에 결합합니다.
  4. Preview를 PreviewView에 연결합니다.
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    preview.setSurfaceProvider(previewView.getSurfaceProvider());

    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
}

이렇게 해주면 카메라 미리보기가 완료된다!!

다음 포스트에서는 캡쳐를 하는 방법을 알아보아야겠다!!

----------참고----------

https://developer.android.com/training/camerax

https://developer.android.com/training/camerax/preview

https://developer.android.com/reference/kotlin/androidx/camera/lifecycle/ProcessCameraProvider

https://developer.android.com/reference/kotlin/androidx/lifecycle/Lifecycle.State

Comments