android - 使用 Camera2 预览和处理相机数据

标签 android android-camera2

问题

我想做一些类似于在 Camera2Basic 上所做的事情样本,即:

  1. 使用 TextureView
  2. 从相机预览图像
  3. 使用 ImageReader
  4. 处理来自相机的图像

2 有一些不同:

  • 我只对要处理的图像的灰色 channel (亮度)感兴趣。它们的尺寸应该在 1000 x 1000 像素左右(而不是可用的最高分辨率)
  • 当要处理的图像可用时,将调用通用的process(Image) 方法,而不是将图像保存到磁盘。这个方法做了什么超出了这个问题的范围,但是它需要大约 50 毫秒才能返回
  • 应该定期处理图像数据(大约 10 FPS,但速度并不重要)而不是最终处理

如何使用 Camera2 API 完成此操作?

观察

  • 我改变了创建 ImageReader 实例的方式,选择更小的尺寸和不同的格式(YUV_420_888 而不是 JPEG ). Y 平面将被访​​问以获得亮度数据。是否有更有效的格式(因为我只是忽略了 UV 平面)?
  • TextureViewImageReader 表面都应定期填充,但填充速率不同。由于 CameraCaptureSession 上只能有一个重复的 CameraRequest(可以通过调用 setRepeatingRequest() 设置),我是否应该手动调用capture() 定期(例如,使用预览请求调用 setRepeatingRequest() 并使用处理请求定期调用 capture())?
  • 是否可以通过发送重新处理请求从预览图像中获取待处理图像来提高性能?如果可以,我该怎么做?

最佳答案

我不知道如何帮助你处理灰色 channel ,我建议你尝试研究YUV格式图像的平面并尝试从那里获取它。

同时尝试检查您可以在 CaptureBuilder 中设置的所有值,也许您可​​以使用 SENSOR_TEST_PATTERN_MODE、COLOR_CORRECTION_MODE 或 BLACK_LEVEL_LOCK 实现您的目标。您可以在android documentation中查看所有信息

关于只处理每 10 帧中的一帧,只需使用简单的 process() 方法丢弃这些帧:

   if (result.getFrameNumber() % 10 != 0) return;

最后记得关闭您在 ImageReader OnImageAvailableListener 中收到的所有图像,以避免内存泄漏并提高性能 :P

    @Override
    public void onImageAvailable(ImageReader imageReader) {
        Image image = null;
        try {
            image = imageReader.acquireNextImage();
            //Do whatever you want with your Image
            if (image != null) {
                image.close();
            }
        } catch (IllegalStateException iae) {
            if (image != null) {
                image.close();
            }
        }
    }

希望它能帮到你,如果我能在其他方面帮助你,请告诉我!

关于android - 使用 Camera2 预览和处理相机数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39481821/

相关文章:

java - 如何知道 fragment 何时在 View 中

java - 这个同步有什么意义?

android - 带Camera2的Android RTL

android - camera2 如何从图像读取器监听器中的 YUV_420_888 图像获取 Exif 数据

Android Camera2 API JPEG_QUALITY 不可用

android - 未调用我的 AsyncTask 的 onPreExecute/onPostExecute

java - 切换此标记后预期的标签

c++ - 安卓ndk camera2 api

java - 如何在Android上读取USB设备的数据?

Android Camera2 API 缓冲区和相机断开连接问题