第38讲 Android Camera2 API 通过CropRegion控制Zoom缩放

2023-11-17

本讲是Android Camera专题系列的第38讲,我们介绍Android Camera2 API专题的通过CropRegion控制Zoom缩放,包括如下内容:

  1. Android Zoom简介
  2. 如何查询当前Camera支持的Zoom能力

  3. 通过Crop Region控制Digital Zoom

    1. Crop Region坐标系
    2. Crop Region应用的时机点
    3. Crop Region与输出流间的裁剪规则
    4. Crop Region精度控制
    5. Crop Region与Sensor输出大小关系
    6. Crop Region与Zoom Ratio

视频在线观看:

加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815

Android Zoom简介

Zoom就是对画面进行放大或缩小功能,分为光学变焦(Optical Zoom)和数字变焦(Digital Zoom)两种

光学变焦 数字变焦
光学变焦是通过物理光学手段来变焦的,也就是调整硬件的镜片间的距离实现的 数字变焦是软件手段,在计算机上放大图片
光学变焦是真实的像素,它可以原汁原味地还原远处的景物,而不会有什么质量损失 数字变焦是利用软件对已有像素周边的色彩进行判断,并根据周边的色彩情况插入经特殊算法加入的像素,所产生的照片是通过软件运算方式得到的
光学变焦的原理就是通过改变焦距的大小来改变图像的大小,而且光学变焦只是改变了光线传输的距离,光线本身没有变化,所以照片质量不会发生变化 数字变焦最基本的原理就是将一张已经固定的照片在进行放大,因为数码照片是使用像素组成的,所以进行变焦之后只能看到一个个的小点或者小方块

如何查询当前Camera支持的Zoom能力

CameraCharacteristics Description
SCALER_AVAILABLE_MAX_DIGITAL_ZOOM 当前Camera支持的最大数字变焦倍数
active area width / crop region width 或 active area height / crop region height能支持的最大值,也就描述了最小的crop region
当crop region小于该区域时,超出的部分会被忽略
CONTROL_ZOOM_RATIO_RANGE 当前Camera支持的变焦范围,包括数字和光学变焦的能力
maxZoom >= 1.0 >= minZoom, 当minZoom小于1时表示能增加FOV(手机上是指切到广角镜头)

通过Crop Region控制Digital Zoom

CaptureRequest#SCALER_CROP_REGION用于控制digital zoom的

Crop Region坐标系

不支持android.distortionCorrection.mode

  • Left,top = [0, 0], Right,bottom = [android.sensor.info.activeArraySize]

支持android.distortionCorrection.mode

  • distortion correction mode 是OFF
    • Left,top=[0,0], Right bottom = [android.sensor.info.preCorrectionActiveArraySize]
  • distortion correction mode 是非OFF
    • Left,top=[0,0], Right bottom = [android.sensor.info.activeArraySize]

对于支持ULTRA_HIGH_RESOLUTION_SENSOR的Camera设备,当android.sensor.pixelMode设置为SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION,参考坐标系要相应地修改为activeArraySizeMaximumResolution和preCorrectionActiveArraySizeMaximumResolution.

Crop Region应用的时机点

Crop region应用于raw转其他颜色空间(比如yuv)时,因此对raw buffer不生效

Crop Region与输出流间的裁剪规则

当crop region的宽高比与stream size的宽高比不一致时,会发生裁减

  • 如果crop region是4:3,那么4:3的stream能看到所有画面, 16:9的stream会出现垂直方向上的裁减
  • 如果crop region是16:9,那么16:9的stream能看到所有画面,4:3的stream会出现水平方向上的裁减

Crop Region裁减规则说明

  • 假设camera device的active array size为(2000,1500),且支持FREEFORM的crop

    • Active array size: 2000×1500 (3 MP, 4:3 aspect ratio)
    • Output stream #1: 640×480 (VGA, 4:3 aspect ratio)
    • Output stream #2: 1280×720 (720p, 16:9 aspect ratio)

Case #1: 4:3 crop region with 2x digital zoom

  • Crop region: Rect(500, 375, 1500, 1125) // (left, top, right, bottom)
    • 640×480 stream: (500, 375, 1500, 1125) (与 crop region相等)
    • 280×720 stream: (500, 469, 1500, 1031) (垂直裁剪)

Crop Region裁减规则说明

Case #2: 16:9 crop region with ~1.5x digital zoom

  • Crop region: Rect(500, 375, 1833, 1125)
    • 1280×720 stream: (500, 375, 1833, 1125) (与 crop region相等)
    • 640×480 stream: (666, 375, 1666, 1125) (水平裁剪)

Crop Region裁减规则说明

Case #3: 1:1 crop region with ~2.6x digital zoom

  • Crop region: Rect(500, 375, 1250, 1125)
    • 640×480 stream: (500, 469, 1250, 1031) (垂直裁剪)
    • 1280×720 stream: (500, 543, 1250, 957) (垂直裁剪)

Crop Region裁减规则说明

Case #4: Replace 640×480 stream with 1024×1024 stream, with 4:3 crop region

  • Crop region: Rect(500, 375, 1500, 1125)
    • 1024×1024 stream: (625, 375, 1375, 1125) (水平裁剪)
    • 1280×720 stream: (500, 469, 1500, 1031) (垂直裁剪)

Crop Region裁减规则说明

Crop Region精度控制

由于硬件限制或者一些对齐要求,上层在CaptureRequest里面设置的crop region可能会被Camera HAL做微调,最终实际生效的Crop region会在CaptureResult中体现。

Crop Region与Sensor输出大小关系

Crop region大小不会影响到Sensor输出大小,Sensor输出不同的Size都会被mapping到Active array size上来进行计算;这里Active array size仅表示当前sensor mode下sensor输出的全尺寸,并不是sensor输出大小

Crop Region与Zoom Ratio

从API Level 30开始,在Logical multicam中强烈建议通过CONTROL_ZOOM_RATIO来控制Zoom,因为该控制方式会结合光学变焦和数字变焦的能力,甚至可以缩小到1倍zoom以下

  • 通过CONTROL_ZOOM_RATIO控制Zoom时,Crop region设置为默认active array size即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第38讲 Android Camera2 API 通过CropRegion控制Zoom缩放 的相关文章

  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • Java 泛型:如何为泛型类型指定类类型?

    我有一个 POJO 指定为 MyClass u where U是泛型类型参数 我正在尝试编写一个接受类引用的实用方法Class u
  • 从 sbt 程序集运行 uber jar 会导致错误:无法找到或加载主类

    我有一个使用 sbt 程序集插件打包为 uber jar 的 Spark 作业 这build sbt指定一个可运行的 main 作为生成的 uber jar 的目标 mainClass in assembly Some com foo Ba
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • 检查应用程序是否首次运行[重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 我想根据应用程序安装后首次运行来设置一些应用程序的属性 有什么方法可以发现应用程序是第一次运行 然后设置其首次运行属性吗 下面是一个使用的例子SharedPreferences实现
  • Facebook Android 意图

    我对这个意图有疑问 这个意图是发送文本类型的消息 一切正常 电子邮件 短信 推特以及手机上的任何内容 但唯一有问题的是facebook 它会尝试以链接而不是文本的形式发布 Intent s new Intent android conten
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • Webview 电子邮件链接 (mailto)

    我有一个视图并查看该网站有用于发送电子邮件的 malito 代码 当我打开链接时 会出现错误 我希望当我打开链接时打开 Gmail 应用程序或其他电子邮件应用程序 感谢所有帮助者 public class teacher extends A
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb
  • 如何将QR码中的3个方块替换为圆圈以使用Paint android使用zxing自定义QR码?

    我用它作为自定义的参考 从方形到圆形使用zxing生成的QR码它是在java中所以我尝试将它转换为在android中使用 使用 zxing 生成具有自定义点形状的 QR 码 https stackoverflow com questions
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • Android - 保留或删除应用程序卸载时创建的文件

    我创建了一个应用程序 用于创建文件并将其存储到 SD 卡 有没有办法将文件夹与应用程序绑定 以便当用户在 Android 设备上运行卸载时删除所有文件 自 2009 年以来似乎有了一些进展 来自文档 http developer andro

随机推荐

  • 软件测试基础学习

    1 软件和软件测试 1 1 软件 软件组成 程序 数据 文档 软件的分类 按层次划分 系统软件 应用软件 按组织划分 商业软件 开源软件 按结构划分 单机软件 分布式软件 1 2缺陷的由来 软件缺陷的由来 Bug Defect 所有不满足需
  • 使用python写一个可以帮我混淆加密Lua脚本的程序

    首先 我们需要了解一下混淆加密的概念 混淆加密是指将程序代码进行特殊的处理 使其难以被人类理解或反编译 这有助于保护程序的版权和商业机密 对于使用 Python 编写的程序来说 我们可以使用第三方库 pyminifier 来混淆加密 Pyt
  • 【详解】MySQL索引的基本操作,索引(主键索引,普通索引,组合索引,唯一索引)

    索引底层原理 详解 面试必问 MySQL索引底层原理 基于B Tree CodingLJ CSDN博客 前言 索引是什么 索引是一种单独的 物理的对数据库表中一列或多列的值进行排序的一种存储结构 它是某个表中一列或若干列值的集合和相应的指向
  • ASP中Utf-8与Gb2312编码转换乱码问题的解决方法

    asp程序在同一个站点中 如果有utf 8编码的程序 又有gb2312编码的程序时 在浏览utf 8编码的页面后 再浏览当前网站gb2312的页面 gb2312编码的页面就会出现乱码 出现这样的问题是当你浏览utf 8编码的时候 服务器默认
  • C++11多线程(三) lock_guard unique_lock

    文章目录 C 11多线程 三 lock guard unique lock 导读 Lock guard 示例代码 lock guard lt gt 的第二个参数 unique lock unique lock源码浅析 部分 unique l
  • Dart IDEA插件安装及工程创建

    安装插件 开打IDEA 选择 File Settings 选择左侧标签plugins 点击右侧下方的Install JetBrains plugin 在弹出的对话框搜索框中输入dart 等待搜索完成后就会列出Dart插件 选中 点击右侧的I
  • Oracle 高CPU SQL查找

    先top命令 找到PID 再在SQL界面用管理员权限查询 select sql text spid v session program process from v sqlarea v session v process where v s
  • 史上最全的CSS hack方式一览

    http blog csdn net freshlover article details 12132801
  • charge用法

    I mean I can stop charging anytime I want 老友记 第一季 第一集 我的意思是 我可以随时忍住挥霍 及物动词 vt 1 索价 对 索费 课 税 O1 for This store often char
  • socket超时设置 之 ioctlsocket 函数全面解析

    先看看MSDN标准解释 int ioctlsocket SOCKET s long cmd u long FAR argp Parameters s in Descriptor identifying a socket cmd in Com
  • SVN客户端安装及使用

    SVN客户端安装及使用 安装svn客户端 svn常用命令 将指定仓库checkout到当前目录 添加指定文件 添加所有文件 提交文件 更新文件 更新当前目录所有文件 更新指定文件 删除文件 查看修改记录 查看当前目录的修改记录 查看某个文件
  • 车险保单在线OCR识别,字段很全,可以可以

    快瞳科技 车险保单识别 在线测试后发现 保险公司名称 保单号或者合同号 总保费 保险期间 业务类型 车型保单类型 保单名称 被保人信息 被保险人 被保人姓名 被保人证件号码 被保人电话号码 被保人联系地址 车辆信息 车牌 车辆种类 车辆使用
  • 二分查找4 - 搜索旋转排序数组

    搜索旋转数组 1 题目 整数数组 nums 按升序排列 数组中的值 互不相同 在传递给函数之前 nums 在预先未知的某个下标 k 0 lt k lt nums length 上进行了 旋转 使数组变为 nums k nums k 1 nu
  • 秒天秒地!黑马王炸学科,均薪18k+,最高42000元!

    掌握AI的同学 握住了高薪密码 黑马北京校区人工智能开发 16 班的就业炸了 毕业仅 7 个工作日 班级就业率便达到 65 班级均薪高达 18340 9 元 最高薪资更是冲到了 42k 班级就业详情数据 滑动沾高薪喜气 看完这无敌的就业喜报
  • Three.js使用OrbitControls后修改相机旋转方向无效

    1 问题复现 在项目中添加了OrbitControls控制器来控制相机的旋转和平移 但是需要修改初始的相机角度 于是我把相机的角度进行修改 如下 const camera new THREE PerspectiveCamera 75 vie
  • linux nginx 配置

    http blog csdn net Colton Null article details 78439174 locationNum 8 fps 1 之前发布过一篇如何在Tomcat中配置二级域名 现在发现几个月前的我太年轻了 哎 过几个
  • Leetcode算法——63、不重复路径II(unique paths II)

    一个机器人位于一个m n的网格的左上角 它每次只能向下或向右移动一格 它试图到达网格的右下角 网格中有一些障碍物 机器人不能通过 求有多少种不重复的路径 备注 1 m 和 n 都不大于 100 2 障碍物和空地分别被标为 1 和 0 示例
  • 如何开发一个小程序游戏?

    小程序游戏开发需要开发人员具备以下几点能力 有一定的编程基础 例如 JavaScript TypeScript 至少熟悉一种游戏开发引擎 比如 Cocos Unity等 对游戏机制 游戏系统有一定的理解 有一定的 UI 界面审美 能够开脑洞
  • 字典树Trie和三叉搜索树Ternary Tree的学习总结

    字典树Trie和三叉搜索树Ternary Tree的学习总结 出处 西西整理 作者 西西 日期 2012 12 31 2 39 04 大 中 小 评论 0 我要发表看法 Trie树 又称字典树 单词查找树或者前缀树 是一种用于快速检索的多叉
  • 第38讲 Android Camera2 API 通过CropRegion控制Zoom缩放

    本讲是Android Camera专题系列的第38讲 我们介绍Android Camera2 API专题的通过CropRegion控制Zoom缩放 包括如下内容 Android Zoom简介 如何查询当前Camera支持的Zoom能力 通过