camera API详细步骤

本文介绍了Android Camera API的详细步骤,包括Requests、HAL和camera子系统的交互。内容涵盖相机模型、HAL层的功能、相机流水线的工作原理,以及API的使用流程。重点阐述了请求的处理顺序、输出数据的同步和配置,以及设备的打开、配置和关闭过程。
摘要由CSDN通过智能技术生成

1. Requests

Application framework层向camera子系统发出一系列捕获数据的请求。一个请求对应于结果中的一个单元。请求封装了这些结果关于捕获数据和处理数据的所有配置信息。这些信息包括:分辨率,像素格式,sensor调整,镜头和闪光灯控制,3A操作模式,RAW转YUV处理,统计信息产生,等等。这里考虑了很多关于对结果数据的输出和处理的控制。多个请求可以一次性发出,提交请求是非阻塞模式。这些请求总是按照被接收到的顺序来处理。
在这里插入图片描述

Figure1. Camera model

2. The HAL and camera subsystem

Camera子系统包括camera流水线上各个组件的实现,比如3A算法及其处理控制。Camera HAL层为你实现这些组件提供了接口。为了保持对多个设备制造商和图像信号处理器(ISP,或者camera sensor)供应商之间的跨平台兼容性,camera流水线模块是虚拟的,并没有直接对应任何真实的ISP。但是,它与真实的处理流水线很相似,以便你能够高效地将它映射到你的硬件。另外,它很抽象,在质量,性能或者跨设备兼容性方面,不需要任何妥协就可以支持多个不同算法和操作指令。

Camera流水线也支持触发器,app framework能够初始化并打开它,比如自动聚焦。它也能向app framework发送通知,通知app关于自动聚焦被锁或者错误的事件。

以下是使用Camera API2拍照的基本步骤: 1. 获取相机设备:使用CameraManager类获取相机设备列表,并选择需要的相机设备。 ``` CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); ``` 2. 初始化相机设备:打开相机设备,设置相机参数,并创建一个CameraCaptureSession用于捕获图像。 ``` manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { mCameraDevice = camera; try { //设置相机参数 mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewBuilder.addTarget(mPreviewSurface); //创建一个CameraCaptureSession用于捕获图像 mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { mCaptureSession = session; //开始预览 mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), null, null); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Log.e(TAG, "Failed to configure camera capture session."); } }, null); } catch (CameraAccessException e) { Log.e(TAG, "Failed to initialize camera device.", e); } } @Override public void onDisconnected(@NonNull CameraDevice camera) { Log.e(TAG, "Camera device unexpectedly disconnected."); } @Override public void onError(@NonNull CameraDevice camera, int error) { Log.e(TAG, "Camera device error: " + error); } }, null); ``` 3. 拍照:创建一个CaptureRequest.Builder用于设置拍照参数,然后通过CameraCaptureSession.capture()方法捕获图片。 ``` CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(mImageReader.getSurface()); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); mCaptureSession.capture(captureBuilder.build(), null, null); ``` 4. 关闭相机:拍照完成后,需要关闭相机设备和CameraCaptureSession。 ``` mCameraDevice.close(); mCaptureSession.close(); ``` 下面是一个完整的Camera API2拍照示例代码: ``` public class CameraActivity extends AppCompatActivity { private static final String TAG = "CameraActivity"; private TextureView mPreviewView; private ImageReader mImageReader; private CameraDevice mCameraDevice; private CameraCaptureSession mCaptureSession; private CaptureRequest.Builder mPreviewBuilder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); mPreviewView = findViewById(R.id.preview_view); //创建一个ImageReader对象用于捕获拍照图片 mImageReader = ImageReader.newInstance(1080, 1920, ImageFormat.JPEG, 1); mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { //拍照完成后处理图片 Image image = reader.acquireLatestImage(); //TODO:处理图片 image.close(); } }, null); } @Override protected void onResume() { super.onResume(); //打开相机设备 CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); try { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { mCameraDevice = camera; try { //设置相机参数 mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewBuilder.addTarget(mPreviewView.getSurfaceTexture()); //创建一个CameraCaptureSession用于捕获图像 mCameraDevice.createCaptureSession(Arrays.asList(mPreviewView.getSurfaceTexture(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { mCaptureSession = session; //开始预览 mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), null, null); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Log.e(TAG, "Failed to configure camera capture session."); } }, null); } catch (CameraAccessException e) { Log.e(TAG, "Failed to initialize camera device.", e); } } @Override public void onDisconnected(@NonNull CameraDevice camera) { Log.e(TAG, "Camera device unexpectedly disconnected."); } @Override public void onError(@NonNull CameraDevice camera, int error) { Log.e(TAG, "Camera device error: " + error); } }, null); } catch (CameraAccessException e) { Log.e(TAG, "Failed to open camera device.", e); } } @Override protected void onPause() { super.onPause(); //关闭相机设备和CameraCaptureSession if (mCameraDevice != null) { mCameraDevice.close(); } if (mCaptureSession != null) { mCaptureSession.close(); } } } ``` 希望这个示例代码对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值