Raw Depth API는 Full Depth API 데이터보다 정확도가 높은 카메라 이미지에 깊이 데이터를 제공하지만, 모든 픽셀을 항상 다루는 것은 아닙니다. RAW 깊이 이미지와 일치하는 신뢰도 이미지도 추가로 처리할 수 있으므로 앱은 개별 사용 사례에 충분한 정확성을 갖춘 깊이 데이터만 사용할 수 있습니다.
기기 호환성
Raw Depth는 Depth API를 지원하는 모든 기기에서 사용할 수 있습니다. Full Depth API와 마찬가지로 Raw Depth API에는 비행 시간 (ToF) 센서와 같은 지원되는 하드웨어 깊이 센서가 필요하지 않습니다. 그러나 Raw Depth API와 Full Depth API 모두 기기에 있을 수 있는 지원되는 하드웨어 센서를 활용합니다.
Raw Depth API와 Full Depth API 비교
Raw Depth API는 정확도가 더 높은 심도 추정치를 제공하지만, RAW 심도 이미지에는 카메라 이미지의 모든 픽셀에 대한 심도 추정치가 포함되지 않을 수 있습니다. 반면, Full Depth API는 모든 픽셀에 대해 추정 심도를 제공하지만, 픽셀당 심도 데이터는 심도 추정치의 평활화 및 보간으로 인해 정확도가 떨어질 수 있습니다. 두 API에서 깊이 이미지의 형식과 크기는 동일합니다. 콘텐츠만 다릅니다.
다음 표는 주방에 있는 의자와 탁자의 이미지를 사용하여 Raw Depth API와 전체 Depth API의 차이점을 보여줍니다.
API | 반환 값 | 카메라 이미지 | 심도 이미지 | 신뢰도 이미지 |
---|---|---|---|---|
Raw Depth API |
|
|||
Full Depth API |
|
해당 사항 없음 |
신뢰도 이미지
Raw Depth API에서 반환된 신뢰도 이미지에서 밝은 픽셀은 신뢰도 값이 더 높으며, 흰색 픽셀은 완전 신뢰도를, 검은색 픽셀은 신뢰도를 나타냅니다. 일반적으로 나무와 같이 질감이 더 큰 카메라 이미지의 영역은 비어 있는 벽과 같이 그렇지 않은 영역보다 원시 심도 신뢰도가 높습니다. 텍스처가 없는 표면은 일반적으로 신뢰도가 0입니다.
대상 기기에 지원되는 하드웨어 깊이 센서가 있는 경우 질감이 없는 표면에서도 카메라에 충분히 가까운 이미지 영역의 신뢰도가 높아질 수 있습니다.
컴퓨팅 비용
Raw Depth API의 컴퓨팅 비용은 전체 Depth API 컴퓨팅 비용의 약 절반입니다.
사용 사례
Raw Depth API를 사용하면 장면에 있는 객체의 도형을 더 자세히 표현하는 깊이 이미지를 얻을 수 있습니다. 원시 깊이 데이터는 기하학적 이해 작업에 심도 정확성과 세부정보가 필요한 AR 환경을 만들 때 유용할 수 있습니다. 사용 사례의 예는 다음과 같습니다.
- 3D 재구성
- 측정
- 셰이프 감지
기본 요건
기본 AR 개념을 이해합니다. ARCore 세션을 구성하는 방법을 알아보세요.
깊이 사용 설정
새 ARCore 세션에서 사용자 기기가 깊이를 지원하는지 확인합니다. 일부 ARCore 호환 기기는 처리 전력 제약으로 인해 Depth API를 지원하지 않습니다. 리소스를 저장하기 위해 ARCore에서는 깊이가 기본적으로 사용 중지됩니다. 앱이 Depth API를 사용하도록 하려면 깊이 모드를 사용 설정하세요.
자바
Config config = session.getConfig(); // Check whether the user's device supports Depth. if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) { // Enable depth mode. config.setDepthMode(Config.DepthMode.AUTOMATIC); } session.configure(config);
Kotlin
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) { session.configure(session.config.apply { depthMode = Config.DepthMode.AUTOMATIC }) }
최신 원시 심도 및 신뢰도 이미지 획득
frame.acquireRawDepthImage16Bits()
를 호출하여 최신 원시 심도 이미지를 가져옵니다. Raw Depth API를 통해 반환된 모든 이미지 픽셀에 깊이 데이터가 포함되는 것은 아니며, ARCore 프레임마다 새로운 RAW 심도 이미지가 포함되지는 않습니다. 현재 프레임의 원시 심도 이미지가 새로운 것인지 확인하려면 해당 타임스탬프를 이전 원시 심도 이미지의 타임스탬프와 비교하면 됩니다. 타임스탬프가 다른 경우 원시 깊이 이미지는 새로운 깊이 데이터를 기반으로 합니다. 그렇지 않으면 깊이 이미지는 이전 깊이 데이터를 다시 투영한 것입니다.
신뢰 이미지를 획득하려면 frame.acquireRawDepthConfidenceImage()
를 호출합니다. 신뢰 이미지를 사용하여 각 원시 심도 픽셀의 정확성을 확인할 수 있습니다. 신뢰도 이미지는 Y8 형식으로 반환됩니다. 각 픽셀은 부호 없는 8비트 정수입니다. 0
은 가장 낮은 신뢰도를 나타내고 255
은 가장 높은 신뢰도를 나타냅니다.
자바
// Use try-with-resources, so that images are released automatically. try ( // Depth image is in uint16, at GPU aspect ratio, in native orientation. Image rawDepth = frame.acquireRawDepthImage16Bits(); // Confidence image is in uint8, matching the depth image size. Image rawDepthConfidence = frame.acquireRawDepthConfidenceImage(); ) { // Compare timestamps to determine whether depth is is based on new // depth data, or is a reprojection based on device movement. boolean thisFrameHasNewDepthData = frame.getTimestamp() == rawDepth.getTimestamp(); if (thisFrameHasNewDepthData) { ByteBuffer depthData = rawDepth.getPlanes()[0].getBuffer(); ByteBuffer confidenceData = rawDepthConfidence.getPlanes()[0].getBuffer(); int width = rawDepth.getWidth(); int height = rawDepth.getHeight(); someReconstructionPipeline.integrateNewImage(depthData, confidenceData, width, height); } } catch (NotYetAvailableException e) { // Depth image is not (yet) available. }
Kotlin
try { // Depth image is in uint16, at GPU aspect ratio, in native orientation. frame.acquireRawDepthImage16Bits().use { rawDepth -> // Confidence image is in uint8, matching the depth image size. frame.acquireRawDepthConfidenceImage().use { rawDepthConfidence -> // Compare timestamps to determine whether depth is is based on new // depth data, or is a reprojection based on device movement. val thisFrameHasNewDepthData = frame.timestamp == rawDepth.timestamp if (thisFrameHasNewDepthData) { val depthData = rawDepth.planes[0].buffer val confidenceData = rawDepthConfidence.planes[0].buffer val width = rawDepth.width val height = rawDepth.height someReconstructionPipeline.integrateNewImage( depthData, confidenceData, width = width, height = height ) } } } } catch (e: NotYetAvailableException) { // Depth image is not (yet) available. }
다음 단계
- RAW Depth Codelab을 통해 원시 깊이로 자체 앱을 빌드하는 방법을 알아봅니다.