私はAndroidのCamera2 APIを使用しており、カメラのプレビューフレームで画像処理をいくつか行い、その変更をプレビュー(TextureView)に表示したいと考えています。Androidビデオ処理 - ImageReaderサーフェスをプレビューに接続するにはどうすればいいですか?
私はopenCamera()に共通のcamera2videoの例から、ImageReaderをセットアップしました。
mImageReader = ImageReader.newInstance(mVideoSize.getWidth(),
mVideoSize.getHeight(), ImageFormat.YUV_420_888, mMaxBufferedImages);
mImageReader.setOnImageAvailableListener(mImageAvailable, mBackgroundHandler);
私のstartPreview()では、CaptureRequestからフレームを受け取るようにサーフェスを設定しました。
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
List<Surface> surfaces = new ArrayList<>();
// Here is where we connect the mPreviewSurface to the mTextureView.
mPreviewSurface = new Surface(texture);
surfaces.add(mPreviewSurface);
mPreviewBuilder.addTarget(mPreviewSurface);
// Connect our Image Reader to the Camera to get the preview frames.
Surface readerSurface = mImageReader.getSurface();
surfaces.add(readerSurface);
mPreviewBuilder.addTarget(readerSurface);
それから私はOnImageAvailableListener()コールバックで画像データを修正します。
ImageReader.OnImageAvailableListener mImageAvailable = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
try {
Image image = reader.acquireLatestImage();
if (image == null)
return;
final Image.Plane[] planes = image.getPlanes();
// Do something to the pixels.
// Black out part of the image.
ByteBuffer y_data_buffer = planes[0].getBuffer();
byte[] y_data = new byte[y_data_buffer.remaining()];
y_data_buffer.get(y_data);
byte y_value;
for (int row = 0; row < image.getHeight()/2; row++) {
for (int col = 0; col < image.getWidth()/2; col++) {
y_value = y_data[row * image.getWidth() + col];
y_value = 0;
y_data[row * image.getWidth() + col] = y_value;
}
}
image.close();
} catch (IllegalStateException e) {
Log.d(TAG, "mImageAvailable() Too many images acquired");
}
}
};
私は今それを理解として、私は、2面の場合、私のImageReaderのためmTextureViewおよびその他のための1つに画像を送信しています。
mTextureViewにImageReaderと同じSurfaceを使用させるにはどうすればよいですか、またはmTextureViewのSurfaceから直接画像データを操作する必要がありますか?
おかげ
したがって、私がANativeWindow NDKルートを使用すると、TextureViewにRGB形式が必要なため、YUV-> RGBの理由がありますか? – jimbo
さて、NDKは現在のところ、RGB画像フォーマットのみを選択できるようになっています:https://developer.android.com/ndk/reference/hardware__buffer_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba521c192d1f9b5e85aa68b86ead204fbe –