Android MTK PDAF流程
PDAF:Phase Detection Auto Focus
PDAF sensor的實(shí)現(xiàn)原理(SPC結(jié)構(gòu)):
PDAF通過(guò)比較L/R PD pixel構(gòu)成的兩幅圖像,PD算法會(huì)計(jì)算出當(dāng)前的相位差,根據(jù)相位差和模組的PD calibration data,估算出像距,從而移動(dòng)lens快速對(duì)焦,PDAF快速對(duì)焦的搜索范圍[infinity,macro]主要來(lái)自于燒錄的OTP中的AF段,此距離并未實(shí)際與物體的物理距離即轉(zhuǎn)換后的DAC值。PDAF OTP中主要燒錄以上的SPC(shield pixel calibration)用于補(bǔ)償遮光后的亮度增益,DCC(defocus conversion coefficient)主要是用于將相位差轉(zhuǎn)換為L(zhǎng)ens移動(dòng)的距離,DCC中數(shù)值是通用過(guò)PD Diff 與DAC的關(guān)系擬合一條曲線的斜率(即PDAF線性度斜率)
PD pixel types主要有以下三類(lèi),Dual PD、Super PD、Shield PD。
目前接觸使用的都是Shield PD(像素點(diǎn)有一半會(huì)被遮擋),信噪比SNR一般是越大越好(S/N S表示攝像機(jī)在假設(shè)無(wú)噪聲時(shí)的圖像信號(hào)值,N表示攝像機(jī)本身產(chǎn)生的噪聲值);Shield PD 信噪比SNR一般比較差,但是能支持大尺寸像素;
Dual PD指每一個(gè)像素底部的感光區(qū)域一分為二,在同一個(gè)像素內(nèi)即可獲得相位差,也稱2PD,全像素雙核對(duì)焦,PD點(diǎn)覆蓋率100%;
Super PD相鄰兩個(gè)像素共用一個(gè)micor lens(微透鏡用于提高感光度)得到相位差信息
CMOS傳感器的結(jié)構(gòu):1.微透鏡 2.色彩濾鏡 3.感光片(光電二極管)4.高速傳輸電路 (Mono sensor沒(méi)有色彩濾鏡,黑白)
SensorType:不同的類(lèi)型主要是針對(duì)PD pixel和PD value是由sensor還是ISP處理;接觸較多的Type 2 PDAF_SUPPORT_CAMSV
MTK不同SensorType的總體處理流程:
MTK PDAF Flow:
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr.cpp MTK
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr_open.cpp 3rd party
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/hal3a/v3.0/HAL3AFlowCtrl.cpp
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/utils/pdtblgen/pdtblgen.cpp
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_6s/af_assist_mgr.cpp
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr.cpp
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr/xxx_mipi_raw/pd_xxx_mipiraw.cpp
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/mem/common/v2/cam_cal_drv.cpp
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/mem/common/v2/cam_cal_helper.cpp
vendor/mediatek/proprietary/custom/common/hal/imgsensor_src/camera_calibration_cam_cal.cpp
kernel-4.14/drivers/misc/mediatek/cam_cal/src/common/v2/eeprom_driver.c
(1) 前4個(gè)變量和L/R的坐標(biāo)可直接從PD INI文檔中獲取
(2) i4PairNum指一個(gè)block中有幾對(duì)L/R pixel
(3) i4SubBlkW 和 i4SubBlkH 分別對(duì)應(yīng)PD INI文檔中的 PD_DENSITY_X/Y
(4) i4BlockNumX 和 i4BlockNumY 分別對(duì)應(yīng)PD INI文檔中的 PD_BLOCK_NUM_X_Y
(5) iMirrorFlip 指出圖方向與 模組廠 calibration出圖方向的相對(duì)方向
pd_info都是從4000*3000 尺寸上操作的,原來(lái)值的計(jì)算方式是
i4BlockNumX = ( 4000 - 16 * 2 ) / 16 = 248
i4BlockNumY = ( 3000 - 12 * 2 ) / 16 = 186
由于1920*1080是crop后的,故i4BlockNumX 和 i4BlockNumY 是需要修改的 ,與otp中的是不一致的
i4BlockNumX = 1920 / 16 = 120
i4BlockNumY = 1080 / 16 = 67.5 = 67
i4Crop用于記錄[Scenario][Crop] -> [x_crop][y_crop] RAW_OFFSET_X = 1040 RAW_OFFSET_Y = 960
1920*1080在驅(qū)動(dòng)中用于配置SensorMode 6,應(yīng)該前面一個(gè){1040, 960}不用填,是SensorMode2
i4Crop = (4000 - 1040) / 2 (3000 - 960) / 2 = 1920 1080
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr/xxx_mipi_raw/pd_xxx_mipiraw.cpp
MBOOL PD_xxxMIPIRAW::IsSupport( SPDProfile_t &iPdProfile) {if (( iPdProfile.i4SensorMode == 5) && ((iPdProfile.uImgXsz == 1920) && (iPdProfile.uImgYsz == 1080))){m_PDBufXSz = 240;m_PDBufYSz = 536;if(m_PDBuf){delete m_PDBuf;m_PDBuf = nullptr;}m_PDBufSz = m_PDBufXSz*m_PDBufYSz;m_PDBuf = new uint16_t [m_PDBufSz];ret = MTRUE;AAA_LOGD("[1080P 60fps] is Support : i4SensorMode:%d w[%d] s[%d]\n", iPdProfile.i4SensorMode,iPdProfile.uImgXsz, iPdProfile.uImgYsz);}... }m_PDXSz代表每一行傳送pixel num = PitchX / DensityX * BlockNumX = 16 / 8 * 120 = 240
m_PDYSz代表傳送的行數(shù)line num = PitchY / DensityY * 2 * BlockNumY = 16 / 8 *2 *67 = 536
i4FocusPDSizeY = RAW_HIGHT * tracking_height / 100 / max_pd_win_y / PD_DENSITY_Y
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 1080 * 38 / 100 / 3 / 4 = 34.2 = 32
i4FocusPDSizex = RAW_WIDTH * tracking_width / 100 / max_pd_win_x / PD_DENSITY_X
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 1920 * 37 / 100 / 3 / 8 = 29.6 = 28
8032 6032 sensor內(nèi)部有效像素 crop → binning → crop 如果有還要小的尺寸還需要crop
為了保持中心一致 0 12 上下都裁剪 crop
8032-(0 * 2) 6032 -(12 * 2)= 8032 6008 再binning
4016 3004 繼續(xù)上下crop
4016-(8 * 2)3004(2*2)= 4000 * 3000 最終輸出 tgsize
Type 2會(huì)使用VC(Virtual channel control),VC的主要作用就是將數(shù)據(jù)流的數(shù)據(jù)通過(guò)不同的通道分離給不同的流程。通過(guò)每一幀都是包含圖像幀+PD 虛擬幀(將Bayer數(shù)據(jù)和PD數(shù)據(jù)按照MIPI協(xié)議打包)
圖像幀(Image Data VC=0 DT=0x2B RAW10)
? ? ? ? 0x0780 = 1920 0x0438 = 1080 ;
PD 虛擬幀(PDAF Data VC=1 DT=0x30 通過(guò)date type區(qū)分通道)
? ? ? ? 0x012C = 120 * 2 * 10 / 8 = 300 //.i4BlockNumX = 120, // PD block number in X direction
? ? ? ? 0x0218 = 67 * 4 * 2 = 536 ? ?? ?? ? //.i4BlockNumY = 67, // PD block number in Y direction
PDAF線性度測(cè)試:
ISO<200,對(duì)著菱形圖20cm 位置下,在Confidence > 60的場(chǎng)景下抓取log,在log里查找PD Value與AF DAC,看他們是否是呈線性關(guān)系
插入一下OTP相關(guān)的知識(shí)
LCS Lens Shade Correction gridx gridy 垂直和網(wǎng)格大小,周?chē)炼炔痪鶆?#xff0c;處理不好可能經(jīng)算法會(huì)有豎條紋,光暈等 BLC BlackLevel Correction 黑電平校正 (沒(méi)有做黑電平校正的的圖會(huì)更亮,影響圖像的對(duì)比度)sensor輸出的電壓越高,電流越大,而sensor電路本算存在暗電流,導(dǎo)致沒(méi)有光線輸入時(shí)也有一定的輸出電壓,所以需要把這一部分去掉,所有像素都減去一個(gè)校準(zhǔn)值,raw10對(duì)應(yīng)的OB(Optical Black)一般為64,需要注意init setting中的寄存器修改 AWB Auto White Balance RGB轉(zhuǎn)成Bayer模式的圖一般由(R Gr Gb B四個(gè)通道的值) ,AWB一般比較關(guān)注R/G B/G的值,Gr Gb一般值都比較接近,R/G 變大時(shí),意味著R gain減小,整幅圖R分量少了,就會(huì)呈現(xiàn)泛綠泛藍(lán),燒錄的數(shù)據(jù)主要是當(dāng)前模組和Golden模組(一批生產(chǎn)中較為平均的做基準(zhǔn))的R Gr Gb B的數(shù)據(jù)總結(jié)
以上是生活随笔為你收集整理的Android MTK PDAF流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Javascript 检测 页面是否在i
- 下一篇: web控件开发系列(四) 自定义控件属性