【问题标题】:Android camera2 API - Display processed frame in real timeAndroid camera2 API - 实时显示处理后的帧
【发布时间】:2017-07-15 23:44:03
【问题描述】:

我正在尝试创建一个实时处理相机图像并将其显示在屏幕上的应用。我正在使用 camera2 API。我创建了一个本地库来使用 OpenCV 处理图像。

到目前为止,我已经设法设置了一个 ImageReader,它可以像这样接收 YUV_420_888 格式的图像。

        mImageReader = ImageReader.newInstance(
                mPreviewSize.getWidth(),
                mPreviewSize.getHeight(),
                ImageFormat.YUV_420_888,
                4);
        mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mImageReaderHandler);

从那里我可以获取图像平面(Y、U 和 V),获取它们的 ByteBuffer 对象并将它们传递给我的本机函数。这发生在mOnImageAvailableListener:

        Image image = reader.acquireLatestImage();

        Image.Plane[] planes = image.getPlanes();
        Image.Plane YPlane = planes[0];
        Image.Plane UPlane = planes[1];
        Image.Plane VPlane = planes[2];

        ByteBuffer YPlaneBuffer = YPlane.getBuffer();
        ByteBuffer UPlaneBuffer = UPlane.getBuffer();
        ByteBuffer VPlaneBuffer = VPlane.getBuffer();

        myNativeMethod(YPlaneBuffer, UPlaneBuffer, VPlaneBuffer, w, h);

        image.close();

在本机端,我能够从缓冲区中获取数据指针,从数据中创建一个cv::Mat 并执行图像处理。

现在下一步是显示处理后的输出,但我不确定如何显示处理后的图像。任何帮助将不胜感激。

【问题讨论】:

标签: android c++ opencv native camera2


【解决方案1】:

一般来说,您需要将处理后的图像数据发送到 Android 视图。

最高效的选择是获取一个 android.view.Surface 对象来绘制 - 您可以从 SurfaceView(通过 SurfaceHolder)或 TextureView(通过 SurfaceTexture)获取一个。然后您可以通过 JNI 将该 Surface 传递给您的本机代码,并使用 NDK 方法:

使用 setBuffersGeometry() 配置输出大小,然后使用 lock() 获取 ANativeWindow_Buffer。将图像数据写入 ANativeWindow_Buffer.bits,然后使用 unlockAndPost() 发送缓冲区。

一般来说,您应该坚持使用 RGBA_8888 作为最兼容的格式;从技术上讲,只有它和其他两种 RGB 变体得到官方支持。因此,如果您处理的图像是 YUV 格式,则需要先将其转换为 RGBA。

您还需要确保输出视图的纵横比与您设置的尺寸相匹配;默认情况下,Android 的 View 只会将这些内部缓冲区缩放到输出 View 的大小,并可能在此过程中对其进行拉伸。

您也可以将格式设置为 Android 的内部 YUV 格式之一,但这保证可以工作!

【讨论】:

    【解决方案2】:

    我已经尝试过 ANativeWindow 方法,但设置起来很痛苦,而且我还没有正确地做到这一点。最后我只是放弃并导入了 OpenCV4Android 库,它通过在幕后将相机数据转换为 RGBA Mat 来简化事情。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多