如何让MediaPipe适配Android YUV_420_888格式实现实时手势检测
可用解决方案
MediaPipe原生支持方案
- MediaPipe内置
ImageToImageCalculator原生支持YUV到RGB的硬件加速转换,无需引入额外依赖,也不需要手动实现转换逻辑。你只需在手势检测的Graph配置中添加该节点,输入传入Camera2输出的YUV_420_888格式帧,节点输出即可直接供给后续MediaPipe处理单元使用。 - 若你使用MediaPipe Android官方封装的API,可直接将Camera2拿到的
Image实例传入FrameInputImage构建器,显式指定输入格式为ImageFormat.YUV_420_888,MediaPipe内部会自动完成格式转换,示例代码如下:
// cameraImage为Camera2回调拿到的YUV_420_888格式Image对象 FrameInputImage inputImage = FrameInputImage.builder() .setImage(cameraImage, ImageFormat.YUV_420_888) .build(); // 直接传入MediaPipe处理器即可 gestureDetector.process(inputImage);
原生Android系统层面方案
方案1:RenderScript ScriptIntrinsicYuvToRGB转换
该方案为系统原生API,无额外包体积增量,内部自带硬件加速,性能是手动循环转换的10~30倍,入门开发者可快速接入:
- 初始化阶段创建RenderScript实例和转换脚本:
RenderScript rs = RenderScript.create(context); ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
- 预先分配对应尺寸的输入输出Allocation,每次Camera2返回YUV帧时,将帧数据写入输入Allocation,执行脚本后即可从输出Allocation拿到RGB格式的Bitmap:
// 写入YUV数据到输入Allocation yuvAllocation.copyFrom(yuvByteArray); // 执行转换 yuvToRgbIntrinsic.forEach(rgbAllocation); // 拿到RGB Bitmap rgbAllocation.copyTo(rgbBitmap);
方案2:HardwareBuffer零拷贝转换(Android 8.0+)
如果你的应用最低支持Android 8.0(API level 26),可直接使用HardwareBuffer做零拷贝转换:将Camera2的输出Surface绑定到HardwareBuffer实例,拿到的YUV帧可直接转换为RGB纹理传给MediaPipe,全程无CPU拷贝,性能最高。
内容的提问来源于stack exchange,提问作者CSRd
相关产品推荐
相关产品推荐

