Я пытаюсь использовать Android Camera2 для обнаружения лица / глаз. Моя проблема в том, что на нем не так много документации и некоторые функции не работают так, как я ожидаю. Мне нужно обработать каждый кадр, отправленный с камеры.
Я пытаюсь использовать captureRequestBuilder.addTarget()
для отправки кадра на imageReader.OnAvailableImage()
, но когда я это делаю, я больше не получаю фреймы, отправленные в сеанс предварительного просмотра.
Этот фрагмент кода ломает мой телефон предварительного просмотра камеры.
SurfaceTexture texture = textureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(imageSize.getWidth(),imageSize.getHeight());
Surface surface = new Surface(texture);
ArrayList<Surface> surfaces = new ArrayList<>();
surfaces.add(surface);
surfaces.add(imageReader.getSurface());
captureRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);
captureRequestBuilder.addTarget(imageReader.getSurface());
cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
Но если я делаю это так, предварительный просмотр работает, но я не могу найти способ обработать кадры
SurfaceTexture texture = textureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(imageSize.getWidth(),imageSize.getHeight());
Surface surface = new Surface(texture);
captureRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
это ImageReader
ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG,1);
List<Surface> outputSurface = new ArrayList<>(2);
outputSurface.add(reader.getSurface());
outputSurface.add(new Surface(textureView.getSurfaceTexture()));
int rotation = getWindowManager().getDefaultDisplay().getRotation();
ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try
{
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
{
if (image != null)
image.close();
}
}
}
};
reader.setOnImageAvailableListener(readerListener,mBackgroundHandler);
Кто-нибудь может мне помочь с обработкой кадров Camera2 в реальном времени?