当前位置: 首页 > news >正文

嵌入式安卓开发:使用Camera2获取相机

文章目录

  • Camera2介绍
  • Camera2的主要API类介绍
    • CameraManager
    • 通过CameraManage获取Cameracharacteristics
    • 通过CameraManage获取CameraDevice
    • 从CameraDevice获取CameraCaptureSession
    • 预览效果
  • 参考

Camera2介绍

  • Android 5.0开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2),并且废弃了旧的相机框架 Camera1(android.hardware.Camera)
  • Camera2相比于Camera的API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。
  • Camera2相比于Camera更加灵活的同时,也更加的复杂,包含的类更多。

Camera2的主要API类介绍

Camera2获取相机涉及的类如下:
在这里插入图片描述

CameraManager

摄像头管理器。这是一个全新的系统管理器,专门用于检测系统摄像头、打开系统摄像头。除此之外,调用CameraManager的getCameracharacteristics(String)方法即可获取指定摄像头的相关特性。代码如下:

	private int mCameraId = CameraCharacteristics.LENS_FACING_FRONT;//后置相机的IDString MyCameraIdStr = Integer.toString(mCameraId);private CameraManager mCameraManager;   //相机管理者private CameraCharacteristics mCameraCharacteristics;   //相机属性float EXPOSURE_TIME_RANGE_min_hz = 0, EXPOSURE_TIME_RANGE_max_hz = 0;Range EXPOSURE_TIME_RANGE_msg;//相机曝光时间范围,不可改变int CameraInfo_FPS_min, CameraInfo_FPS_max;Range[] CameraInfo_FPS_Range;int CameraInfo_ISO_min, CameraInfo_ISO_max;float[] CameraInfo_Aperture;float CameraInfo_Focal_Length[];boolean FlagOfCreate = false;private void CreateCamera() {   //获取CameraManager,得到相机参数mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);try {mCameraCharacteristics = mCameraManager.getCameraCharacteristics(MyCameraIdStr);Log.d("曝光补偿范围", mCameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE).toString());//上述语句获取相机设备支持的曝光补偿范围Log.d("快门时间", mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE).toString());} catch (CameraAccessException e) {e.printStackTrace();}FlagOfCreate = true;EXPOSURE_TIME_RANGE_msg = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);EXPOSURE_TIME_RANGE_max_hz = (float) (1000000000.0 / (long) EXPOSURE_TIME_RANGE_msg.getLower());EXPOSURE_TIME_RANGE_min_hz = (float) (1000000000.0 / (long) EXPOSURE_TIME_RANGE_msg.getUpper());
//        Log.d("测试:",String.format("%d",EXPOSURE_TIME_RANGE_msg.getLower()));
//        CameraInfo_FPS_min = (Range[])(mCameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES))CameraInfo_FPS_Range = mCameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);CameraInfo_FPS_min = (int) CameraInfo_FPS_Range[0].getLower();CameraInfo_FPS_max = (int) CameraInfo_FPS_Range[CameraInfo_FPS_Range.length - 1].getUpper();
//        for(int i = 0; i < CameraInfo_FPS_Range.length; ++ i)
//        {
//            Log.d("帧率:",CameraInfo_FPS_Range[i].toString());
//        }CameraInfo_ISO_min = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE).getLower();CameraInfo_ISO_max = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE).getUpper();CameraInfo_Aperture = mCameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES);CameraInfo_Focal_Length = mCameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
//}public void BtnClick_CameraInfo(View v) {if (FlagOfCreate != true) {CreateCamera();}String msg = "";msg += "快门速度:" + String.format("%.4f,%.4f", EXPOSURE_TIME_RANGE_min_hz, EXPOSURE_TIME_RANGE_max_hz) + "赫兹\n";msg += "相机帧率:" + String.format("%d,%d", CameraInfo_FPS_min, CameraInfo_FPS_max) + " fps\n";msg += "ISO::" + String.format("%d,%d", CameraInfo_ISO_min, CameraInfo_ISO_max) + "\n";msg += "光圈:";for (int i = 0; i < CameraInfo_Aperture.length; ++i) {msg += String.format("%f,", CameraInfo_Aperture[i]);}msg += "\n";msg += "焦距:";for (int i = 0; i < CameraInfo_Focal_Length.length; ++i) {msg += String.format("%f,", CameraInfo_Focal_Length[i]);}msg += "\n";TextMsg.setText(msg);//        Log.d("CameraInfo","WCC");}

运行结果如下:
在这里插入图片描述

可以发现相机的光圈只有一个值,即手机的摄像头光圈是固定的,只有一个光圈值。

通过CameraManage获取Cameracharacteristics

摄像头特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性。

相比于旧 API 中的 CameraInfo 类。Cameracharacteristics包括:

曝光补偿(Exposure compensation)、
自动曝光/自动对焦/自动白平衡模式(AE / AF / AWB mode)、
自动曝光/自动白平衡锁(AE / AWB lock)、
自动对焦触发器(AF trigger)、
拍摄前自动曝光触发器(Precapture AE trigger)、
测量区域(Metering regions)、
闪光灯触发器(Flash trigger)、
曝光时间(Exposure time)、
感光度(ISO Sensitivity)、
帧间隔(Frame duration)、
镜头对焦距离(Lens focus distance)、
色彩校正矩阵(Color correction matrix)、
JPEG 元数据(JPEG metadata)、
色调映射曲线(Tonemap curve)、
裁剪区域(Crop region)、
目标 FPS 范围(Target FPS range)、
拍摄意图(Capture intent)、
硬件视频防抖(Video stabilization)等。

在上段的例程中,我们展示了通过CameraManage获取CameraCharacteristics,并显示在界面上。
想更详细地了解相关信息,可以参考:
Android Camera2 之 CameraCharacteristics 详解
官方介绍链接

通过CameraManage获取CameraDevice

在最上面的流程图中,CameraManage只是从Context获取摄像头,并进行管理,此时我们可以获取相机的一些参数。如果想进行拍照获取图像,则还需要获取CameraDevice类对象。
CameraDevice通过CameraManage的openCamera方法在回调函数中获取打开的摄像头,具体代码如下:

	CameraDevice.StateCallback MyDeviceCallback; //摄像头监听,在回调中获取camera deviceCameraDevice MyCameraDevice;MyDeviceCallback = new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull CameraDevice camera) {//@NonNull后,便会自动对该参数值进行判空。Log.d("Camera调试:", "成功获取Camera Device");MyCameraDevice = camera;takePreview();//获取Camera device后,从Camera device获取Capture Session}@Overridepublic void onDisconnected(@NonNull CameraDevice camera) {Log.d("Camera调试:", "获取Camera Device失败");}@Overridepublic void onError(@NonNull CameraDevice camera, int error) {Log.d("Camera调试:", "获取Camera Device错误");}
};

首先,我们声明了一个CameraDevice.StateCallback类型的对象,该对象的作用是在执行CameraDevice.OpenCamera方法时,将该回调对象传进去,执行OpenCamera后,会自动地调用该回调函数对象。如下:

	if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {Log.d("相机调试:", "没有权限");return;}try {mCameraManager.openCamera(MyCameraIdStr, MyDeviceCallback, null);//打开相机,监听回调,在回调函数中获取camera device} catch (CameraAccessException e) {Log.e("相机错误:", "打开摄像头失败");}

从CameraDevice获取CameraCaptureSession

CameraCaptureSession的作用是控制相机进行预览或者拍照,可以通过CameraDevice的createCaptureSession方法创建,代码如下:

	CameraCaptureSession MyCameraCaptureSession;    //由CameraDvice创建,控制摄像头预览或拍照List<Surface> surfaces;surfaces = new ArrayList<>();surfaces.add(MySurfaceView.getHolder().getSurface());
try {/** 参数* outputs 相机流输出的地方* callback* handler 表示 createCaptureSession 代码运行所在的线程,传null,表示运行在当前线程*/MyCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {MyCameraCaptureSession = cameraCaptureSession;Log.d("MyCameraDevice.createCaptureSession:","成功获取CameraCaptureSession");}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {Log.d("MyCameraDevice.createCaptureSession:", "获取camera capture session错误");}
}, null);
} catch (CameraAccessException e) {
Log.e("开启预览:", "错误,不能访问摄像头");
}

其中createCaptureSession的第一个参数surfaces是指明预览数据流输出的地方,这里我们从界面上获取一个SurfaceView,将SurfaceView目前的Surface放入List surfaces,作为形参传给createCaptureSession,至此,就可以在界面上看到预览的效果了。

预览效果

如下图所示:
在这里插入图片描述

参考

android camera2 详解说明(一)
Camera2 教程 一概览
Android:Camera2的简单使用
Camera参考详述
camera2使用相机

相关文章:

嵌入式安卓开发:使用Camera2获取相机

文章目录 Camera2介绍Camera2的主要API类介绍CameraManager通过CameraManage获取Cameracharacteristics通过CameraManage获取CameraDevice从CameraDevice获取CameraCaptureSession预览效果 参考 Camera2介绍 从Android 5.0开始&#xff0c;Google 引入了一套全新的相机框架 Ca…...

阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器&#xff0c;3.2 GHz睿频&#xff0c;g8i实例采用阿里云全新CIPU架构&#xff0c;可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…...

设计模式——组件协作模式之观察者模式

文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案&#xff0c;最朴素的方式②、第二种方案&#xff0c;重构使得遵循DIP原则&#xff1a;③、进一步的小优化&#xff1a;④、修改使得支持多个观察者&#xff1a; 4、结…...

观察者设计模式知多少

目录 目标 概述 实现 推设计模式 拉设计模式 被动观察者设计模式 目标 熟悉观察者设计模式&#xff0c;了解观察者设计模式的使用场景、具体实现&#xff08;包括&#xff1a;推设计模式、拉设计模式、被动观察者设计模式&#xff09;。 概述 一、行为设计模式 行为设…...

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况&#xff0c;ck decline和ck expire: &#xff08;1&#xff09;ck decline 发生ck decline情况时&#xff0c;我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…...

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知&#xff0c;任何一份工作都有试用期&#xff0c;一般是三月左右。但如果你遇到试用期达到半年的公司&#xff0c;你会不会进入&#xff1f; 近日&#xff0c;就有人遇到了此类公司&#xff0c;并对是否要进入该公司犹豫不决。他在论坛上发帖求助&#xff1a;大家是怎…...

单例模式的四种创建方式

前言 单例模式是日常开发中最常见的一种设计模式&#xff0c;常用来做为池对象&#xff0c;或者计数器之类的需要保证全局唯一的场景。 单例模式的目的是保证在整个程序中只存在一个对象实例&#xff0c;使用单例一个前提条件就是构造器私有化&#xff0c;不允许通过new 对象…...

Nginx+Keepalived 中的脑裂现象

如何解决和预防 NginxKeepalived 中会出现的脑裂现象? Nginx是一种高性能的Web服务器和反向代理服务器&#xff0c;可以处理大量并发请求。Keepalived是一种开源软件&#xff0c;用于实现IP负载均衡和故障转移。在Nginx和Keepalived结合使用时&#xff0c;可以通过将多个Ngin…...

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…...

110页智慧农业解决方案(农业信息化解决方案)(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 第一部分 智慧农业概述 智慧农业以农业资源为基础、市场为导向、效益为中心、产业化为抓手&#xff0c;面向农业管理部门、农技推广部门、农业企业、农业园区和基地、农业专…...

Java知识体系及聊天室程序

Java知识体系结构梳理如下&#xff1a; 基础语法&#xff1a;Java的基本语法&#xff0c;包括数据类型、运算符、控制语句、数组等。 面向对象编程&#xff1a;Java是一种面向对象的编程语言&#xff0c;需要掌握类、对象、继承、多态等概念。 异常处理&#xff1a;Java提供了…...

java的详细发展历程

Java是一种跨平台、面向对象的编程语言&#xff0c;具有简单性、可移植性、安全性等特点。Java的历史可以追溯到上世纪90年代初期&#xff0c;以下是Java的详细发展历程&#xff1a; 1991年&#xff0c;Sun Microsystems公司的James Gosling和他的团队开始开发一种名为Oak的编程…...

丢石子

I 一堆石子有n个,两人轮流取.先取者第1次可以取任意多个&#xff0c;但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". 思路&#xff1a; 任何正整数都可以表示为不连续斐波那契…...

skywalking手动上报一些指标信息

skywalking的相关概念我就不介绍了&#xff0c;有兴趣可以参看官网文档 以下提供以下简单示例手工上报一些对问题排查比较有用的一些信息。当然这些内容你也可以写成探针插件的形式&#xff0c;怎么开发探针插件也自行参考官方文档。此处仅在项目框架层面提供一些简单的示例&am…...

NUMA详解

目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数&#xff1a; 查看每个NUMA节点的CPU使用情况&#xff1a; 看每个NUMA节点的内存使用情况&#xff1a; 查看NUMA下指定进程的运行情况 创建…...

H68K在Armbina系统下开AP

背景需求替代路由器,网上找了一大堆都不行 最后成功开启了AP 参考了两篇文章, 一篇是如何创建热点, 一篇是如何开启5G 树莓派4B创建5Ghz WiFi热点 – 风声 https://www.hncldz.com/2020/02/01/%e6%a0%91%e8%8e%93%e6%b4%be4b%e5%88%9b%e5%bb%ba5ghz-wifi%e7%83%ad%e7%82%b…...

还不懂Redis?看完这个故事就明白了!

还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…...

Haproxy负载均衡集群

1.Haproxy支持四层和七层 2.haproxy常用的调度算法&#xff1f; 3.LSV/NGINX/HAPROXT的区别&#xff1f; 4. 5.Haproy负载均衡部署 实验需求 利用Haproxy的运用配置出负载均衡调度器&#xff0c;以此来调用两台Nginx服务器进行工作 实验所需组件 Haproxy服务器&#xff1a;192…...

17.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

说明书 MATLAB代码&#xff1a;计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度 关键词&#xff1a;碳捕集 虚拟电厂 需求响应 优化调度 电转气协同调度 参考文档&#xff1a;《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》完全复现 仿真平台&#xff1a…...

企业数字化管理中,数据治理到底怎么“治”

随着信息化、数字化的理念、技术及其应用在社会的方方面面进行扩散&#xff0c;数据的规模和丰富程度已经达到了一个新的高度&#xff0c;所以当下如何更进一步利用好数据&#xff0c;充分发挥数据的价值&#xff0c;将其真正变为高质量的数据资产成为了企业要面对的重要问题&a…...

GitHub 协作完全指南:从“傻瓜”到专家的保姆级教程

引言&#xff1a;为什么协作会让人头疼&#xff1f;想象一下&#xff0c;你和其他几个人要一起画一幅巨大的壁画。每个人都在自己的小画板上画一部分。问题来了&#xff1a;怎么保证大家用的颜色一致&#xff1f;怎么把每个人的画拼到一起时严丝合缝&#xff1f;如果两个人画了…...

别再用默认筛选器了!用Tableau集和计算字段打造“老板最爱看”的交互仪表板

别再用默认筛选器了&#xff01;用Tableau集和计算字段打造“老板最爱看”的交互仪表板 每次给管理层汇报数据时&#xff0c;最怕遇到什么场景&#xff1f;当你精心准备了20页分析报告&#xff0c;老板却直接翻到最后一页说&#xff1a;"我只关心A事业部和B事业部的表现&a…...

如何快速配置PlotSquared:Minecraft领地管理完整教程

如何快速配置PlotSquared&#xff1a;Minecraft领地管理完整教程 【免费下载链接】PlotSquared PlotSquared - Reinventing the plotworld 项目地址: https://gitcode.com/gh_mirrors/pl/PlotSquared 你是否厌倦了Minecraft服务器中混乱的建筑和领地冲突&#xff1f;想要…...

2025届学术党必备的五大AI论文平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对AI写作工具标题的创作&#xff0c;要精准去把握目标客户的核心需求&#xff0c;目标客户…...

安全测试入门指南:Web应用常见漏洞及测试方法

在Web应用蓬勃发展的当下&#xff0c;其安全性愈发成为软件测试领域的核心关注点。对于软件测试从业者而言&#xff0c;精准识别Web应用中的常见漏洞&#xff0c;并掌握科学有效的测试方法&#xff0c;是保障应用安全、维护用户信任的关键。本文将从专业角度&#xff0c;深入剖…...

从3D打印机到机械臂:聊聊步进电机选型时,那些容易被忽略的‘动态指标’(附避坑清单)

从3D打印机到机械臂&#xff1a;步进电机选型中那些被低估的动态性能指标 在自动化设备和精密运动控制领域&#xff0c;步进电机因其开环控制特性、高性价比和易于集成的特点&#xff0c;成为3D打印机、CNC机床、机械臂等设备的首选驱动元件。然而&#xff0c;许多工程师在选型…...

【亲测免费】 探索U-Net多类别图像分割:基于PyTorch的开源利器

探索U-Net多类别图像分割&#xff1a;基于PyTorch的开源利器 【下载地址】U-Net多类别训练代码基于PyTorch 本仓库提供了一个基于PyTorch实现的U-Net模型代码&#xff0c;适用于多类别图像分割任务。你可以使用该代码训练自己的数据集&#xff0c;实现对图像中不同类别的精确分…...

B站m4s转MP4终极指南:一键解决缓存视频兼容性问题

B站m4s转MP4终极指南&#xff1a;一键解决缓存视频兼容性问题 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困扰&#…...

Windows触控板驱动终极实战:让苹果设备在Windows平台重获新生

Windows触控板驱动终极实战&#xff1a;让苹果设备在Windows平台重获新生 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touc…...

告别传统编程:用AI语音命令5倍速开发Godot游戏

告别传统编程&#xff1a;用AI语音命令5倍速开发Godot游戏 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP 还在为复杂的…...