android Camera 的进化
引言
Android 的camera 发展经历了3个阶段 : camera1 -》camera2 -》cameraX。
正文
Camera1
Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时,会导致整个调用线程等待;
存在的限制:
- 开发者如果想要个性化设置camera效果,无法手动设置调整参数,需要依靠第三方算法对于回调的数据进行处理(NV21)。而且不同手机的回调数据效果都是不一样的,采用第三方算法调整,通常效果不好;
- 发者所能获取的Camera状态信息有限;
camera1 的开发过程比较简单,对于常规视频采集,如果只要一般的预览功能,是没问题的,然而如果想要挖掘Camera更多的功能,camera1无法满足,于是有了camera2.
Camera2
Camera2 的开发中,camera的生命周期都是异步的,即发送请求,等待回调的client-service模式;关键回调主要是三个:
(1)CameraDevice.StateCallback ///比如线程A发送打开相机请求, 线程B中收到相机状态回调,线程B中与cameraDevice建立会话,设置参数,数据回调处理;
(2)CameraCaptureSession.StateCallback ///与CameraDevice建立会话后,收到的会话状态回调;
(3)ImageReader.OnImageAvailableListener // 开发者可以直接获取并且操作的数据回调;
特点:
- 通过跟相机建立的会话,可以更加精细的调整Camera参数:比如ISO感光度,曝光时间,曝光补偿……;
- 如果开发者想要更多自己的定制,也可以直接使用回调数据(YUV488);
- MultiCamera的支持;
Multi-Camera 的支持:
- 系统:Android P+;
- 目前支持的multi-camera的设备: Pixel 3, mate20 系列;
- Multi-Camera 新功能:
(1)更好的光学变焦:之前的方式通常使用数码变焦或者是单个摄像头的光学变焦来达到变焦的效果, 通过多摄像头的变焦方式,无论远景还是近景,都可以采到更好质量的数据。
(2)景深计算:通过多摄像头的景深不同,可以得到每一帧图片中不同物体的景深,从而更好的区分前景或者后景。应用范围:背景虚化,背景替换,现实增强。
(3)更广的视角:更广的视角带来鱼眼镜头的畸变效果,畸变矫正功能。
CaptureRequest.DISTORTION_CORRECTION_MODE
(4)人脸识别功能:跟畸变效果一样,自带人脸识别功能。应用范围:人脸裁剪,人脸特效。
CaptureResult.STATISTICS_FACE_DETECT_MODE
(5)多路流同时采集:场景包括(单摄像头输出多流,多摄像头输出多流)
normalOutputConfigImageReader.setPhysicalCameraId(normalLensId)
wideOutputConfigImageReader.setPhysicalCameraId(wideAngleId)
params.previewBuilder?.addTarget(normalSurface)
params.previewBuilder?.addTarget(wideSurface)
存在的问题:
- 更耗内存,更耗电
- 趋势:单个手机中,支持更多的摄像头
Camera2 虽然给开发者带来了相机的更多可玩性,然而android的碎片化,导致很多设备的兼容性问题频繁发生。尤其国内的手机厂商,对camera2 的支持程度各不相同,
所以Camera2的开发难度更多的是在兼容性,于是有了CameraX。
CameraX
CameraX是一个Jetpack库,旨在帮助开发者更轻松地开发相机应用。它基于Camera2 API构建,提供了更高级别的抽象和封装,简化了相机功能的实现过程。CameraX支持大多数常见的相机用例,包括预览、图片拍摄、图片分析和视频拍摄等,并且具有广泛的设备兼容性,覆盖了98%以上的现有Android设备。
- 特点:
- 更简单易用的API,更少的代码量,使开发者更专注业务的个性化实现。比如:对采集到图片做分析处理。
- 更好的兼容性,减少不同设备适配烦恼:包括宽高比、屏幕方向、旋转、预览大小和高分辨率图片大小。
- 数据分析: 开发者依然可以对数据进行个性化处理。
- 第三方Camera特效拓展:对于一些手机厂商特定实现的camera特效,开发者也可以使用。
总结
我们在开发过程中,最好还是用CameraX。
相关文章:
android Camera 的进化
引言 Android 的camera 发展经历了3个阶段 : camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时,会…...
HarmonyOS简介:应用开发的机遇、挑战和趋势
问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统,重复开发,维护多套版本 多种语言栈,对人员技能要求高 多种开发框架,不同的编程…...
反向代理模块b
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
C++并发:设计基于锁的并发数据结构
(上一篇主要讲了底层逻辑,比较晦涩难懂,这一章讲解数据结构设计) 对于并发场景,数据保护的形式主要如下: 1 采用独立互斥和外部锁 2 专门为并发访问自行设计的数据结构 1 并发设计的内涵 互斥保护数据结…...
数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)
一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…...
leetcode 844 比较含退格的字符串
leetcode 844 比较含退格的字符串 题目描述 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1&#…...
【ArcGIS遇上Python】批量提取多波段影像至单个波段
本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…...
10.6 LangChain提示工程终极指南:从基础模板到动态生成的工业级实践
LangChain提示工程终极指南:从基础模板到动态生成的工业级实践 关键词: LangChain提示模板、动态Prompt生成、少样本学习、结构化输出、Prompt工程 一、Prompt Engineering 的本质:用设计模式重构大模型交互 传统Prompt的局限性: 硬编码文本:修改需求需重构代码缺乏结构…...
DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
近年来,人工智能(AI)领域发展迅猛,大语言模型(LLMs)为通用人工智能(AGI)的发展开辟了道路。OpenAI 的 o1 模型表现非凡,它引入的创新性推理时缩放技术显著提升了推理能力…...
联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸
晚上23点10分前下单,第二天上午显示屏送到,检查外包装没拆封过。这个屏幕左下方有几个按键,按一按就开屏幕、按一按就关闭屏幕,按一按方便节省时间,也支持阅读等模式。 显示屏是 :AOC 27英寸 2K高清 100Hz…...
编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)
编译安装 前置需求: 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧,pip编译安装的时候,可以加上--jobs64来多核编译。 注意先升级pip版本:pip install pip -U pip3 install faiss-cpu --config-s…...
传输层协议TCP与UDP:深入解析与对比
传输层协议TCP与UDP:深入解析与对比 目录 传输层协议TCP与UDP:深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…...
《解码AI大模型涌现能力:从量变到质变的智能跃迁》
在当今科技飞速发展的时代,人工智能大模型的涌现能力成为了众人瞩目的焦点。从ChatGPT与用户的流畅对话,到GPT-4在复杂任务中的出色表现,这些大模型仿佛一夜之间解锁了超乎想象的技能,那么,这种神奇的涌现能力究竟是如…...
【数据结构】_C语言实现带头双向循环链表
目录 1. 单链表与双链表 1.1 单链表的结构及结点属性 1.2 双链表的结构及结点属性 2. 单链表与双链表的区别 3. 双链表的实现 3.1 List.h 3.2 List.c 3.3 Test_List.c 注:部分方法的实现细节注释 1. 双链表结点前驱、后继指针域的初始化 2. 各种增、删结…...
优盘恢复原始容量工具
买到一个优盘,显示32mb,我见过扩容盘,但是这次见到的是缩容盘,把2g的容量缩成32MB了,首次见到。。用芯片查询工具显示如下 ChipsBank(芯邦) CBM2199E 使用以下工具,恢复原始容量。。 其他CMB工具可能不行…...
JVM的GC详解
获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看,具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示,命令格式为jstat -gc…...
反转单向链表以及单链表添加节点、遍历单链表
反转1个单向链表 /*** 节点类*/ class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}Overridepublic String toString() {return "ListNode{" "val" val ", next" next };} }借助一个pre来存储每…...
ZZNUOJ(C/C++)基础练习1021——1030(详解版)
目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 (C语言版,三目运算)C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...
Linux学习笔记——系统维护命令
一、进程管理 1、ps命令(查) 来自process缩写,显示当前的进程状态。包括:进程的号码,发起者,系统资源,使用占比,运行状态等等。 语法格式:ps 参数 实例&#x…...
Harbor 部署
harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...
three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
春节忙完一轮,总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论,所以像相机矩阵推导这种网上已经很多优质文章的内容,笔者就一笔带过。 然而关于负缩放…...
开源的瓷砖式图像板系统Pinry
简介 什么是 Pinry ? Pinry 是一个开源的瓷砖式图像板系统,旨在帮助用户轻松保存、标记和分享图像、视频和网页。它提供了一种便于快速浏览的格式,适合喜欢整理和分享多种媒体内容的人。 主要特点 图像抓取和在线预览:支持从网页…...
LabVIEW透镜多参数自动检测系统
在现代制造业中,提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统,该系统能够在单一工位上完成透镜的多项质量参数检测,并实现透镜的自动搬运与分选,极大地提升了检…...
socket实现HTTP请求,参考HttpURLConnection源码解析
背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…...
反向代理模块jmh
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当…...
安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】
一、实验目的(如果代码有错漏,可查看源码) 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…...
RubyFPV开源代码之系统简介
RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍(软件)3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐(硬件)4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…...
解锁维特比算法:探寻复杂系统的最优解密码
引言 在复杂的技术世界中,维特比算法以其独特的魅力和广泛的应用,成为通信、自然语言处理、生物信息学等领域的关键技术。今天,让我们一同深入探索维特比算法的奥秘。 一、维特比算法的诞生背景 维特比算法由安德鲁・维特比在 1967 年提出…...
Unity游戏(Assault空对地打击)开发(2) 基础场景布置
目录 导入插件 文件夹整理 场景布置 山地场景 导入插件 打开【My Assets】(如果你刚进行上篇的操作,该窗口默认已经打开了)。 找到添加的几个插件,点击Download并Import x.x to...。 文件夹整理 我们的目录下多了两个文件夹&a…...
Office / WPS 公式、Mathtype 公式输入花体字、空心字
注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时,一般不用斜体,取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…...
代码随想录算法训练营第三十九天-动态规划-213. 打家劫舍 II
与上一题基本一样,只不过房间形成一个环,就需要在首尾考虑状况多一些这不是多一些状况的问题,是完全不知道如何选择的问题这种状况详细分析一下就是要分成三种情况 第一种:不考虑首元素,也不考虑尾元素,只考…...
自然语言处理-词嵌入 (Word Embeddings)
词嵌入(Word Embedding)是一种将单词或短语映射到高维向量空间的技术,使其能够以数学方式表示单词之间的关系。词嵌入能够捕捉语义信息,使得相似的词在向量空间中具有相近的表示。 📌 常见词嵌入方法 基于矩阵分解的方…...
Redis 数据备份与恢复
Redis 数据备份与恢复 引言 Redis 是一款高性能的键值对存储系统,广泛应用于缓存、消息队列、分布式锁等领域。为了保证数据的安全性和可靠性,定期对 Redis 数据进行备份与恢复是至关重要的。本文将详细介绍 Redis 数据备份与恢复的方法,帮助您更好地管理和维护 Redis 数据…...
【leetcode】T541 (两点反思)
解题反思 闷着头往,往往会写成一团浆糊,还推倒重来,谋划好全局思路再开始很重要。 熟悉C的工具库很重要,一开始看到反转就还想着用stack来着,后面突然想起来用reverse函数刚好可以用哇,这题也就迎刃而解了…...
《STL基础之vector、list、deque》
【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…...
嵌入式系统|DMA和SPI
文章目录 DMA(直接内存访问)DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI(串行外设接口)SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA(直接内存访问) 类型:DMA是一种数据传输接口…...
LevelDB 源码阅读:写入键值的工程实现和优化细节
读、写键值是 KV 数据库中最重要的两个操作,LevelDB 中提供了一个 Put 接口,用于写入键值对。使用方法很简单: leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…...
寒假刷题Day18
一、16. 最接近的三数之和 这一题有负数,没有单调性,不能“大了右指针左移,小了左指针右移,最后存值域求差绝对值”。 class Solution { public:int threeSumClosest(vector<int>& nums, int target) {ranges::sort(n…...
力扣219.存在重复元素每日一题(大年初一)
以一道简单题开启全新的一年 哈希表:我们可以使用 哈希表 来存储数组元素及其对应的索引。通过遍历数组,我们可以检查当前元素是否已经存在于哈希表中,并判断索引差是否满足条件。 具体步骤如下: 创建一个哈希表 map,…...
Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能
开篇 Midjourney中有3个图片“微调”,它们分别为: 强变化;弱变化;局部重绘; 在Discord里分别都是用命令唤出的,但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中,我们发觉这样的逆天…...
Blazor-选择循环语句
今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法,我已经创建好了一个Student类,以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示,Gender为…...
根据每月流量和市场份额排名前20 的AI工具列表
ChatGPT:由Open AI研发,是一款对话式大型语言模型。它能够理解自然语言输入,生成连贯且符合逻辑的回复。可用于文本创作,如撰写文章、故事、诗歌;还能解答各种领域的知识问题,提供翻译、代码解释等服务&…...
关于安卓greendao打包时报错问题修复
背景 项目在使用greendao的时候,debug安装没有问题,一到打包签名就报了。 环境 win10 jdk17 gradle8 项目依赖情况 博主的greendao是一个独立的module项目,项目目前只适配了java,不支持Kotlin。然后被外部集成。greendao版本…...
前端面试笔试题目(一)
以下模拟了大厂前端面试流程,并给出了涵盖HTML、CSS、JavaScript等基础和进阶知识的前端笔试题目,以帮助你更好地准备面试。 面试流程模拟 1. 自我介绍(5 - 10分钟):面试官会请你进行简单的自我介绍,包括…...
网络工程师 (10)设备管理
前言 设备管理中的数据传输控制方式是确保设备与内存(或CPU)之间高效、准确地进行数据传送的关键。 一、程序直接控制方式 1.工作原理: 由CPU发出I/O指令,直接控制数据的传输过程。CPU需要不断查询外设的状态,以确定数…...
如何让一个用户具备创建审批流程的权限
最近碰到一个问题,两个sandbox,照理用户的权限应该是一样的,结果开发环境里面我可以左右的做各种管理工作,但是使用change set上传后,另一个环境的同一个用户,没有相对于的权限,权限不足。 当时…...
unity学习23:场景scene相关,场景信息,场景跳转
目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景,在构建中包含的场景 (否则会认为是失效的Scene) 2.4 Scenes in Bui…...
【Java高并发】基于任务类型创建不同的线程池
文章目录 一. 按照任务类型对线程池进行分类1. IO密集型任务的线程数2. CPU密集型任务的线程数3. 混合型任务的线程数 二. 线程数越多越好吗三. Redis 单线程的高效性 使用线程池的好处主要有以下三点: 降低资源消耗:线程是稀缺资源,如果无限…...
全网首发,MacMiniA1347安装飞牛最新系统0.8.36,改造双盘位NAS,超详细.36,改造双盘位nas,超详细
全网首发,MacMiniA1347安装飞牛最新系统0.8.36,改造双盘位NAS,超详细 小伙伴们大家好呀,勤奋的凯尔森同学又双叒叕来啦,今天这一期也是有点特别,我们把MacMiniA1347安装飞牛最新系统0.8.36,并且…...
简要介绍C++中的 max 和 min 函数以及返回值
简要介绍C中的 max 和 min 函数 在C中,std::max 和 std::min 是标准库 <algorithm> 中提供的函数,用于比较两个或多个值并返回最大值或最小值。这些函数非常强大且灵活,支持多种数据类型(如整数、浮点数、字符串等ÿ…...