Android Camera2 同步图像和元数据
Android Camera2 synchronise image and metadata
我有一个相机 class 使用 Android Camera2 API,当帧进入时有两个回调。一个是与 surface
关联的回调它接收实际的图像像素数据。在这种情况下
private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(final ImageReader reader) {
Image previewImage = reader.acquireLatestImage();
// Use previewImage
}
};
这是通过将它分配给 setOnImageAvailableListener
的 ImageReader
并在调用 createCaptureSession.
时使用那个 ImageReader
来连接的
同时,还有第二个回调接收 CaptureResult
元数据。
CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
// process(result);
}
};
这是通过将 previewCallback 传递到捕获会话的 setRepeatingRequest
或 capture
方法来连接的。
问题是如何协调这两个回调,从而保证image和CaptureResult引用的是同一个捕获事件。这对于任何类型的高级再处理来说当然是必要的,例如使用具有不同曝光或焦点设置的图像来创建散景或 HDR。
两个 TotalCaptureResult and the Image 都带有纳秒时间戳。
保证它们对同一帧具有相同的时间戳。
所以每次你收到一个,把它放在一个队列或类似的队列中,一旦你有一对具有匹配的时间戳,就将这对转发给处理。
为了稳健性,这需要正确处理可能导致结果或图像丢失的捕获错误,否则您将在队列中拥有永远不会被处理的孤立对象,或者您将拖延整个过程应用程序等待一个永远不会到达的对象。或两者。
一个简单的选择可能是只丢弃超过一秒或两秒的对象。
我有一个相机 class 使用 Android Camera2 API,当帧进入时有两个回调。一个是与 surface
关联的回调它接收实际的图像像素数据。在这种情况下
private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(final ImageReader reader) {
Image previewImage = reader.acquireLatestImage();
// Use previewImage
}
};
这是通过将它分配给 setOnImageAvailableListener
的 ImageReader
并在调用 createCaptureSession.
ImageReader
来连接的
同时,还有第二个回调接收 CaptureResult
元数据。
CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
// process(result);
}
};
这是通过将 previewCallback 传递到捕获会话的 setRepeatingRequest
或 capture
方法来连接的。
问题是如何协调这两个回调,从而保证image和CaptureResult引用的是同一个捕获事件。这对于任何类型的高级再处理来说当然是必要的,例如使用具有不同曝光或焦点设置的图像来创建散景或 HDR。
两个 TotalCaptureResult and the Image 都带有纳秒时间戳。 保证它们对同一帧具有相同的时间戳。
所以每次你收到一个,把它放在一个队列或类似的队列中,一旦你有一对具有匹配的时间戳,就将这对转发给处理。
为了稳健性,这需要正确处理可能导致结果或图像丢失的捕获错误,否则您将在队列中拥有永远不会被处理的孤立对象,或者您将拖延整个过程应用程序等待一个永远不会到达的对象。或两者。 一个简单的选择可能是只丢弃超过一秒或两秒的对象。