개발일지/코틀린(Kotlin)

코틀린 - 카메라 필터 앱 만들기 - 3 (CameraX+OpenCV)

이건나이스가아니야 2024. 4. 15. 19:11

3. 카메라 필터(OpenCV) 추가

 

1,2번 과정을 거치면서 CameraX와 OpenCV라이브러리를 추가하는 방법을 알아봤다.

 

두 사례를 모두 적용한다. 아. 참고로 안드로이드 스튜디오 22.01 버젼에서 CameraX적용은 쉬우니까 지금까지 잘 해왔다면 문제없이 적용할 것임.

 

이제 실시간 필터기능을 추가하기 위해 우리는 실시간 촬영데이터의 근원이 어디서 일어나는지 알아야한다.

 

코드를 한번살펴보자.

 

아마 이 부분에서 카메라를 송출을 세팅해주는 부분이 있을 것인데.

일단 나는 전면 카메라 사용을 위해 DEFAULT_FRONT_CAMERA로 변경했다. 

최종적인 카메라 어플을 만들기 위해서는 버튼으로 만들어야할 것임 ㅇㅇ 

 

private fun startCamera() {
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

    cameraProviderFuture.addListener({
        // Used to bind the lifecycle of cameras to the lifecycle owner
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        // Preview
        val preview = Preview.Builder()
            .build()
            .also {
                it.setSurfaceProvider(viewBinding.viewFinder.surfaceProvider)
            }

        // Select back camera as a default
        //val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
        val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA

        try {
            // Unbind use cases before rebinding
            cameraProvider.unbindAll()

            // Bind use cases to camera
            cameraProvider.bindToLifecycle(
                this, cameraSelector, preview)

        } catch(exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }

    }, ContextCompat.getMainExecutor(this))
}

 

우리가 주목해야할 곳은 bindToLifecycle이다. 왜?

링크(https://developer.android.com/media/camera/camerax/analyze?hl=ko)

 

CameraX가이드라인에 이미지분석 예제를 읽어보니

ImageAnalysis와 preview 사용 사례를 lifeCycle 소유자에 결합한다고 나와있다.

val imageAnalysis = ImageAnalysis.Builder()
    // enable the following line if RGBA output is needed.
    // .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .setTargetResolution(Size(1280, 720))
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .build()
imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { imageProxy ->
    val rotationDegrees = imageProxy.imageInfo.rotationDegrees
    // insert your code here.
    ...
    // after done, release the ImageProxy object
    imageProxy.close()
})

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

 

 

우리는 imageAnalysis를 구현하고 lifecycle에 추가해주면 될 것 같다. 

 

다른 사람 코드 참고하기(https://github.com/hkdong0694/Kotlin_CameraX)

 

일단 Kotlin으로 openCV 사용을 한번 진행하고 다시 도전해야겠다.