1. 相机基础概念:相机硬件组成、图像传感器工作原理、数字图像基础(YUV/RGB)、相机预览流程
在深入 Android 相机开发之前,必须建立对相机底层硬件的清晰认知。本章将拆解相机系统的物理组成、传感器光电转换原理、数字图像的色彩编码方式,以及从镜头到屏幕的完整预览链路。这些知识是后续实现滤镜、特效和性能优化的根基。
1.1 相机硬件组成
现代智能手机相机模组是一个高度集成的微型光学-电子系统。主要硬件组件及其功能如下表所示:
| 组件 | 功能描述 | 关键参数 |
|---|---|---|
| 镜头组(Lens) | 由多片塑料或玻璃镜片组成,负责将外界光线汇聚到传感器表面。包含对焦马达(VCM)驱动镜片移动实现自动对焦。 | 焦距、光圈(F-number)、视场角(FOV) |
| 红外滤光片(IR Filter) | 位于镜头与传感器之间,截止红外光(通常 > 700nm),只允许可见光通过,防止红外光干扰色彩还原。 | 截止波长、透过率曲线 |
| 图像传感器(Image Sensor) | 核心光电转换器件,将光信号转换为电信号。主流技术为 CMOS(互补金属氧化物半导体)。 | 像素尺寸、分辨率、帧率、动态范围 |
| 图像信号处理器(ISP) | 专用硬件芯片或集成在 SoC 中,负责对原始 RAW 数据进行去马赛克、降噪、自动白平衡、色彩校正、伽马校正等处理,输出 YUV 或 JPEG。 | 处理位深、管线延迟、支持的最大分辨率 |
| 闪光灯(Flash) | 通常为双色温 LED,提供辅助照明,改善低光环境下的曝光和色彩。 | 色温、显色指数(CRI)、亮度 |
| 马达(Actuator) | 音圈马达(VCM)或步进马达,驱动镜头移动实现自动对焦(AF)和光学防抖(OIS)。 | 行程、响应时间、功耗 |
CameraCharacteristics 类提供了查询硬件能力的方法,例如 LENS_INFO_AVAILABLE_FOCAL_LENGTHS 获取焦距列表,SENSOR_INFO_PHYSICAL_SIZE 获取传感器物理尺寸。理解这些参数有助于计算视场角和选择最佳预览分辨率。
下图展示了相机模组的典型物理结构层次:
1.2 图像传感器工作原理
图像传感器是相机的“视网膜”。当前移动设备几乎全部采用 CMOS(互补金属氧化物半导体) 传感器,其核心工作原理基于 光电效应:
- 光子捕获: 每个像素(Photosite)上的微透镜将光线聚焦到光电二极管(Photodiode)。
- 电荷积累: 光子撞击硅基材料,激发电子-空穴对,产生光生电荷。电荷量与入射光强度成正比。
- 电荷读出: 通过行选择(Row Select)和列读出(Column Readout)电路,逐行将电荷转换为电压信号。
- 模数转换(ADC): 每个像素的模拟电压被 ADC 转换为数字值(通常 10-bit 或 12-bit),形成 RAW 数据。
传感器上覆盖着 拜耳滤色镜阵列(Bayer Filter Array),最常见的 RGGB 模式如下:
RAW_SENSOR 格式获取原始拜耳数据,用于专业后期处理。
1.3 数字图像基础:YUV 与 RGB
相机 ISP 输出的数字图像通常有两种色彩编码方式:RGB 和 YUV。理解两者的区别对滤镜开发和图像处理至关重要。
1.3.1 RGB 色彩空间
RGB 使用红(R)、绿(G)、蓝(B)三个分量表示颜色,每个分量通常为 8-bit(0-255)。RGB 适合显示设备(屏幕),但数据量大(每个像素 3 字节),且三个分量高度相关,不利于压缩和传输。
1.3.2 YUV 色彩空间
YUV 将亮度(Luma, Y)与色度(Chroma, U/V)分离。人眼对亮度变化更敏感,对色度变化不敏感,因此可以对 UV 分量进行 子采样(Chroma Subsampling) 来压缩数据量。Android 相机最常用的格式是 NV21 和 YUV_420_888。
| 格式 | Y 平面 | UV 平面 | 子采样 | 每像素字节数 | 备注 |
|---|---|---|---|---|---|
| NV21 | 全分辨率 | 交错 VU(V 在前) | 4:2:0 | 1.5 | Camera1 默认格式,已逐渐淘汰 |
| YUV_420_888 | 全分辨率 | 两个独立平面 U 和 V | 4:2:0 | 1.5 | Camera2 推荐格式,支持多平面 |
| NV12 | 全分辨率 | 交错 UV(U 在前) | 4:2:0 | 1.5 | 视频编码常用格式 |
| RGB888 | — | — | 无 | 3.0 | OpenGL 纹理常用格式 |
YUV 与 RGB 的转换公式(BT.601 标准,范围 0-255):
// YUV → RGB
R = Y + 1.402 * (V - 128)
G = Y - 0.344 * (U - 128) - 0.714 * (V - 128)
B = Y + 1.772 * (U - 128)
// RGB → YUV
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.169 * R - 0.331 * G + 0.500 * B + 128
V = 0.500 * R - 0.419 * G - 0.081 * B + 128
OES_EGL_image_external 扩展)。CPU 转换 1080p 图像每帧需要数毫秒,会导致预览卡顿。
1.4 相机预览流程
从用户点击“打开相机”到屏幕上出现预览画面,涉及 Android 相机框架、HAL(硬件抽象层)、ISP 和显示系统的协同工作。以下是 Camera2 API 下的标准预览流程:
Camera2 预览的核心代码骨架如下:
// 1. 获取 CameraManager
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
// 2. 打开相机
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 3. 创建 CaptureSession
List<Surface> outputs = new ArrayList<>();
SurfaceTexture texture = textureView.getSurfaceTexture();
texture.setDefaultBufferSize(previewWidth, previewHeight);
Surface surface = new Surface(texture);
outputs.add(surface);
camera.createCaptureSession(outputs, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 4. 创建预览请求
CaptureRequest.Builder builder = camera.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(surface);
// 设置自动对焦、自动白平衡等参数
builder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 5. 发送重复请求
session.setRepeatingRequest(builder.build(), null, null);
}
}, null);
}
}, null);
- 使用
TextureView配合SurfaceTexture可以获得最高效的 GPU 预览路径,便于后续接入 OpenGL 滤镜。 - 预览分辨率不要超过屏幕分辨率,避免不必要的带宽浪费。通常 1920x1080 或 1280x720 即可。
- 在
CaptureRequest中设置CONTROL_AE_TARGET_FPS_RANGE为 [30, 30] 或 [60, 60] 来锁定帧率,避免帧率波动导致画面卡顿。
1.5 本章小结
本章建立了相机开发所需的基础知识体系:
- 硬件组成: 镜头、IR 滤光片、CMOS 传感器、ISP 构成了从光到数字图像的物理链路。
- 传感器原理: 光电效应 + 拜耳阵列 + 去马赛克是 RAW 到 RGB 的核心过程。
- YUV/RGB: YUV 通过色度子采样节省带宽,是相机输出的主流格式;RGB 适合 GPU 渲染。
- 预览流程: Camera2 通过 CaptureRequest → HAL → Sensor/ISP → Surface 的循环实现实时预览。