Я делаю серию снимков с помощью Android Camera2 API для оценки поз в реальном времени и восстановления среды (проблема SLAM). В настоящее время я просто сохраняю все эти изображения на моей SD-карте для автономной обработки.
Я настроил конвейер обработки в соответствии с Camera2Basic
от Google, используя 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), чтобы удалить старые кадры, а также проверил временную метку изображения, чтобы убедиться, что они монотонно увеличиваются.
Считыватель получает изображения с приемлемой скоростью (около 25 кадров в секунду). Однако более внимательный взгляд на сохраненную последовательность изображений показывает, что они не
всегда сохраняется в хронологическом порядке.
Следующие изображения взяты из длинного эпизода, снятого программой (извините за невозможность публикации изображений напрямую :():
Изображение 1:
Изображение 2:
Изображение 3:
Такое расстройство встречается не очень часто, но может возникнуть в любое время и, похоже, не является проблемой инициализации. Я предполагаю, что это как-то связано с размером буфера ImageReader
, так как при увеличении размера буфера происходит меньше «обратных возвратов». У кого-нибудь есть такая же проблема?