本文基于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
浙公网安备 33010602011771号