android - FirebaseVisionImageMetadata 的 ImageReader 格式兼容性(通过 Android 上的 Camera2 API)
问题描述
我想使用 ImageReader 中的图像字节数组来构造一个FirebaseVisionImageMetadata
用于条形码扫描的对象(作为ML Kit的一部分)。我正在使用 Camera2 API 并遵循此 PR来支持帧预览。
Size sz = chooseOptimalSize();
mCallbackImageDataReader =
ImageReader.newInstance(sz.getWidth(), sz.getHeight(), ImageFormat.YV12, 1);
mCallbackImageDataReader.setOnImageAvailableListener(reader -> {
byte[] data = getByteDataFromImageReader(reader);
if (data != null) {
//rotation compensation calculation not shown
mCallback.onPreviewFrame(data, reader.getImageFormat(), reader.getWidth(), reader.getHeight(), rotationCompensation);
}
}, null);
@Nullable
private byte[] getByteDataFromImageReader(@NonNull ImageReader reader) {
byte[] data = null;
try (Image image = reader.acquireNextImage()) {
Image.Plane[] planes = image.getPlanes();
if (planes.length > 0) {
ByteBuffer buffer = planes[0].getBuffer();
data = new byte[buffer.remaining()];
buffer.get(data);
}
}
return data;
}
但是,当我将结果格式传递给FirebaseVisionImageMetadata
构建器时,我收到以下错误:
final FirebaseVisionImageMetadata meta = new FirebaseVisionImageMetadata.Builder()
.setFormat(format) //exception thrown here
.setWidth(width)
.setHeight(height)
.setRotation(rotation)
.build();
java.lang.IllegalArgumentException
at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown Source:5)
at com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata$Builder.setFormat(Unknown Source:13)
我传递给的格式ImageReader
是ImageReader.YV12
sinceFirebaseVisionImageMetadata
只接受NV21
or YV12
,但由于ImageReader
不接受NV21
,我只剩下YV12
. 当我使用这种格式(如上所示)时,相机会以黑屏启动。我也尝试过传入ImageReader.YUV_420_888
,但结果相同IllegalArgumentException
from FirebaseVisionImageMetadata
。
我的猜测是我可能必须以不同的方式转换字节数组,或者转换为不同的格式(?)。
任何帮助,将不胜感激。
资料来源:
解决方案
我想到了。我需要使用reader.acquireNextImage();
mCallbackImageDataReader.setOnImageAvailableListener(reader -> {
try (Image image = reader.acquireNextImage())
{
if (image != null)
{
//compute rotationCompensation
mCallback.onPreviewFrame(image, rotationCompensation);
}
}
}, null);
推荐阅读
- node.js - Nestjs 是否支持同时在操作上获取和发布?
- docker - Docker:数据库、客户端和 API 之间的分离级别
- laravel - 如何在 laravel 的查询生成器中使用 with
- css - 如何使用 w3.css 制作全角和响应式表格
- python - Raspberry Pi Reboot 时运行 Python3 Web 服务器程序
- postgresql - 如何使用 golang-migrate 进行迁移
- database - 关于可空外键及其替代方案的实践
- mvel - 访问 MVEL ASTNode 信息
- moodle - 如何为moodle mobile设置自定义网址?
- maven - 使用“mvn deploy”命令和 Artifactory UI 将工件部署到 Artifactory 有什么区别?