Android 프로그래밍 2

본문 바로가기
사이트 내 전체검색


Android 프로그래밍 2
Android 프로그래밍 2

9. Camera2 사용하기 (2)

페이지 정보

작성자 관리자 댓글 0건 조회 3,579회 작성일 20-05-12 20:07

본문

9. Camera2 사용하기 (2)

ANDROID CAMERA2 API를 사용할 때 다음 단계를 수행합니다


1. Android CameraManager 클래스는 Android 기기의 모든 카메라 기기를 관리하는 데 사용됩니다.


2. 각 카메라 장치는 장치를 설명하는 특성 및 설정 범위를 갖는다. 카메라 특성을 통해 얻을 수 있습니다.


3. 카메라 장치에서 이미지를 캡처하거나 스트리밍하려면 먼저 응용 프로그램에서 카메라 캡처 세션을 만들어야합니다


4. 카메라 캡처에는 캡처하거나 미리보고있는 것을 출력하는 표면이 필요합니다. Surface는 SurfaceView, Surface (SurfaceTexture)를 통한 SurfaceTexture, MediaCodec, MediaRecorder, Allocation 및 ImageReader를 포함한 다양한 클래스에서 얻을 수 있습니다.


5. 그런 다음 응용 프로그램은 단일 이미지를 캡처하기 위해 카메라 장치에 필요한 모든 캡처 매개 변수를 정의하는 CaptureRequest를 구성해야합니다.


6. 요청이 설정되면 원샷 캡처 또는 끝없이 반복되는 사용을 위해 활성 캡처 세션으로 전달 될 수 있습니다.


7. 요청을 처리 한 후 카메라 장치는 캡처 시점의 카메라 장치 상태 및 사용 된 최종 설정에 대한 정보가 포함 된 TotalCaptureResult 객체를 생성합니다.


레벨 21에 도입 된 android camera2 API를 사용하고 있으므로이 프로젝트의 최소 Android SDK는 21입니다. 



기존 카메라 API는 안드로이드 초기 버전에서 만들어진 만큼 카메라가 지금 이렇게까지 발전할 거라고는 생각하지 않았고, 컴팩트 카메라처럼 간단한 기능들만을 제공했다. 이런 점을 상당 부분 개선한 API가 Camera2 API 이다.


camera1 은 이제 공식적으로 지원이 중단되었으며, 앞으로 많은 유저들이 고성능의 스마트폰 카메라를 사용하게 될것이다. 이제는 camera2 를 사용해야하는 시점이다
 
< camera2 api 의 동작 순서도 >



1.PNG


CameraManager : 시스템 서비스로서, 사용가능한 카메라와 카메라 기능들을 쿼리할 수 있고, 카메라를 열 수 있다.


CameraCharacteristics : 카메라의 속성들을 담고있는 객체, 속성을 가져오는 것만 가능하다


CameraDevice : 카메라 객체


CaptureRequest : 사진 촬영이나 카메라 미리보기를 요청(request) 하는 데 쓰이는 객체이다


CameraCaptureSession : CaptureRequest 를 보내고, 카메라 하드웨어에서 결과를 받을 수 있는 세션


CaptureResult : CaptureRequest 의 결과이다. 이미지의 메타데이터도 가져올 수 있다.



2.PNG


위의 그림을 보면,


1. 앱에서 CameraCaptureSession 으로 CaptureRequest 를 보낸다.


2. CameraCaptureSession에서 현재 보여지고 있는 화면을 CameraResult 를 통해 앱으로 다시 보내준다
는 것을 알 수 있다.


CaptureRequest 를 보내기 전까지는 카메라로 보고 있는 이미지(In-progress captures)를 버퍼를 통해 Surface에 뿌려준다.


위의 그림을 참고하면 여러 개의 Surface로 버퍼를 보내고 있는데, SurfaceView를 사용해 바로 미리보기를 보낼 수도 있고, SurfaceTexture나 RenderScript를 이용해 후처리를 하게 할 수도 있다. 특이한 점은 ImageReader나 MediaCodec으로 보내는 점인데, Camera2는 사진을 찍으면 바로 ByteArray를 주는 Camera1과는 달리 ImageReader로 Image를 준다.




android.hardware.camera2 패키지는 Android 기기에 연결된 개별 카메라 기기에 대한 인터페이스를 제공합니다. 

더 이상 사용되지 않는 Camera클래스를 대체합니다 .


이 패키지는 카메라 장치를 파이프 라인으로 모델링하여 단일 프레임 캡처를 위한 입력 요청을 받아 요청 당 단일 이미지를 캡처 한 다음 하나의 캡처 결과 메타 데이터 패킷과 요청에 대한 출력 이미지 버퍼 세트를 출력합니다. 

요청은 순서대로 처리되며 한 번에 여러 요청을 처리 할 수 ​​있습니다. 

카메라 장치는 여러 단계의 파이프 라인이므로 대부분의 Android 장치에서 전체 프레임 속도를 유지하려면 여러 요청이 비행 중이어야합니다.


사용 가능한 카메라 장치를 열거, 쿼리 및 열려면 CameraManager인스턴스를 얻습니다 .


개인 CameraDevices은 하드웨어 장치 및 장치의 사용 가능한 설정 및 출력 매개 변수를 설명하는 정적 특성 정보 세트를 제공합니다.

 이 정보는 CameraCharacteristics개체를 통해 제공되며 다음을 통해 제공됩니다. 


getCameraCharacteristics(String)


카메라 장치에서 이미지를 캡처하거나 스트리밍하려면 먼저 응용 프로그램 camera capture session 에서 카메라 장치와 함께 사용할 출력 표면 세트가 있는를 생성해야합니다 


createCaptureSession(SessionConfiguration). 


각 Surface는 appropriate size and format카메라 장치에서 사용 가능한 크기 및 형식과 일치하도록 (해당되는 경우) 사전 구성되어 있어야합니다. 

목표 표면을 포함 클래스의 다양한 얻을 수있다 


SurfaceView, SurfaceTexture경유 Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, 및 ImageReader.


일반적으로 카메라 미리보기 이미지로 전송됩니다 

SurfaceView또는 TextureView(ITS를 통해 SurfaceTexture). 

대한 JPEG 이미지 나 RAW 버퍼의 캡처 DngCreator와 함께 할 수 ImageReader와 JPEG및 RAW_SENSOR형식을 지원합니다. 

또는 직접 관리 또는 네이티브 코드 RenderScript OpenGL을 ES 카메라 데이터 애플리케이션 구동 처리가 가장 통해 이루어진다 

AllocationYUV와 Type, SurfaceTexture및 ImageReaderA의 YUV_420_888각각 형식.


그런 다음 응용 프로그램 CaptureRequest은 단일 이미지를 캡처하기 위해 카메라 장치에 필요한 모든 캡처 매개 변수를 정의하는를 구성해야합니다 .

이 요청에는이 캡처의 대상으로 사용해야 할 구성된 출력 표면이 나열됩니다. 

CameraDevice에는 응용 프로그램이 실행되는 Android 장치에 최적화 된 지정된 사용 사례 factory method를 만들기 위한가 있습니다 


request builder.


요청이 설정되면 원샷 capture또는 끝없이 repeating사용 하기 위해 활성 캡처 세션으로 전달 될 수 있습니다 . 

두 방법 모두 버스트 캡처 / 반복 버스트로 사용할 요청 목록을 허용하는 변형이 있습니다. 

반복 요청은 캡처보다 우선 순위가 낮으므로 capture()반복 요청이 구성된 동안 제출 된 요청은 현재 반복 (버스트) 캡처의 새 인스턴스가 캡처를 시작하기 전에 캡처됩니다.


요청을 처리 한 후 카메라 장치는 TotalCaptureResult캡처시 카메라 장치의 상태 및 사용 된 최종 설정에 대한 정보가 포함 된 객체 를 생성합니다 . 

반올림 또는 해결 모순 매개 변수가 필요한 경우 요청과 약간 다를 수 있습니다. 

카메라 장치는 또한 이미지 데이터 프레임을 Surfaces요청에 포함 된 각 출력으로 전송합니다 . 

출력 CaptureResult와 관련하여 비동기 적으로 생성되며, 때로는 상당히 나중에 생성됩니다.



카메라 앱을 만드는 방법에는 크게 두가지가 있다.


1. 안드로이드에서 기본적으로 제공하는 카메라앱을 호출해서 사진을 찍고, 사진을 리턴받는 방법
2. 직접 사진을 찍고 처리하는 방법
 
2번 방식의 카메라앱을 만들기 위한 절차는 다음과 같다
(1) 카메라 하드웨어 유무 확인 및, 카메라에 액세스 가능한지 확인한다
(2) 프리뷰 클래스를 생성한다
(3) 촬영시작용 리서너를 생성한다
(4) 캡쳐후 처리한다
(5) 카메라 리소스를 반환한다 


참고 사이트


https://www.jianshu.com/p/c99fd9dfd77f


https://www.charlezz.com/?p=1118
https://medium.com/@tylerwalker/integrating-camera2-api-on-android-feat-kotlin-4a4e65dc593f
https://developer.android.com/reference/android/hardware/camera2/package-summary
 
https://proandroiddev.com/understanding-camera2-api-from-callbacks-part-1-5d348de65950
https://inducesmile.com/android/android-camera2-api-example-tutorial/
https://inducesmile.com/android/android-camera2-api-example-tutorial/
https://www.youtube.com/watch?v=oPu42I0HSi4

https://medium.com/google-developers/detecting-camera-features-with-camera2-61675bb7d1bf#.2x3icoqnc
https://developer.android.com/reference/android/hardware/camera2/package-summary.html
https://blog.shift.moe/2018/09/05/camera2-overview/

https://gabrieltanner.org/blog/camera-app
https://developer.android.com/guide/topics/media/camera

https://webnautes.tistory.com/822
https://developer.android.com/guide/topics/media/camera.html?hl=ko
https://thegreedyman.tistory.com/9


https://www.programcreek.com/java-api-examples/index.php?api=android.hardware.camera2.CameraManager 


https://myandroidarchive.tistory.com/1


댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.