本文基于Android Camera HAL 3.0规范,实现AF(自动对焦)模块的Native(C++)代码,核心目标是衔接上层Camera框架与底层硬件(步进电机、图像传感器),封装对比度对焦算法为标准化HAL接口。实现遵循“硬件抽象解耦、算法可配置、状态可查询”原则,适配消费级嵌入式相机场景,支持单区域自动对焦、手动对焦、状态反馈等核心能力。

一、HAL层AF模块核心设计思路

AF HAL层作为“上层框架-底层硬件”的中间层,需解决三个核心问题:接口标准化(兼容上层Camera HAL调用)、硬件解耦(适配不同厂商步进电机/传感器)、算法集成(复用对比度对焦核心逻辑)。整体架构如下:

AF HAL层核心架构: 上层调用 → 标准化HAL接口(C风格兼容) → 核心控制模块(C++) → 硬件适配层(电机/传感器) ↳ 算法模块(对焦区域选择/清晰度评价/爬山法驱动) ↳ 状态管理模块(互斥锁保护)

关键设计要点:

  • 接口风格:采用extern "C"封装C++逻辑,兼容上层C风格调用;
  • 硬件解耦:通过虚基类定义电机/传感器适配接口,支持不同硬件快速替换;
  • 线程安全:使用互斥锁保护设备状态(如镜头位置、合焦状态),避免并发访问冲突;
  • 可配置性:通过XML配置文件加载对焦参数(步长、阈值、区域大小),无需重新编译适配不同设备。

二、核心数据结构定义

定义AF设备状态、配置参数、硬件适配接口等核心数据结构,为后续实现奠定基础。

#include 
#include 
#include 
#include 
#include 
#include  // 用于解析配置文件(需链接jsoncpp库)
using namespace cv;
using namespace std;
// 1. AF对焦状态枚举(对应上层Camera HAL状态)
typedef enum {
    AF_STATUS_IDLE = 0,        // 空闲
    AF_STATUS_INITING,         // 初始化中
    AF_STATUS_FOCUSING,        // 对焦中
    AF_STATUS_FOCUSED,         // 合焦成功
    AF_STATUS_UNFOCUSED,       // 合焦失败
    AF_STATUS_ERROR            // 硬件错误
} AF_Status;
// 2. AF配置参数结构体(可通过配置文件加载)
typedef struct {
    int coarse_step;           // 粗调步长(μm),默认2μm
    int fine_step;             // 精调步长(μm),默认1μm
    double focus_thresh;       // 合焦阈值,默认400
    double drop_thresh;        // 清晰度下降阈值,默认50
    int min_lens_pos;          // 镜头最小位置(μm),默认0
    int max_lens_pos;          // 镜头最大位置(μm),默认10000
    int focus_region_ratio;    // 对焦区域占比(1/ratio),默认3(中心1/9区域)
    int smooth_window_size;    // 多帧平滑窗口大小,默认3
} AF_Config;
// 3. 硬件适配接口(虚基类,适配不同厂商硬件)
class AF_HwInterface {
public:
    // 初始化硬件(步进电机+传感器)
    virtual int HwInit() = 0;
    // 释放硬件资源
    virtual int HwDeinit() = 0;
    // 驱动镜头移动
    virtual int DriveLens(int current_pos, int step, int direction) = 0;
    // 采集单帧图像(用于清晰度评价)
    virtual Mat CaptureImage() = 0;
    // 虚析构,确保子类资源释放
    virtual ~AF_HwInterface() {}
};
// 4. AF设备核心结构体(HAL层核心对象)
typedef struct {
    AF_Status status;          // 当前对焦状态
    AF_Config config;          // 对焦配置参数
    int current_lens_pos;      // 当前镜头位置(μm)
    Rect focus_region;         // 当前对焦区域
    double current_sharpness;  // 当前清晰度值
    AF_HwInterface* hw_if;     // 硬件适配接口指针
    mutex mtx;                 // 线程安全互斥锁
} AF_Device;
// 5. 全局AF设备指针(单设备场景,多设备可扩展为数组)
static AF_Device* g_af_device = nullptr;

二、核心算法与HAL接口封装

HAL层核心逻辑分为“算法复用”与“接口封装”两部分:复用前文对比度对焦核心算法(对焦区域选择、清晰度评价、爬山法驱动),封装为HAL标准化接口(初始化、启动对焦、状态查询等)。

2.1 核心算法复用(适配HAL层)

基于前文对比度对焦算法,适配HAL层硬件交互逻辑(图像采集、镜头驱动通过硬件接口实现)。

/**
 * @brief 对焦区域选择(复用算法,适配HAL层图像输入)
 * @param img 传感器采集的图像
 * @param config 对焦配置(区域占比)
 * @return Rect 选中的对焦区域
 */
static Rect AF_SelectFocusRegion(const Mat& img, const AF_Config& config) {
    Rect focus_rect;
    // 1. 自动区域选择(Canny边缘检测+轮廓分析)
    Mat gray, blur_img, edge;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    GaussianBlur(gray, blur_img, Size(3, 3), 0);
    Canny(blur_img, edge, 50, 150);
    vector> contours;
    vector hierarchy;
    findContours(edge, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    double max_area = 0.0;
    for (const auto& cnt : contours) {
        double area = contourArea(cnt);
        if (area > max_area && area > 5000) { // 过滤小面积噪声
            max_area = area;
            focus_rect = boundingRect(cnt);
        }
    }
    // 2. 兜底:中心区域(1/ratio)
    if (max_area == 0.0) {
        int w = img.cols / config.focus_region_ratio