Android 10 解决摄像头预览与实际方向不符问题

  问题:

         在Android 10中,旋转屏幕方向后,摄像头采集画面的方向,和我们预览的方向是不一致的,该怎么去解决?

当我们旋转屏幕默认为竖屏的时候,进行摄像头旋转采集的数据一般是横向的,而人预览的方向一般为竖向的。摄像头的采集方向是固定的,不管我们怎么旋转手机,它都沿固定方向进行采集

如果我们想要采集数据能够被正确预览,就需要根据采集方向和屏幕旋转角度,对预览画面进行旋转

这是我们屏幕初始的方向:默认横屏

 当我们屏幕旋转270度,默认竖屏时,拍照方向

         手机摄像头(Camera)的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向恰好是当手机左侧横放时的方向,其坐标原点于手机横放时的左上角。手机的正常方向和图像传感器默认取景方向示意图如下:

        从上面的示意图可知,摄像头感器的取景方向与手机正常方向成90度夹角,此时我们要考虑将摄像头旋转90度,以实现正常的取景方向。按理来说,当我们旋转摄像头之后,以正常的手机方向来打开相机时,看到的预览图像是竖向的,实际图像也应该和预览一致。但是,当拍照后,当我们打开系统图库,看到的实际图像却是横向的,即预览图像与手机方向不一致。

        这是因为系统自带的相机在Android系统底层根据当前手机屏幕的方向对图像传感器采集到的数据进行了旋转,所以无论我们怎么旋转手机屏幕,看到的相机预览图片始终是“不正常”的。而对于自定义的相机,如果没有对图像传感器的图片进行旋转处理,那么看到的实际图片就是横向的:

 解决:

在android 10.1 的源码路径下,与关于Camera旋转摄像头方向的接口,进行修改后显示正常。

1.Camera旋转摄像头方向的源码路径:

android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cppandroid/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp

2.解决摄像头预览方向与实际图像方向不一致问题:

diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
index c2a49a3b5e..ea0a013c52 100755
--- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
+++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
@@ -2889,7 +2889,7 @@ status_t ExternalCameraDeviceSession::initDefaultRequests() {UPDATE(md, ANDROID_JPEG_QUALITY, &jpegQuality, 1);UPDATE(md, ANDROID_JPEG_THUMBNAIL_QUALITY, &jpegQuality, 1);-    const int32_t jpegOrientation = 0;
+    const int32_t jpegOrientation = 90;UPDATE(md, ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);const uint8_t oisMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
index e25deff797..f872f3dc75 100644
--- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
+++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
@@ -162,7 +162,7 @@ namespace {const int kDefaultJpegBufSize = 5 << 20; // 5MBconst int kDefaultNumVideoBuffer = 4;const int kDefaultNumStillBuffer = 2;
-    const int kDefaultOrientation = 0; // suitable for natural landscape displays like tablet/TV
+    const int kDefaultOrientation = 90; // suitable for natural landscape displays like tablet/TV// For phone devices 270 is better} // anonymous namespace

        至此,摄像头显示正常,预览与实际图像一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTT(RT-Thread)线程管理(1.2W字详细讲解)

目录 RTT线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程状态之间切换 线程相关操作 创建和删除线程 创建线程 删除线程 动态创建线程实例 启动线程 初始化和脱离线程 初始化线程 脱离线程 静态创建线程实例 线程辅助函数 获得当前线程 让出处…

骨传导耳机怎么样?盘点五款适合室外佩戴的骨传导耳机

不知道各位出去玩的时候&#xff0c;有没有觉得外面的世界太喧嚣&#xff0c;需要一副耳机开启自己的小天地&#xff0c;相信有很多人都有这种习惯&#xff0c;在路上戴着耳机享受属于自己的那一片天地&#xff0c;可是市面上种类这么多耳机&#xff0c;该如何选择呢&#xff0…

IDEWA项目实践——mybatis的一些基本原理以及案例

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala IDEA项目实践——动态SQL、关系映射、注解开发 文章目录 系列文章目录 1.MyBatis …

制造型企业如何实现车间设备生产数据的实时采集?需要5G网络吗?

引言 在制造业数字化转型的浪潮下&#xff0c;实时采集车间设备生产数据变得尤为重要。工业边缘网关HiWoo Box作为一款专为工业应用而设计的智能设备&#xff0c;具备工业级设计和多种联网方式&#xff0c;为制造型企业提供了高性能的车间设备数据实时采集解决方案。本文将重点…

自定义el-slider 滑块的样式

最近用到了element组件中的滑块&#xff0c;翻看了官网和网上一些案例&#xff0c;感觉和我要的样式都不太一样&#xff0c;下面记录一下我用到的两种自定义滑块。 效果图 第一种自定义画过的间断点样式 起始样式 滑动的样式 第二种自定义拖动滑块的样式 起始样式 滑动的样…

Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查

Django学习记录&#xff1a;使用ORM操作MySQL数据库并完成数据的增删改查 数据库操作 MySQL数据库pymysql Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。 安装第三方模块 pip install mysqlclientORM可以做的事&#xff1a; 1、创建、修改、删除数据库中的…

用指定的字符将数组中各元素填充至指定长度(填充在左侧或右侧)numpy.char.ljust();numpy.char.rjust()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 用指定的字符将数组中各元素 填充至指定长度(填充在左侧或右侧) numpy.char.ljust()&#xff1b;numpy.char.rjust() 下列代码最后输出的结果是&#xff1f; import numpy as np s np.array(…

【阵列信号处理】空间匹配滤波器、锥形/非锥形最佳波束成形器、样本矩阵反演 (SMI) 研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【LeetCode 75】第十九题(724)寻找数组的中心下标

目录 题目: 示例: ​分析: 代码运行结果: 题目: 示例: 分析: 给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和. 我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一…

【css】css设置表格样式-边框线合并

<style> table, td, th {border: 1px solid black;//设置边框线 }table {width: 100%; }td {text-align: center;//设置文本居中 } </style> </head> <body><table><tr><th>Firstname</th><th>Lastname</th><t…

MongoDB文档-基础使用-在客户端(dos窗口)/可视化工具中使用MongoDB基础语句

阿丹&#xff1a; 本文章将描述以及研究mongodb在客户端的基础应用以及在spring-boot中整合使用mongodb来完成基本的数据增删改查。 先放官方的文章 MongoDB CRUD操作 - MongoDB-CN-Manual 本文章分为&#xff1a; 在客户端&#xff08;dos窗口&#xff09;/可视化工具中使用…

【docker】docker-compose服务编排

目录 一、服务编排概念二、docker compose2.1 定义2.2 使用步骤2.3 docker-compose安装2.4 docker-compose卸载 三、编排示例 一、服务编排概念 1.微服务架构的应用系统中一般包含若干个微服务&#xff0c;每个微服务一般都会部署多个实例&#xff0c;如果每个微服务都要手动启…