gpt4 book ai didi

Android camera2 API - 实时显示处理过的帧

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:41 70 4
gpt4 key购买 nike

我正在尝试创建一个实时处理相机图像并将其显示在屏幕上的应用程序。我正在使用 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 对象并将它们传递给我的 native 函数。这发生在 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();

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

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

最佳答案

一般而言,您需要将处理后的图像数据发送到 Android View 。

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

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

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

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

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

关于Android camera2 API - 实时显示处理过的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42450556/

70 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com