【发布时间】:2022-09-01 19:24:12
【问题描述】:
我正在尝试使用 ARCore 从相机获取图像。
我打电话给ArFrame_acquireCameraImage,也就是returns image with YUV_420_888 format。我还使用ArImage_getFormat 方法检查了它。 它返回给我 640x480 图像。然后我获得 U 平面的像素步长以区分 NV21 或 YV12 格式的图像。
然后我使用 memcpy 将 Y、U、V 数组组合成一个数组,将其编码为 Base64(使用 function by J. Malinen)并将其打印到日志中。
我还尝试使用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);
}
我的手机是小米米A3。也尝试在模拟器上运行它,但它仍然给我同样的画面。
实际图像应如下所示:
然而,我的代码打印了这张图片(我使用RAW Pixels对其进行了解码):
如果我取消注释 YUV420 -> ARGB 转换的代码并为 argb8888 数组打印 Base64,我将得到这个图像:
预设:RGB32,宽度:640,高度:480。 Base64 of this image。
【问题讨论】:
标签: android c++ arcore yuv rgba