【发布时间】:2019-03-25 08:29:39
【问题描述】:
我正在使用 Android Camera2 API 拍摄一系列照片,用于实时姿势估计和环境重建(SLAM 问题)。目前我只是将所有这些图片保存在我的 SD 卡中以供离线处理。
我根据 google 的 Camera2Basic 使用 TextureView 和 ImageReader 设置处理管道,它们都被设置为重复预览请求的目标表面。
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mIsShooting){
try {
mCaptureSession.stopRepeating();
mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
mIsShooting = false;
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
else{
try {
mCaptureSession.stopRepeating();
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
mIsShooting = true;
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
});
按下按钮时会添加/删除ImageReader。 ImageReader 的OnImageAvailableListener 实现如下:
private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image img = reader.acquireLatestImage();
if(null == img){
return;
}
if(img.getTimestamp() <= mLatestFrameTime){
Log.i(Tag, "disorder detected!");
return;
}
mLatestFrameTime = img.getTimestamp();
ImageSaver saver = new ImageSaver(img, img.getTimestamp());
saver.run();
}
};
我使用acquireLatestImage(缓冲区大小设置为 2)丢弃旧帧,还检查了图像的时间戳以确保它们单调增加。
阅读器确实以可接受的速率(大约 25fps)接收图像。然而,仔细查看保存的图像序列表明它们不是 始终按时间顺序保存。
以下图片来自程序拍摄的长序列(抱歉无法直接发图:():
图片1:
图 2:
图 3:
这种紊乱并不经常发生,但它们随时可能发生,而且似乎不是初始化问题。我想这与ImageReader 的缓冲区大小有关,因为缓冲区越大,“闪回”就越少。有人有同样的问题吗?
【问题讨论】:
标签: java android android-camera2