自学内容网 自学内容网

关于CameraX的详细使用

CameraX简介

  在移动应用中,集成相机功能是一个常见的需求。Google推出的CameraX库为开发者提供了一种简化且强大的方式来实现相机功能。
  本文将详细介绍CameraX的使用,包括其核心功能、配置方法以及特别是实时分析的实现。

在这里插入图片描述

目录

  1. CameraX简介
  2. 项目配置
  3. CameraX基本用法
  4. 实时分析的使用
  5. 高级功能

CameraX是一个Jetpack库,基于Camera2 API,但提供了更高层次的抽象,简化了开发过程。其优势包括:

  • 简化开发:通过简化的API接口,减少了与设备特定配置的直接交互。
  • 向后兼容:支持Android 5.0(API级别21)及以上的设备。
  • 强大的功能:支持图像捕获、视频录制、实时分析等。
  • 自动适配:自动处理设备差异,确保一致的体验。
    在这里插入图片描述

项目配置

在开始使用CameraX之前,需要进行项目配置。

添加依赖

build.gradle文件中添加CameraX库的依赖项:

dependencies {
    def camerax_version = "1.3.0-alpha06"
    implementation "androidx.camera:camera-core:$camerax_version"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation "androidx.camera:camera-view:$camerax_version"
    implementation "androidx.camera:camera-extensions:$camerax_version"
}

权限声明

AndroidManifest.xml中声明必要的权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

在运行时请求相机权限是必要的,以确保应用能够访问设备的相机硬件。


CameraX基本用法

初始化相机

CameraX的核心组件是ProcessCameraProvider,它控制相机的生命周期和用例绑定。

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

    cameraProviderFuture.addListener(Runnable {
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

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

        try {
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(
                this, cameraSelector, preview
            )
        } catch(exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }

    }, ContextCompat.getMainExecutor(this))
}

图像捕获

除了预览之外,CameraX还支持图像捕获,通过ImageCapture用例实现。

private fun takePhoto() {
    val imageCapture = ImageCapture.Builder().build()

    val photoFile = File(
        outputDirectory,
        SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg"
    )

    val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

    imageCapture.takePicture(
        outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
            override fun onError(exc: ImageCaptureException) {
                Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
            }

            override fun onImageSaved(output: ImageCapture.OutputFileResults) {
                val savedUri = Uri.fromFile(photoFile)
                Log.d(TAG, "Photo capture succeeded: $savedUri")
            }
        }
    )
}

实时分析的使用

实时分析是CameraX的一项强大功能,它允许开发者实时处理相机视频流,例如用于二维码扫描、面部识别或其他图像处理任务。通过ImageAnalysis用例实现。

设置实时分析

首先,创建一个ImageAnalysis实例,并设置其分析器:

private fun setupImageAnalysis() {
    val imageAnalysis = ImageAnalysis.Builder()
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build()

    imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), ImageAnalysis.Analyzer { imageProxy ->
        processImage(imageProxy)
    })

    val cameraProvider = ProcessCameraProvider.getInstance(this).get()
    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

    try {
        cameraProvider.unbindAll()
        cameraProvider.bindToLifecycle(this, cameraSelector, imageAnalysis)
    } catch (exc: Exception) {
        Log.e(TAG, "Binding failed", exc)
    }
}

处理图像

processImage方法中,实现图像分析的具体逻辑:

private fun processImage(imageProxy: ImageProxy) {
    // 获取图像数据
    val mediaImage = imageProxy.image
    if (mediaImage != null) {
        // 在此处进行图像处理,例如使用ML Kit进行二维码扫描或面部识别
        // val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)

        // 处理完成后关闭imageProxy
        imageProxy.close()
    }
}

在这个过程中,关键是要在处理完每一帧图像后调用imageProxy.close(),以释放资源并允许下一帧的处理。


高级功能

扩展功能

CameraX支持多种扩展功能,例如HDR、夜景模式等。这些功能可以通过camera-extensions库启用。

val hdrImageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
    .setHdrEnabled(true)
    .build()

自定义UI

CameraX提供了默认的CameraView,但开发者可以完全自定义用户界面,以满足特定的设计需求。

<androidx.camera.view.PreviewView
    android:id="@+id/viewFinder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

原文地址:https://blog.csdn.net/qq_22120623/article/details/144373875

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!