You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARCore中ArFrame_acquireCameraImage返回绿色图像问题求助

ARCore相机YUV图像处理异常问题

问题背景

我通过ARCore的ArFrame_acquireCameraImage方法获取相机图像,已通过ArImage_getFormat验证图像为YUV_420_888格式,分辨率640x480。为区分是NV21还是YV12格式,我获取了U平面的像素步长。

我尝试两种处理方式:

  • 用memcpy将Y、U、V三个平面的数据合并为一个数组,通过J. Malinen的Base64编码函数输出到日志;
  • 使用RenderScript Intrinsics Replacement Toolkit进行YUV420p到RGBA的格式转换。

代码实现

LOGD("take frame");
ArImage *image = nullptr;
if (mArSession != nullptr && mArFrame != nullptr &&
    ArFrame_acquireCameraImage(mArSession, mArFrame, &image) == AR_SUCCESS) {
  const uint8_t *y;
  const uint8_t *u;
  const uint8_t *v;

  int planesCount = 0;
  ArImage_getNumberOfPlanes(mArSession, image, &planesCount);
  LOGD("%i", planesCount);

  int yLength, uLength, vLength;
  ArImage_getPlaneData(mArSession, image, 0, &y, &yLength);
  ArImage_getPlaneData(mArSession, image, 1, &u, &uLength);
  ArImage_getPlaneData(mArSession, image, 2, &v, &vLength);

  auto *yuv420 = new uint8_t[yLength + uLength + vLength];
  memcpy(yuv420, y, yLength);
  memcpy(yuv420 + yLength, u, uLength);
  memcpy(yuv420 + yLength + uLength, v, vLength);

  int width, height, stride;
  ArImage_getWidth(mArSession, image, &width);
  ArImage_getHeight(mArSession, image, &height);

  ArImage_getPlanePixelStride(mArSession, image, 1, &stride);

  //auto *argb8888 = new uint8_t[width * height * 4];

  renderscript::RenderScriptToolkit::YuvFormat format = renderscript::RenderScriptToolkit::YuvFormat::YV12;
  if(stride != 1) {
    format = renderscript::RenderScriptToolkit::YuvFormat::NV21;
  }
  LOGD("%i %i %i", width, height, format);
  
  /*renderscript::RenderScriptToolkit toolkit;
  toolkit.yuvToRgb(yuv420, argb8888, width, height, format);*/

  LOGD("%s", base64_encode(yuv420, yLength + uLength + vLength).c_str());

  // delete[](argb8888);
  delete[](yuv420);
}
if (image != nullptr) {
  ArImage_release(image);
}

完整代码见项目cpp目录下的engine.cpp文件第232行。

测试环境

设备:小米Mi A3,同时在Android模拟器上测试出现相同问题。

异常现象

  • 实际正常图像:室内场景,可见桌子、键盘等物品;
  • 直接合并YUV后解码的图像:整体为绿色,顶部像素略浅,解码时使用NV21预设(半平面像素布局);
  • YUV转ARGB后输出的图像:整体黑色,顶部有灰色像素,解码时使用RGB32预设,分辨率640x480,该图像的Base64内容有对应文本记录。

内容的提问来源于stack exchange,提问作者Vladislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:54:28