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)。 行程、响应时间、功耗
开发提示: 在 Camera2 API 中,CameraCharacteristics 类提供了查询硬件能力的方法,例如 LENS_INFO_AVAILABLE_FOCAL_LENGTHS 获取焦距列表,SENSOR_INFO_PHYSICAL_SIZE 获取传感器物理尺寸。理解这些参数有助于计算视场角和选择最佳预览分辨率。

下图展示了相机模组的典型物理结构层次:

相机模组硬件结构示意图 镜头组 多片镜片 VCM 马达 对焦/防抖 光线 IR 滤光片 截止红外光 保留可见光 图像传感器 CMOS 像素阵列 光电转换 输出 RAW 数据 ISP 去马赛克 降噪 / AWB 输出 YUV/JPEG 光线依次经过镜头组 → IR 滤光片 → 传感器 → ISP,最终输出数字图像数据供应用层使用 Camera2 的 CaptureRequest 可控制每个硬件模块的参数(曝光、增益、对焦位置等)

1.2 图像传感器工作原理

图像传感器是相机的“视网膜”。当前移动设备几乎全部采用 CMOS(互补金属氧化物半导体) 传感器,其核心工作原理基于 光电效应:

  1. 光子捕获: 每个像素(Photosite)上的微透镜将光线聚焦到光电二极管(Photodiode)。
  2. 电荷积累: 光子撞击硅基材料,激发电子-空穴对,产生光生电荷。电荷量与入射光强度成正比。
  3. 电荷读出: 通过行选择(Row Select)和列读出(Column Readout)电路,逐行将电荷转换为电压信号。
  4. 模数转换(ADC): 每个像素的模拟电压被 ADC 转换为数字值(通常 10-bit 或 12-bit),形成 RAW 数据。

传感器上覆盖着 拜耳滤色镜阵列(Bayer Filter Array),最常见的 RGGB 模式如下:

拜耳阵列(RGGB)与像素结构 R G R G G B G B R G R G G B G B 每个像素只记录 一种颜色分量 绿色像素数量是 红/蓝的 2 倍 (人眼对绿色最敏感) 去马赛克 RGB 图像
关键概念: 传感器输出的 RAW 数据是 拜耳模式 的,每个像素只有 R/G/B 中的一种颜色信息。ISP 通过 去马赛克(Demosaicing) 算法插值出每个像素的完整 RGB 值。在 Camera2 中,可以通过 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
性能警告: 在 Android 相机开发中,避免在 CPU 上逐像素转换 YUV ↔ RGB。对于实时滤镜,应使用 OpenGL ES 着色器(Shader)在 GPU 上完成转换,或者直接使用 YUV 纹理(通过 OES_EGL_image_external 扩展)。CPU 转换 1080p 图像每帧需要数毫秒,会导致预览卡顿。

1.4 相机预览流程

从用户点击“打开相机”到屏幕上出现预览画面,涉及 Android 相机框架、HAL(硬件抽象层)、ISP 和显示系统的协同工作。以下是 Camera2 API 下的标准预览流程:

Camera2 预览数据流架构图 应用层 (App) Camera2 API Camera Service HAL (硬件抽象层) 硬件 (Sensor + ISP) 预览流程步骤 ① App 通过 CameraManager.openCamera() 打开相机 ② 创建 CaptureSession,配置输出 Surface(如 TextureView) ③ 发送重复 CaptureRequest(TEMPLATE_PREVIEW) ④ Camera Service 将请求下发到 HAL ⑤ HAL 驱动 Sensor 曝光,ISP 处理 RAW → YUV ⑥ 处理后的帧通过 BufferQueue 返回给 App ⑦ Surface 消费帧数据,渲染到 TextureView ⑧ 循环 ③-⑦,形成连续预览流

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 的循环实现实时预览。