Android

camera

Small Octopus 2019. 10. 2. 17:16

android camera2

OnImageAvailableListener 와 Camera.PreviewCallback을 implements 한다
Camera.PreviewCallback 은 Camera1 API 이고
OnImageAvailableListener은 Camera2 API 이다.

Create에서 setFragment을 한다.
*Camera2API-> CameraConnectionFragment를 생성하면서 previewsize 및 회전 정보를 콜백하게 한다.
 그리고 image listener를 등록, 레이아웃 아이디, 프리뷰 크기 지정을 한다. 그리고 카메라 등록을 한다.
 
*Camera1API-> LegacyCameraConnectionFragment를 생성하면서 image listener, 레이아웃 아이디, 프리뷰 크기 지정을 한다.

프래그먼트 매니져를 이용하여 트랜잭션을 시작하게 한다.

Camera1API -> onPreviewFrame(final byte[] bytes, final Camera camera)
Camera2API -> onImageAvailable(final ImageReader reader)

프리뷰 크기에 맞게 rgb버퍼 할당
Runnable로 yuv -> rgb 변환
Runnable로 byte를 버퍼를 콜백에 등록 후 프레임 카피가 끝났음을 알림

* 실제 프로세싱
getRgbBytes()를 호출해서 이미지 데이터를 받아 오는데, 내부는 Runnable로 yuv -> rgb 변환를 동작시킴
이미지를 복사한후 다음 프레임을 받을 수 있게 활성화 함
비트맵 캔버스를 이용해서 크랍하고 
백그라운드 러너블로 tflite 실행 결과를 
실제 화면의 평면기하에 맞게 트랜스폼 후 오버레이로 그림
별도 UI 쓰레드를 실행해서 여러 정보를 업데이트

- 프래그먼트에 대해서 살펴보자.
프래그먼트는 액티비티에 UI들을 구룹으로 묶어주는 역화을 한다?
이미지 리스너, 카메라커넥션콜백, 캡쳐콜백, 텍스쳐뷰, 캡쳐세션, 카메라 디바이스,
센서방향, 프리뷰크기, 배그라운드 쓰레드, 카메라 스테이트 콜백, 

이미지 리스너을 카메라 액티비티를 넣줘서 콜백이 오도록 했다.

카메라와 텍스쳐를 만들어서 가지고 있고 
getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
호출을 통해 프래임레이아웃을 프레그먼트로 교체