Jetpack - CameraX

Android CameraX 仿一甜相机(录像、拍照、可调节尺寸、聚焦、照明、网格线),最全的CameraX教程 CameraX 是jetpack 组件库中的一个非常重要的API,不同于Camera和Camera2,CameraX 在api解耦性上做出了非常大的调整。以上的一些新增内容,足够我们去替换老板本的Camera或者Camera2 Api。由于本人的设备不支持扩展程序,所以就没有展示效果了,希望国能厂商能升级ROM 支持一下吧。3、绑定ImageCapture图形捕捉以及VideoCapture视频帧捕捉。基于以上的point 创建方式,可以封装为自动聚焦和手动聚焦。11、Extensions 扩展程序使用。. 阅读详情

官方介绍

参考文章

一、概念

CameraX 解决了由于碎片化问题在不同机型上保持一致性体验的麻烦, 只需要关心 API 调用,不需要对不同机型做适配。CameraX 把不同的功能,如 预览、拍照等功能封装成不同的 UseCase,这样就可以根据业务的需要,来绑定不同的 UseCase 来实现具体的功能。Camera2 库是更底层开发用到的,它的上一代 Camera 库已废弃。

PreviewView 控件一种可以剪裁、缩放和旋转以确保正确显示的 View,当相机处于活动状态时,图片预览会流式传输到 PreviewView 中的 Surface。
CameraSelector选择或切换镜头(切换需要重新绑定)。
UserCasePreview 预览接收用于预览的 Surface,如 PreviewView。
ImageCapture 图片拍摄拍摄并保存图片,可以设置大小、曝光度。
VideoCapture 视频拍摄拍摄视频和音频。
ImageAnalysis 分析提供可访问的缓冲区,用来图像识别(人脸、二维码)、机器学习。

1.1 需求划分

Intent

基本拍摄

使用 Intent 方式跳转自带相机来拍照/录像,详见Activity Result API。

CameraController

简单使用

在单个类中提供大多数 CameraX 核心功能。它只需少量设置代码,并且可自动处理相机初始化、用例管理、目标旋转、点按对焦、双指张合缩放等操作。扩展 CameraController 的具体类为 LifecycleCameraController。

CameraProvider

进阶使用

Intent 代码举例

class MainActivity : AppCompatActivity() {
    val takePictureLauncher = registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap ->
        //TODO...
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        takePictureLauncher.launch(null)
    }
}

CameraController 代码举例

private fun initCameraX() {
    previewView = binding.previewView
    cameraController = LifecycleCameraController(this)
    cameraController.bindToLifecycle(this)
    cameraController.cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
    previewView.controller = cameraController
    //其它可配置项详见 CameraProvider 的 ImageCapture,举例2个
    cameraController.imageCaptureMode = ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY
    cameraController.imageCaptureFlashMode = ImageCapture.FLASH_MODE_AUTO
}

fun takePhoto() {
    //切换模式
    cameraController.setEnabledUseCases(CameraController.IMAGE_CAPTURE or CameraController.IMAGE_ANALYSIS)
    //后续API调用步骤详见 CameraController 的 ImageCapture,一样的。
}
fun startRecording() {
    //切换模式
    cameraController.setEnabledUseCases(CameraController.VIDEO_CAPTURE)
}

二、初始化

2.1 添加依赖

最新版本

def camerax_version = "1.4.0-beta02"
implementation "androidx.camera:camera-camera2:$camerax_version"
//避免手动在生命周期释放和销毁数据
implementation "androidx.camera:camera-lifecycle:$camerax_version"
//用里面的PreviewView,它会自行判断用SurfaceView还是TextureView来实现
implementation "androidx.camera:camera-view:$camerax_version"
//可实现人像、HDR、夜间和美颜、滤镜但依赖于OEM
implementation "androidx.camera:camera-extensions:$camerax_version"

2.2 权限声明

//any可以使用设备上的任何一个摄像头,确保设备配有相机。
<uses-feature android:name="android.hardware.camera.any" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
   android:maxSdkVersion="28" />

3.3 日志打印(可选配置)

class APP : Application(), CameraXConfig.Provider {
    override fun getCameraXConfig(): CameraXConfig {
        return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig())
            .setMinimumLoggingLevel(Log.ERROR)
            .build()
    }
}

三、预览 Preview

  1. 将 PreviewView 添加到布局中。
  2. 获取 CameraProvider 并检查可用性。
  3. 创建 CameraSelector 选择镜头。
  4. 创建 Preview 用例并连接到 PreviewView。
  5. 绑定用例和生命周期。
<androidx.camera.view.PreviewView
	android:id="@+id/previewView"
	android:layout_width="match_parent"
	android:layout_height="match_parent"/>
private fun startCamera() {
    //获取实例
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    //添加监听器,摄像头准备好后执行(监听CameraX初始化完成)
    //传入一个Runnable和一个主线程运行的Executor
    cameraProviderFuture.addListener({
        val cameraProvider = cameraProviderFuture.get() //用来绑定生命周期
        //设置CameraSelector(或直接赋值CameraSelector.DEFAULT_BACK_CAMERA)
        val cameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build()
        //设置Preview用例
        val preview = Preview.Builder().build().apply {
                surfaceProvider = previewView.surfaceProvider  //设置预览的控件,previewView是xml中的PreviewView控件的id
            }
        try {
            //重新绑定前先解绑所有用例
            //取消当前已经绑定的摄像头设备,释放它们的资源,以便其他应用或者进程可以使用这些摄像头设备。
            //这个方法通常在摄像头应用程序退出或者暂停时调用,以确保摄像头设备不会一直占用系统资源。
            cameraProvider.unbindAll()
            //与当前生命周期绑定,以便在应用程序暂停或停止时自动释放相机资源
            //传入 LifecycleOwner、CameraSelector、以及N个用例(UserCase)
            //返回一个Camera对象,进而可以获取CameraInfo(用来查询信息状态)和CameraControl(用来对所有输出结果产生统一影响的操作)对象
            val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)
        } catch (e: Exception) {
            Log.e("CameraX", "绑定用例失败", e)
        }
    }, mainExecutor)    //或写成ContextCompat.getMainExecutor(this)
}

3.1 帧率

setTargetFrameRate()

public Builder setTargetFrameRate(Range<Integer> targetFrameRate)

取值范围:30-60FPS。

val preview = Preview.Builder()
    .setTargetFrameRate(Range(30, 60)) //帧率范围:30-60 FPS
    .build()

3.2 旋转方向

默认情况下,摄像头的旋转角度会设置为与显示屏旋转角度保持一致,来确保生成的输出与预览中看到的一致。

setTargetRotation()

public Builder setTargetRotation(int rotation)

CameraX 会自动处理设备旋转,也可以手动调整。

监听方式一:旋转后会崩溃报错调用方法的对象为null。20251016

val preview = Preview.Builder()
    .setTargetRotation(previewView.display.rotation) // 根据屏幕方向设置旋转
    .build()
//在 Activity 中监听设备旋转并更新预览方向
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    updatePreviewRotation()
}

private fun updatePreviewRotation() {
    val rotation = previewView.display.rotation
    preview.targetRotation = rotation
}

监听方式二

override fun onCreate(savedInstanceState: Bundle?) {
    val orientationEventListener = object : OrientationEventListener(this) {
        override fun onOrientationChanged(orientation : Int) {
            val rotation : Int = when (orientation) {
                in 45..134 -> Surface.ROTATION_270
                in 135..224 -> Surface.ROTATION_180
                in 225..314 -> Surface.ROTATION_90
                else -> Surface.ROTATION_0
            }
            //这里设置方向
            imageCapture.targetRotation = rotation
            preview.targetRotation = rotation
        }
    }
    orientationEventListener.enable() //记得在onDestroy()中关闭
}

3.3 宽高比(已过时)

setTargetAspectRatio()

public Builder setTargetAspectRatio(int aspectRatio)

RATIO_DEFAULT:自适应(默认)

RATIO_16_9:十六比九。

RATIO_4_3:四比三。

val preview = Preview.Builder()
    .setTargetAspectRatio(AspectRatio.RATIO_16_9) // 设置 16:9 宽高比
    .build()

3.4 预览分辨率(已过时)

setTargetResolution()

public Builder setTargetResolution(Size resolution)

CameraX 会自动选择最接近的分辨率,,也可以手动设置。

val preview = Preview.Builder()
    .setTargetResolution(Size(1280, 720)) //预览分辨率
    .build()

四、拍照 ImageCapture

  1. 创建 ImageCapture 用例,抽取成全局变量并绑定用例。
  2. 创建 OutputFileOptions,指定文件存储路径(MediaStore、File、OutputStream)。
  3. 调用 takePicture() 函数并处理回调。
//抽取成成员变量
private var imageCapture: ImageCapture? = null
//同Preview一样在cameraProviderFuture中添加用例并绑定到生命周期
private fun startCamera() {
    imageCapture = ImageCapture.Builder().build()
    val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
}
private fun takePhoto() {
    val imageCapture = imageCapture ?: return
    //存储路径和参数
    val time = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(System.currentTimeMillis())
    val fileName = "CameraX_${time}"    //这里不用加格式后缀
    val contentValues = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
        put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")    //指定文件格式会自动加后缀
        //Android10以后可以指定相对目录(否则默认保存在Picture根目录)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            put(MediaStore.Images.Media.RELATIVE_PATH, "${Environment.DIRECTORY_PICTURES}/CameraX")
        } 
    }
    //保存在 MediaStore 中,以便其他应用可以显示它
    //重载还可以使用 File 或 OutputStream 的方式输出
    val outputOptions = ImageCapture.OutputFileOptions.Builder(
        contentResolver,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        contentValues
    ).build()
    //拍照后的回调函数
    imageCapture.takePicture(outputOptions, mainExecutor, object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
            //可以拿到Uri
            val uri = outputFileResults.savedUri
        }
        override fun onError(exception: ImageCaptureException) {
            TODO("Not yet implemented")
        }
    })
}
//举例使用File保存,但不会被添加到媒体数据库中,需使用 MediaScannerConnection.scanFile()
val file = File(getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName)
val outputOptions = ImageCapture.OutputFileOptions.Builder(file).build()

4.1 拍摄模式

setCaptureMode()

public Builder setCaptureMode(int captureMode)

CAPTURE_MODE_MINIMIZE_LATENCY:优先降低拍照延迟。

CAPTURE_MODE_MAXIMIZE_QUALITY:优先提高照片质量。

CAPTURE_MODE_ZERO_SHUTTER_LAG:更低延迟。

val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

4.2 闪光灯模式

setFlashMode()

public Builder setFlashMode(int flashMode)

FLASH_MODE_OFF:关闭闪光灯。

FLASH_MODE_ON:开启闪光灯。

FLASH_MODE_AUTO:根据环境光线自动决定是否开启闪光灯。

val imageCapture = ImageCapture.Builder()
    .setFlashMode(ImageCapture.FLASH_MODE_AUTO)
    .build()
//也可以动态修改
imageCapture.flashMode = ImageCapture.FLASH_MODE_ON

4.3 输出分辨率(已过时)

setTargetResolution()

public Builder setTargetResolution(Size resolutio)

可以控制输出照片的尺寸。

4.4 宽高比(已过时)

setTargetAspectRatio()

public Builder setTargetAspectRatio(int aspectRatio)

不同设备的摄像头支持的宽高比可能不同,使用 RATIO_DEFAULT 可以自动选择最适合当前设备的宽高比。

RATIO_DEFAULT:自适应(默认)

RATIO_16_9:十六比九。

RATIO_4_3:四比三。

val imageCapture = ImageCapture.Builder()
    .setTargetAspectRatio(AspectRatio.RATIO_DEFAULT)
    .build()
//获取设备默认宽高比
cameraProviderFuture.addListener({
    val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
    val cameraInfo = camera.cameraInfo
    val supportedAspectRatios = cameraInfo.supportedAspectRatios
    if (supportedAspectRatios.contains(AspectRatio.RATIO_4_3)) {
        Log.d("CameraX", "设备支持 4:3 宽高比")
    }
    if (supportedAspectRatios.contains(AspectRatio.RATIO_16_9)) {
        Log.d("CameraX", "设备支持 16:9 宽高比")
    }
}, ContextCompat.getMainExecutor(this))

4.5 旋转方向

setTargetRotation()

public Builder setTargetRotation(int rotation)

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(previewView.display.rotation) // 根据屏幕方向设置旋转
    .build()

4.6 JEPG质量

setJpegQuality()

public Builder setJpegQuality(int jpegQuality)

取值范围:1-100。

val imageCapture = ImageCapture.Builder()
    .setJpegQuality(90) //取值范围1-100
    .build()

五、录像 VideoCapture

Recoder是与 VideoCapture 紧密耦合的 VideoOutput 实现。 Recorder 用于执行视频和音频捕获操作。应用通过 Recorder 创建录制对象。
PendingRecording 会配置录制对象,同时提供启用音频和设置事件监听器等选项。您必须使用 Recorder 来创建 PendingRecording。PendingRecording 不会录制任何内容。
Recording会执行实际录制操作。您必须使用 PendingRecording 来创建 Recording。
//抽取成成员变量
private var videoCapture: VideoCapture<Recorder>? = null
//同Preview一样在cameraProviderFuture中添加用例并绑定到生命周期
private fun startCamera() {
    val recorder = Recorder.Builder()
        .setQualitySelector(QualitySelector.from(Quality.FHD))
        .build()
    videoCapture = VideoCapture.withOutput(recorder)
    val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, videoCapture)
}
//抽取成成员变量
private var recoding: Recording? = null

fun recoding(context: Context) {
    val videoCapture = videoCapture ?: return
    //正在录制就停止
    recoding?.let { 
        it.stop()
        recoding = null
    }

    val contentResolver = context.contentResolver
    val time = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(System.currentTimeMillis())
    val fileName = "CameraX_${time}"
    val contentValues = ContentValues().apply {
        put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
        put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
    }
    val outputOptions = MediaStoreOutputOptions.Builder(
        contentResolver,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    ).setContentValues(contentValues).build()

    recoding = videoCapture.output
        .prepareRecording(context, outputOptions)
        .withAudioEnabled()
        .start(context.mainExecutor) { event ->

        }
}

六、分析 ImageAnalysis

七、Camera

CameraProvider 绑定生命周期时会返回一个 Camera 对象,进而获取 CameraInfo 和 CameraControl 对象。

val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
val cameraInfo = camera.cameraInfo
val cameraControl = camera.cameraControl

7.1 曝光补偿

setExposureCompensationIndex()

setExposureCompensationIndex(int value)

控制照片的亮度,值通常是一个范围。通过 CameraInfo 获取。

val range = cameraInfo.exposureState.exposureCompensationRange
if (range.contains(1)) {
    cameraControl.setExposureCompensationIndex(1) // 设置曝光补偿值
}

7.2 预览的缩放比

setZoomRatio()

ListenableFuture<Void> setZoomRatio(float ratio)

设置预览画面的缩放比例,以放大或缩小预览内容。

cameraControl.setZoomRatio(2.0f) // 设置缩放比例为 2.0

八、PreviewView

8.1 缩放

setScaleType()

提供了几种缩放类型,用于控制预览画面的显示方式:

FILL_CENTER:填充整个视图,可能会裁剪部分画面。

FIT_START:保持宽高比,可能会在顶部或左侧留出空白。

FIT_CENTER:保持宽高比,可能会在上下或左右留出空白。

FIT_END:保持宽高比,可能会在底部或右侧留出空白。

previewView.scaleType = PreviewView.ScaleType.FIT_CENTER
轻松实现 Android 相机功能:使用 CameraX 构建简单应用 本文介绍了android中jetpack库中的cameraX API的结构、模型和要求,并展示了如何实现一个简单cameraX相机应用,实现了拍照和录制视频功能。 阅读详情

相关推荐

为什么推荐使用Jetpack CameraX?

isBack;// 绑定前确保解除了所有绑定,防止CameraProvider重复绑定到Lifecycle发生异常。

2401_84122016的博客 396

安卓开发之camerax介绍(1)——取景器、拍摄照片、录制视频入门实战

问题背景 本文将初步介绍jetpeck库之camerax的初步基本使用,包括实现取景器、拍摄照片、录制视频三个功能用例。 问题分析 话不多说,直接上代码。 (1)项目中添加camerax相关依赖; def camerax_version = "1.1.0-beta01" implementation "androi...

baorant24的博客 3461

使用 CameraX 进行相机开发:Android 指南

相机应用是现代移动开发中常见的功能之一,它允许用户拍摄照片和录制视频。在 Android 平台上,Google 推出了 CameraX API,它简化了相机开发的复杂性,提供了易于使用的相机功能。本篇博客将带您逐步学习如何使用 CameraX API 在 Android 应用中实现相机功能,包括预览、拍照和录制视频,并展示如何处理相机参数和图像数据。相机功能在现代移动应用中非常常见,它允许用户拍摄照片和录制视频,为用户提供了丰富的拍摄体验。

2201_76125261的博客 1331

安卓CameraX的使用

注:Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。谷歌的文档只提供了Kotlin的代码示例,根据Kotlin的代码示例和文档,本文提供Java的实现。

java_t_t的博客 2804

Jetpack 二维码扫描:CameraX与ML Kit结合方案

本文旨在为Android开发者提供一套完整的二维码扫描解决方案,结合Google推荐的Jetpack组件CameraX和ML Kit,实现高性能、低功耗的二维码识别功能。我们将覆盖从基础概念到高级优化的全部内容。文章首先介绍相关技术背景,然后深入分析CameraX和ML Kit的核心原理,接着提供详细的代码实现和优化策略,最后讨论实际应用场景和未来发展方向。CameraX: Jetpack中的相机库,简化了相机功能的开发ML Kit: Google提供的移动端机器学习SDK二维码。

移动开发前沿的博客 1925

基于知识图谱的旅游推荐系统

这一系统整合了当今先进的数据技术:采集携程等大型平台的景点数据,通过爬虫技术源源不断地获取最新的旅游信息。此外,我们采用Neo4j图数据库来存储和处理这些数据,结合自然语言处理技术,为你提供精准的旅游建议。:通过直观的知识图谱展示,了解各个景点之间微妙的联系,无论是文化背景还是地理方位,你都能从中发现新的旅行灵感。准备毕业设计的同学,关注我们,这是一个集成了多种前沿技术的项目,为你的学术成果锦上添花。:不再浪费时间,系统根据你的偏好和历史评分,利用协同过滤技术推荐适合的旅游目的地。

qalangtao的博客-qalangtao.com 774

Jetpack CameraX 入门

Jetpack CameraX 文章目录Jetpack CameraX简介CameraX 结构权限权限声明动态申请要求声明依赖项[Getting Started with CameraX](https://codelabs.developers.google.com/codelabs/camerax-getting-started/#0)配置关于分辨率相机分辨率自动分辨率指定分辨率旋转方向实现预览使用 PreviewView配置 CameraXConfig.Provider将 PreviewView 添加到

K_Hello的博客 771

智能客服系统知识库构建:长尾问题解决方案全解析

智能客服系统知识库构建:长尾问题解决方案全解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4112

在 Jetpack Compose 中解锁 CameraX 的强大功能

作者 / Google 开发者关系工程师Jolanda Verhoef本文是 "相机与媒体 Spotlight Week" 系列的内容之一。此系列中,我们会提供文章、视频、示例代码等资源,以帮助您提升应用中的媒体体验。我们了解到您喜欢 CameraX 和 Jetpack Compose 库提供的强大功能,但希望使用更符合语言习惯的 Compose API 来构建相机界面。今年,我们的工程团队开发...

Android开发者 1516

跨模型的 API 调用与集成:使用 Spring AI 构建可移植的 API 代码,支持多个 AI 模型(如 OpenAI、Anthropic 等)的调用

Spring AI 是 Spring 生态系统中的一部分,旨在提供一种简单、可扩展的方式来集成人工智能模型。Spring AI 使得开发者可以使用现有的 Spring 体系结构方便地访问多种 AI 模型和服务,例如 OpenAI、Anthropic、HuggingFace 等。

秋元的博客 2404

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4411

在 Jetpack Compose 中使用 CameraX示例

在使用Jetpack Compose开发安卓应用,当在学习使用CameraX组件时发现官方提供的教程不是Compose的。与是我就记录一下,简单的示例。

lxyoucan的博客 851

Android 15.0 app进程保活白名单功能实现

在15.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 638

Android JetPack组件-CameraX初探

CameraX 又是一个 Google 推出的 JetPack 组件 ,是一个新鲜玩意儿,故给大家分享下我在项目中的使用过程心得。。 CameraX 是什么? Google 开发者文档 对 CameraX 的评价如下: CameraX是一个Jetpack支持库,旨在帮助您简化相机应用程序的开发工作。它提供一致且易于使用的API接口,适用于大多数Android设备,可以向后兼容至Android 5....

努力努力再努力O的博客 4351

《从理念到落地:Claude Code 在真实项目中的深度实践指南》基于 Anthropic 团队内部使用经验的扩展与深度解读,一篇面向工程团队的全面实践手册

Claude Code 支持通过# 创建新的 API 端点根据以下输入创建完整的 API 端点:资源名称:$ARGUMENTS请创建以下文件:1. `src/routes/{resource}.routes.ts` - 路由定义2. `src/controllers/{resource}.controller.ts` - 控制器3. `src/services/{resource}.service.ts` - 服务层。

AI天才研究院 482

基于 YOLOv8 的自动驾驶车辆障碍物检测与避障路径规划

本文探讨基于YOLOv8的自动驾驶车辆障碍物检测与避障路径规划系统。在感知层面,采用YOLOv8模型实现多类别障碍物识别,结合单目视觉距离估计和ByteTrack多目标跟踪算法,完成障碍物的稳定检测与运动状态估计。在路径规划层面,设计分层规划架构,融合全局路径规划与局部避障算法,重点实现Frenet坐标系下的采样优化算法和基于模型预测控制的实时避障轨迹生成。通过完整的代码实现与仿真实验,验证系统在复杂交通场景下的有效性与实时性,为自动驾驶开发者提供从理论到实践的完整技术参考。 关键词:YOLOv8;自动驾驶

huanghm88的专栏 248

Google Jetpack 新组件 CameraX 介绍与实践

近期,Google 的 Jetpack 组件又出了新的库:CameraX 。 顾名思义:CameraX 就是用来进行 Camera 开发的官方库了,而且后续会有 Google 进行维护和升级。这对于广大 Camera 开发工程师和即将成为 Camera 的程序员来说,真是个好消息~~~ 原文地址:glumes.com/post/androi… CameraX 介绍 官方有给出一个示例的工程,我...

weixin_33910759的博客 1048

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android Jetpack之CameraX的使用

Andoird中拍照、录像是很常见的功能,但是系统相机的Api目前发生了很大的变化,有Camera1、Camera2、CameraX三个api,每个api的使用和方法都不一样,如果做过相机开发的小伙伴应该会很头疼这三个api在不同安卓系统手机的适配,由于目前的App有一部分工作涉及到这部分,所以总结了一下,目前由基础到深入慢慢总结. 一.简介:(官方介绍如下) CameraX 是一个 Jetpack 支持库,旨在帮助您简化相机应用的开发工作。它提供一致且易用的 API 接口,适用于大多数 Android

u012556114的博客 3540

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jetpack的camerax_Android开发-Jetpack组件CameraX

CameraX 是一个 Jetpack 支持库,旨在帮助您简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。虽然它利用的是 camera2 的功能,但使用的是更为简单且基于用例的方法,该方法具有生命周期感知能力。它还解决了设备兼容性问题,因此您无需在代码库中包含设备专属代码。这些功能减少了...

weixin_34061793的博客 207

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Jetpack 系列之相机CameraX的简单使用

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

Flying-the-sky的博客 821

jetpack使用_使用Jetpack CameraX

jetpack使用As a matter of fact, CameraX is a Android Jetpack support library, built to help you make camera app development much more easier. This means it supports a consistent and easy-to-use API surf...

weixin_26739079的博客 769

Android JetPack组件CameraX使用及修改显示图像

学更好的别人,做更好的自己。——《微卡智享》本文长度为3743字,预计阅读9分钟前言好久没用Kotlin写Android的代码了,刚开始写起来还有点生,不过适应了一阵也算是恢复过来了。今...

Vaccae的博客 2001

Jetpack支持库CameraX使用入门——相机预览

概览 CameraX是一个Jetpack支持库,用来帮助开发者简化相机应用的开发和适配工作,它将一系列旧的Camera和新的Camera2的相机API进行统一适配,将两套设计迥异的相机API进行适配设计,并且作为androidX并作为Jetpack的一部分再发布,用来简化开发者开发相机功能时的大量重复适配的工作。最低可以适配到API Level 21。 由于加入到了Jetpack组件当中,它也增加了一部分功能用来绑定到LifecycleOwner等API来适配到生命周期接口的能力,使得开发者无需再重复编写生

時を越える笑顔 1905
上一篇: Compose 调用 - Permission 权限申请(含ActivityResult使用)
下一篇: Kotlin - 链式调用处理返回的结果 Result
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值