한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
CameraX의 새로운 기능
2020년 3월 23일 월요일
앱에 고급 카메라 제어 기능을 추가하는 방법
작성자:
Xi Zhang
(Google 소프트웨어 엔지니어),
Caren Chang
(Google 개발자 프로그램 엔지니어)
이 글은
Android Dev Summit 2019
의
프레젠테이션
을 바탕으로 하며, CameraX API의 현재 상태를 반영하도록 업데이트되었습니다. 원문은
이 곳
에서 확인 가능하며 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.
Camera2 API는 강력하지만 최대한 활용하기 쉽지 않습니다. 특히 기기에 따라 HDR 또는 야간 모드와 같이 다양한 카메라 기능을 제공하기 때문에 활용하기가 더욱 까다롭습니다. 이를 해결하기 위해 작년 Google I/O에서는 앱에 카메라 기능을 추가할 때 발생하는 어려움을 해결하기 위해 설계된 새로운 Jetpack 라이브러리인 CameraX를 발표했습니다.
개발자가 애플리케이션에 카메라 기능을 더욱 쉽게 통합하도록 지원하기 위해 CameraX팀에서는 다음과 같은 핵심 요소에 중점을 뒀습니다.
●앱에서 더 많은 카메라 기능을 쉽게 구현하는 데 도움이 되는 새로운 기능과 API를 제공합니다. 이제 탭하여 초점 맞추기, 확대/축소 제어 및 기기 회전 정보에 관한 지원이 포함됩니다. 이를 통해 렌즈에 따라 다양한 구성 및 플래시 기능을 더 쉽게 다룰 수 있으므로 카메라 렌즈에 플래시 기능이 있는지 등을 쿼리할 수 있습니다.
●앱이 더 많은 기기에서 야간 모드, HDR 등의 카메라 기능을 사용할 수 있도록 확장 함수를 제공하는 기기의 범위를 넓혔습니다. 이 기능은 작성 시점을 기준으로 삼성, LG, OPPO, Xiaomi, Motorola의 휴대전화(Android 10부터)와 호환됩니다.
●보급형 기기부터 고급형 기기까지 52가지 기기 모델(2억 대 이상의 활성 기기)을 갖춘 실험실에서 특히 API 일관성과 안정성에 중점을 두고 테스트했습니다.
이 작업의 일환으로, CameraX팀에서는 실제 환경에서 라이브러리가 작동하는 방식을 파악하기 위해 Lens Go팀과 긴밀히 협력하고 있습니다. Lens Go는 사용자가 공항 표지판과 같은 대상에 카메라를 갖다 대서 이미지를 분석하고 실시간으로 의견(예: 표지판 내용의 번역)을 보낼 수 있는 앱입니다. 이 협업은 CameraX 라이브러리의 작동 방식, 특히 Lens Go의 주요 기기 세그먼트인 보급형 기기에서의 작동 방식을 테스트하기에 효과적인 방법이었습니다. 또한 매달 수백만 명의 사용자가 수백 가지의 기기에서 Lens Go를 사용하고 있기 때문에 Lens Go에서 CameraX 라이브러리가 어떻게 작동하는지 확인하는 작업은 더 안정적인 라이브러리를 제공하는 데 많은 도움이 되었습니다.
Lens Go팀이 발견한 CameraX 통합의 큰 이점 중 하나는 바로 CameraX가 성능과 크기에 매우 최적화되어 있어 APK 크기를 줄일 수 있다는 점이었습니다. 또한 자체 카메라 코드를 유지하지 않고도 기능을 더 빠르게 제공할 수 있었습니다.
CameraX 사용
CameraX는 가장 일반적인 카메라 시나리오에서 다음 3가지 사용 사례를 지원합니다.
●
미리보기
: 뷰파인더를 포함하여 앱에서 실시간 카메라 피드를 표시할 수 있습니다.
●
이미지 분석
: 카메라 프레임 데이터에 액세스하여 객체 감지, 증강 현실과 같은 기능을 구현할 수 있습니다.
●
이미지 캡처
: 사진을 찍어서 디스크에 저장할 수 있습니다.
각 사용 사례에는 구성, 결합, 상호작용의 세 가지 설정 단계가 있습니다.
각 단계에 관한 자세한 설명을 위해 앱에서 사진을 찍는 이미지 캡처의 예를 살펴보겠습니다.
https://gist.github.com/xizhang/de7521de2b9da35769cc9a3f10f69609#file-ads2019-usecase-setup-kt
첫 번째 단계는 이미지 캡처 사용 사례를 만드는 것입니다. 이때 사진 해상도와 같은 매개변수를 지정할 수 있습니다. 하지만 설정한 해상도를 사용자 기기에서 지원하는지는 걱정하지 않아도 됩니다. 요청된 해상도를 기기에서 지원하지 않는 경우 CameraX는 이와 가장 가까운 해상도로 대체합니다. 따라서 항상 문제없이 구성을 마칠 수 있습니다.
두 번째 단계는 바인딩입니다. 엑티비티의 생명주기, 카메라 및 캡처 세션의 생명주기 등 고려해야 하는 다양한 생명주기가 있습니다. 사용 사례를
LifecycleOwner
로 결합하면 CameraX에서 모든 생명주기를 관리하므로 개발자가 직접 상태 머신을 관리하지 않아도 됩니다. 예를 들어, 필요시 카메라가 열리고, 사용이 끝나면 종료됩니다.
마지막 단계는 상호작용입니다. takePicture를 호출하면 앱에서 사진을 찍습니다.
따라서 단 몇 줄의 코드만으로 이미지 캡처 파이프라인을 가질 수 있습니다.
고급 기능
CameraX에서 제공하는 고급 기능을 이해할 수 있도록 카메라 제어 기능과 카메라 정보 기능을 살펴보겠습니다. 이러한 기능은 사용 사례와 별개로 직접 카메라를 제어할 수 있도록 하는 높은 수준의 API입니다. 즉, 미리보기와 이미지 캡처 사용 사례가 있는 경우 확대/축소 또는 플래시와 같은 카메라 상태를 업데이트하면 이 업데이트가 모든 사용 사례에 적용됩니다.
탭하여 초점 맞추기 구현
CameraX는 자동 초점을 지원하지만, 사용자가 직접 초점을 제어할 수 있도록 여러분이 관련 기능을 제공하려는 경우도 있을 것입니다.
Camera2 API에서 이 기능을 구현하려면 UI(뷰파인더) 좌표와 카메라 센서(이미지) 좌표 간의 변환에 관해 알아야 하고 초점 영역의 크기를 지정해야 합니다.
CameraX에서 이 기능을 구현하는 방법은 다음과 같습니다.
https://gist.github.com/xizhang/044919707d92de352788e86cbd07a40b#file-ads2019-tap-to-focus-kt
먼저 SurfaceView 및 UI 좌표를 사용하고 측정 지점인 센서 좌표를 반환하는 SurfaceViewMeteringPointFactory를 호출하여 좌표를 변환할 수 있습니다.
그리고 나서 작업을 만듭니다. 동일한 영역에 초점을 맞추고 측정하려면 FocusMeteringAction을 사용하여 측정 영역을 전달합니다.
마지막으로, 이 작업을 cameraControl에 전달하면 CameraX에서 나머지 작업을 처리합니다.
손가락을 모으거나 펼쳐 확대/축소하기 구현
Camera2에서 손가락을 모으거나 펼쳐 확대/축소하는 기능을 구현하려면 변환과 자르기 영역에 관해 알아야 합니다.
CameraX에서 이 기능을 구현하는 방법은 다음과 같습니다.
https://gist.github.com/xizhang/f4edd06d8949a47335612934657d7146#file-ads2019-pinch-to-zoom-kt
손가락을 모으거나 펼쳐 확대/축소하기를 구현하려면 기본값과 델타값이 필요합니다. 기본값은 현재의 확대/축소 비율이고, 델타값은 사용자가 손가락을 모으거나 펼쳐 변경하는 비율의 양입니다.
델타값을 얻으려면 ScaleGestureDetector를 만듭니다. 이 Android 객체는 터치 이벤트를 배율로 변환합니다. 이 배율이 델타값입니다.
그런 다음 cameraInfo에서 기본값을 얻습니다. 이 API를 통해 확대/축소 비율, 플래시 사용 가능 여부, 센서 회전도와 같은 카메라 기능 상태를 확인할 수 있습니다.
이 두 가지 값을 사용하여 이제 카메라 제어 기능의 크기와 비율을 호출합니다. CameraX에서 자르기 영역을 파악하고 카메라에 요청을 보냅니다. 이것만으로 손가락을 모으거나 펼쳐 확대/축소하기를 구현할 수 있습니다.
확대/축소 슬라이더 구현
확대/축소 슬라이더를 구현하려면 손가락을 모으거나 펼쳐 확대/축소와는 다른 접근 방식을 취해야 합니다. 이유는 다음과 같습니다. 1~10의 비율로 확대/축소할 수 있는 카메라가 있다고 가정해 보겠습니다. 이 경우 1에서 2로 확대하면 시야가 50% 줄어듭니다. 그러나 9에서 10으로 확대하면 슬라이더에서는 같은 거리이더라도 시야는 10% 줄어듭니다.
이는 최적의 사용자 환경이 아니기 때문에 CameraX에는 setLinearZoom API가 포함되어 있습니다. 이 API는 슬라이더 값을 사용하고 선형 확대/축소를 제공하는 데 필요한 변환을 실행합니다.
따라서 다음과 같은 코드 한 줄로 확대/축소 슬라이더를 구현할 수 있습니다.
https://gist.github.com/xizhang/d6cba283b5481c1eb5a202d14a063820#file-ads2019-zoom-slider-kt
자세히 알아보기
이 문서가 CameraX API를 사용하여 앱에 카메라 기능을 손쉽게 통합하는 방법을 이해하는 데 도움이 되었기를 바랍니다. 자세한 내용은
CameraX 설명서를 확인해 보세요
. 여기서는 전체 API 설명서 외에도 예제 앱과 실습
Codelab
을 확인할 수 있습니다. 이전 블로그 게시물인
Core Principles Behind(핵심 원칙)
및
CameraX Jetpack Library(CameraX Jetpack 라이브러리)
를 읽어 보는 것도 좋습니다.
궁금한 점이나 의견이 있으면
CameraX Google 그룹
에 게시해 주시기 바랍니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed