[Camera效果] 高通 429 AF 概述

本文来自于我的前同事-小卢,一个很有个性,能力又不错的年轻小伙子!
(文章已经得他本人同意分享)

429 AF 与 8909 有很大的区别,这种差别体现在算法的提升与架构的改善,下面简要介绍 429 CAF 的基本概念

Contrast Auto Focus

顾名思义,基于场景反差值进行马达位置搜索,找到一个反差值最大的位置,那这个位置就是当前距离最终的位置。因此,对于 CAF 而言,有两个概念是必须要清楚的:

  1. 搜索范围
  2. 合焦条件

1. 搜索范围

搜索范围最大是 0~1023,但不可能会设置这么大,因为马达可以活动的范围也有限,且这么大的搜索范围会非常限制对焦速度。

高通的搜索范围一般是从无穷远(5m左右)到 7cm (有时只有 10cm)

typedef enum _single_index_t
2372{
    
    
2373    SINGLE_NEAR_LIMIT_IDX    = 0,
2374    SINGLE_7CM_IDX           = 1,
2375    SINGLE_10CM_IDX          = 2,
2376    SINGLE_14CM_IDX          = 3,
2377    SINGLE_20CM_IDX          = 4,
2378    SINGLE_30CM_IDX          = 5,
2379    SINGLE_40CM_IDX          = 6,
2380    SINGLE_50CM_IDX          = 7,
2381    SINGLE_60CM_IDX          = 8,
2382    SINGLE_120CM_IDX         = 9,
2383    SINGLE_HYP_F_IDX         = 10,
2384    SINGLE_INF_LIMIT_IDX     = 11,
2385    SINGLE_MAX_IDX           = 12,
2386} single_index_t;

以下是 ov13b10 dw9714 的案例

/* Index */
{
    
    
    350, 385, 425, 474, 541, 569, 585, 605, 617, 629, //0~9
	645, 677 
},

这是至关重要的一步,可以说,如果这一步的数据不准确,那将会严重影响 AF 准确性

2. 合焦条件

搜索什么时候结束,这是由合焦条件来确定的,但这个条件每个平台都可能不一样,而且开放的调试接口也可能有差异,例如以下 log

可以发现,i1 ~ i5 已经出现了极大值点——549,但是 AF 却没有停下来,反而转换了一次方向继续搜索,最终也证明,final pos = 547,其实和 i1 ~ i5 找到的 549 非常接近,那么是什么原因使 AF 没有在 i5 就停下呢?

这个要参考高通提供的 3A 部分逻辑

algo logic:
case HJ_SCAN_DECREASE:
{
    
    
	AF_MSG_LOW("HJ_SCAN_DECREASE");
	if (is_flat_curve)
	{
    
    
		AF_MSG_LOW("flat curve detected, moving to hyperfocal %d",hyp_pos);
		saf->final_pos = hyp_pos;
		af_single_hj_end_search(p_caf_instance, HJ_AF_SINGLE_FAILED);
		return;
	} else if (saf->reverse_scan_cnt == 0)
	{
    
    
		/*Scan to Reverse direction*/
		/*We don't use multi kernal. So don't need to check if sw stats or
		hw stats*/
		target_start_pos = saf->af_index[fv_info->max_index];
		af_single_hj_start_srch_reverse(p_caf_instance, target_start_pos);
	} else
	{
    
    
		/* Decrease and Reverse != 0*/
		/*feature eable for flat_curve_detection_by_fratio & spot light 		detection*/
		AF_MSG_LOW("Decrease in Reversed direction!");
	}

2. Entering af_single_hj_start_srch_reverse function:
void af_single_hj_start_srch_reverse(
af_caf_search_internal_t *p_caf_instance, int target_pos)
{
    
    
	af_single_hj_lib_info_t *saf = &p_caf_instance->af_single->af_hj_lib_info;
	af_tuning_algo_adapter_t *af_tuning = &p_caf_instance->af_tuning->af_algo;
	boolean ignore_first_invalid_frame =
	(boolean)af_tuning->algo_extended.en_ignore_first_invalid_frame;

	/* set the starting position */
	saf->dest_pos =
	af_single_hj_set_start_pos_reverse(p_caf_instance, target_pos);

	/* House Keeping */
	saf->reverse_scan_cnt++;
	saf->saf_scan_state = AF_PRE_SCAN;
}

3.reverse_scan_cnt++,Enter another logic.
print log:
AF_MSG_LOW("Decrease in Reversed direction!");

基于以上分析,可以肯定的是,在正常情况下,AF 必定要进行两次搜索,一次正向,另一次反向,依次来提高 final pos 的可信度,这种做法明显的好处是提高了对焦准确率,但明显的坏处就是降低了对焦速度。而且,从高通提供的代码来看,这种做法是默认做法,也不提供调试接口。

猜你喜欢

转载自blog.csdn.net/justXiaoSha/article/details/121471168
AF