来自 Androidcamera2 API 的图像数据在 Galaxy S5 上翻转和压缩

2023-11-24

我正在实现一个应用程序,该应用程序对来自相机的实时图像进行实时图像处理。它使用现已弃用的 android.hardware.Camera 进行工作,但有限制;为了提高灵活性和性能,我想使用新的 android.hardware.camera2 API。然而,我在获取原始图像数据进行处理时遇到了麻烦。这是在三星 Galaxy S5 上。 (不幸的是,我没有另一个 Lollipop 设备可以方便地在其他硬件上进行测试)。

我得到了整个框架(受到“HdrViewFinder”和“Camera2Basic”示例的启发)的工作,并且实时图像通过 SurfaceTexture 和 GLSurfaceView 在屏幕上绘制。但是,我还需要访问图像数据(仅灰度就可以,至少目前如此)以进行自定义图像处理。根据文档StreamConfigurationMap.isOutputSupportedFor(类),直接获取图像数据的推荐表面为图像读取器(正确的?)。

所以我将捕获请求设置为:

mSurfaceTexture.setDefaultBufferSize(640, 480);
mSurface = new Surface(surfaceTexture);
...
mImageReader = ImageReader.newInstance(640, 480, format, 2);
...
List<Surface> surfaces = new ArrayList<Surface>();
surfaces.add(mSurface);
surfaces.add(mImageReader.getSurface());
...
mCameraDevice.createCaptureSession(surfaces, mCameraSessionListener, mCameraHandler);

在 ImageReader 的 onImageAvailable 回调中,我按如下方式访问数据:

Image img = reader.acquireLatestImage();
ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer();

...但是,虽然(如上所述)实时图像预览正在工作,但我在此处获取的数据(或我获取数据的方式)存在问题。根据

mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats();

...应支持以下图像格式:NV21、JPEG、YV12、YUV_420_888。我已经尝试了所有(插入上面的“格式”),所有都支持根据设置的分辨率getOutputSizes(format),但没有一个给出期望的结果:

  • NV21:ImageReader.newInstance 抛出 java.lang.IllegalArgumentException:不支持 NV21 格式
  • JPEG:这确实有效,但对于实时应用程序来说,对每一帧进行 JPEG 编码和解码似乎没有意义......
  • YV12 和 YUV_420_888:这是最奇怪的结果——我可以看到得到灰度图像,但它是垂直翻转(是的,翻转,而不是旋转!)并且显着squished(在水平方向上显着缩放,但在垂直方向上没有缩放)。

我在这里缺少什么?是什么导致图像翻转和压扁?如何获得几何上正确的灰度缓冲区?我应该使用不同类型的表面(而不是 ImageReader)吗?

任何提示表示赞赏。


我找到了一个解释(虽然不一定是令人满意的解决方案):事实证明,传感器阵列的纵横比是 16:9(通过发现mCameraInfo.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);).

至少在请求 YV12/YUV_420_888 时,流媒体似乎不会以任何方式裁剪图像,而是不均匀地缩放图像,以达到请求的帧大小。当请求 16:9 格式时,图像具有正确的比例(不幸的是,其中只有两个更高分辨率的格式)。对我来说这似乎有点奇怪——当请求 JPEG、或使用等效的旧相机 API 函数或静态照片时,似乎不会发生这种情况;我不确定非均匀缩放的框架有什么用处。

我觉得这不是一个真正令人满意的解决方案,因为这意味着您不能依赖输出格式列表,而必须首先找到传感器尺寸,找到具有相同宽高比的格式,然后自己对图像进行下采样(如所须)...

我不知道这是预期的结果还是 S5 的“功能”。仍然欢迎提出意见或建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Androidcamera2 API 的图像数据在 Galaxy S5 上翻转和压缩 的相关文章

  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • fresco 的 Proguard 错误

    我正在使用 ProGuard 当我在发布配置中运行项目时 出现以下错误 Warning com facebook imagepipeline bitmaps DalvikBitmapFactory can t find referenced
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 如何使用 (a)smack 在 Android 上保持 XMPP 连接稳定?

    我使用适用于 Android 的 asmack android 7 beem 库 我有一个后台服务正在运行 例如我的应用程序保持活动状态 但 XMPP 连接迟早会在没有任何通知的情况下消失 服务器表示客户端仍然在线 但没有发送或接收数据包
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • 如何在代码中设置TextView的文字颜色?

    在 XML 中 我们可以通过以下方式设置文本颜色textColor属性 比如android textColor FF0000 但如何通过编码来改变它呢 我尝试过类似的东西 holder text setTextColor R color R
  • Android接收通知打开和取消事件

    我从 webService 接收数据以生成自定义通知 我想追踪Intent要知道open 点击 或cancel 滑动 通知上的事件 以报告服务器进行分析 有没有听众onIntentStart or onIntentCanceled 也许是通
  • BluetoothLeScanner 服务内部问题

    Update从Android 10以上我认为你需要ACCESS BACKGROUND LOCATION权限 因此 如果此代码在最新的 Android 版本上不起作用 就是针对此问题的 ACCESS BACKGROUND LOCATION 受
  • 如何使用 onSearchRequested() 调用搜索对话框

    我正在尝试实现搜索对话框 但无法显示活动中的搜索 我在清单文件中定义了主要活动 此活动向用户显示了他们必须从中选择的选项列表 选项之一是 搜索 选项
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • RecyclerView元素更新+异步网络调用

    我有一个按预期工作的回收视图 我的布局中有一个按钮可以填充列表 该按钮应该进行异步调用 根据结果 我更改按钮的外观 这一切都发生得很好 但是 当我单击按钮并快速向下滚动列表时 异步调用的结果会更新新视图的按钮 代替旧视图的视图 我该如何处理
  • 将数据放入短信发送意图中?

    我想发送短信 如果文字太长 我会将其分成多条消息 我试图将一些额外的信息放入 已发送 意图中 以了解哪个部分已发送 以及所有部分何时完成 ArrayList

随机推荐