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

4-1.Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo

  • Camera.CameraInfo 是用于获取设备上摄像头信息的一个类,它提供摄像头的各种详细信息,例如,摄像头的方向、是否支持闪光灯等,以下是它的常用属性
  1. static int CAMERA_FACING_BACK:表示设备的后置摄像头,手机背后的

  2. static int CAMERA_FACING_FRONT:表示设备的前置摄像头,手机屏幕上的

  3. int facing:表示摄像头镜头的方向,它的值可能是

    • Camera.CameraInfo.CAMERA_FACING_BACK:后置摄像头,手机背后的

    • Camera.CameraInfo.CAMERA_FACING_FRONT:前置摄像头,手机屏幕上的

  4. int orientation:表示摄像头图像的自然方向(逆时针),通常会根据它在显示图像时对其进行适当的旋转

  5. boolean canDisableShutterSound:表示是否可以禁用快门声音


二、使用 Camera.CameraInfo

1、操作步骤
  1. 要使用 Camera.CameraInfo,需要先获取到设备上所有可用的摄像头 ID,通过调用 Camera.getNumberOfCameras 方法

  2. 遍历这些摄像头 ID,对每个 ID 使用 Camera.getCameraInfo 方法来获取每个摄像头的详细信息

2、具体实现
package com.my.camera;import androidx.appcompat.app.AppCompatActivity;import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;@SuppressWarnings("all")
public class CameraInfoActivity extends AppCompatActivity {public static final String TAG = CameraInfoActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera_info);getCameraInfo();}private void getCameraInfo() {int numberOfCameras = Camera.getNumberOfCameras();Log.i(TAG, "------------------------------ 摄像头个数:" + numberOfCameras);for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {Camera.CameraInfo cameraInfo = new Camera.CameraInfo();Camera.getCameraInfo(cameraId, cameraInfo);if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {Log.i(TAG, "------------------------------ 后置摄像头,cameraId 为:" + cameraId);} else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {Log.i(TAG, "------------------------------ 前置摄像头,cameraId 为:" + cameraId);} else {Log.i(TAG, "------------------------------ 其他摄像头,cameraId 为:" + cameraId);}Log.i(TAG, "---------- facing 为:" + cameraInfo.facing);Log.i(TAG, "---------- orientation 为:" + cameraInfo.orientation);Log.i(TAG, "---------- canDisableShutterSound 为:" + cameraInfo.canDisableShutterSound);}}
}
  • 输出结果
I/CameraInfoActivity: ------------------------------ 摄像头个数:2
I/CameraInfoActivity: ------------------------------ 后置摄像头,cameraId 为:0
I/CameraInfoActivity: ---------- facing 为:0
I/CameraInfoActivity: ---------- orientation 为:90
I/CameraInfoActivity: ---------- canDisableShutterSound 为:true
I/CameraInfoActivity: ------------------------------ 前置摄像头,cameraId 为:1
I/CameraInfoActivity: ---------- facing 为:1
I/CameraInfoActivity: ---------- orientation 为:270
I/CameraInfoActivity: ---------- canDisableShutterSound 为:true

三、关于摄像头图像的自然方向

1、后置摄像头
  1. 后置摄像头(手机背后的) orientation 为 90

  2. 大多数 Android 设备的后置摄像头是横向安装的,因此相机传感器采集的图像需要旋转才能与屏幕方向一致

  3. 即需要顺时针旋转 90 度才能正确显示(调用 Camera 对象的 setDisplayOrientation 方法)

  • 如下图示,这里我们定义箭头指向为摄像头的上方
2、前置摄像头
  1. 前置摄像头(手机屏幕上的) orientation 为 270

  2. 前置摄像头也是横向安装的,前置摄像头与后置摄像头的一个关键区别在于它在预览时会对图像进行镜像处理,即左右镜像处理把 orientation 为 270 处理成 orientation 为 90

  3. 这样也需要顺时针旋转 90 度才能正确显示(调用 Camera 对象的 setDisplayOrientation 方法)

  • 如下图示,这里我们定义箭头指向为摄像头的上方

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot和Mybatis框架怎么防止SQL注入
  • Hystrix-熔断原理分析
  • [论文笔记]Dimensionality Reduction by Learning an Invariant Mapping
  • 828华为云征文|基于华为云Flexus云服务器X搭建jumpserver堡垒机软件
  • vue3 el-menu 菜单Maximum recursive updates exceeded 报错
  • qt事件过滤器
  • 《机器学习》数据预处理 删除、替换、填充 案例解析及实现
  • zabbix6.4连接钉钉发出警告
  • 【计算机网络】TCP协议(下)
  • 基于stm32f407的pwm输出以及初始化(84mhz)
  • 电影、视频拍摄基础知识 | 所有岗位及职能描述、任职要求速览
  • LC1860C 后来怎么样了
  • 浅谈人工智能之python调用通义千问API
  • 深入解析MySQL索引的使用及优化
  • gitlab 启动/关闭/启用开机启动/禁用开机启动
  • #Java异常处理
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]Python中的类属性与实例属性的区别
  • CSS居中完全指南——构建CSS居中决策树
  • django开发-定时任务的使用
  • input的行数自动增减
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • 分享几个不错的工具
  • 浮动相关
  • 前端之React实战:创建跨平台的项目架构
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何学习JavaEE,项目又该如何做?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序button引导用户授权
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #pragma data_seg 共享数据区(转)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (搬运以学习)flask 上下文的实现
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十八)Flink CEP 详解
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)c52学习之旅-静态数码管
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)人的集合论——移山之道
  • .ai域名是什么后缀?
  • .DFS.
  • .net Application的目录
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET gRPC 和RESTful简单对比
  • .NET 直连SAP HANA数据库