? ?在手機中走孽,我們常將camera直接稱為sensor省容。
? ?一缸夹、sensor的種類
? ? ? ?其實這個對于驅(qū)動來說基本略知就可以了术陶,處于那種說出來要知道是在說sensor的專業(yè)名次這種程度就OK了凑懂!一般來說,sensor有兩大類梧宫,CMOS和CCD接谨。
一般來說,CCD的功耗高塘匣,拍攝質(zhì)量高脓豪,造價高,他更適合在數(shù)碼相機或DV中使用忌卤,而我們的手機中扫夜,在像素要求本來就不是苛刻,但是對空間和成本有比較高要求的話,一般都會選擇CMOS的攝像頭笤闯。它的工作原理很簡單堕阔,接收外界光線后轉(zhuǎn)化為電能,再透過芯片上的模-數(shù)轉(zhuǎn)換器(ADC)將獲得的影像訊號轉(zhuǎn)變?yōu)閿?shù)字信號輸出
二颗味、sensor的輸出格式
? ? ? ?同樣超陆,sensor的輸出格式也不是單一的,可以分為YUV浦马、JPEG时呀、RGB、RAW晶默,這幾種格式退唠。
? ? ? ?1、YUV
“Y”表示明亮度(Luminance荤胁、Luma),“U”和“V”則是色度屎债、濃度(Chrominance仅政、Chroma), 一般情況下sensor支持YUV422格式,即數(shù)據(jù)格式是按Y-U-Y-V次序輸出的盆驹。
? ? ? ?2圆丹、JPEG
這個不用很介紹,作為一種存儲格式它是非常普遍的躯喇,但是作為sensor的輸出格式的話辫封,一般是低分辨率的,其自帶JPEG engine廉丽,可以直接輸出壓縮后的jpg格式的數(shù)據(jù)
? ? 3倦微、RGB
傳統(tǒng)的紅綠藍格式,比如RGB565.通俗點說它的顏色混合方式就好像有紅正压、綠欣福、藍三盞燈,當它們的光相互疊合的時候焦履,色彩相混拓劝,而亮度卻等于兩者亮度之總和,越混合亮度越高,即加法混合嘉裤。
? ?4郑临、RAW
圖像感應器將捕捉到的光源信號轉(zhuǎn)化為數(shù)字信號的原始數(shù)據(jù)。RAW文件是一種記錄了數(shù)碼相機傳感器的原始信息屑宠,同時記錄了由相機拍攝所產(chǎn)生的一些原數(shù)據(jù)(Metadata厢洞,如ISO的設(shè)置、快門速度、光圈值犀变、白平衡等)的文件妹孙。RAW是未經(jīng)處理、也未經(jīng)壓縮的格式获枝,可以把RAW概念化為“原始圖像編碼數(shù)據(jù)”或更形象的稱為“數(shù)字底片”蠢正。
好了,介紹完他們的輸出格式之后省店,我們有樣的疑問嚣崭,我該選擇哪種格式作為輸出呢?
sensor的輸出格式一般都為YUV的懦傍,他的流程是:攝像機的原始數(shù)據(jù)應該是RAW來記錄的雹舀,里面的數(shù)據(jù)可能會是RAW RGB來表示,然后sensor模組里面自帶的ISP會將數(shù)據(jù)轉(zhuǎn)換成YUV格式的輸出出來粗俱,輸出到我們的AP里面后DSP會將YUV格式轉(zhuǎn)換成RGB的说榆,然后在輸出到屏上,如果是拍攝出來的就要經(jīng)過DSP將格式再轉(zhuǎn)換成為JPEG的存儲下來寸认。
這就讓我們很費解签财,既然能夠輸出RGB格式的數(shù)據(jù),為什么又幾經(jīng)周折偏塞,轉(zhuǎn)換來轉(zhuǎn)換去唱蒸,費時費力?在這里我們就要在照片質(zhì)量和處理速度上做一個權(quán)衡灸叼。
? ?首先神汹,如果說數(shù)據(jù)量最小,那么莫過于RAW格式古今,但是屁魏,數(shù)據(jù)傳輸過來要經(jīng)過一次性大量的計算才能將里面的信息提取出來,如果你想用捉腥,一般5M以上sensor就只輸出RAW數(shù)據(jù)以保證比較快的輸出速度蚁堤,后端掛一個DSP來處理輸出的數(shù)據(jù)。其次是JPEG但狭,數(shù)據(jù)量也很小披诗,但是同樣要求較快的處理速度。
? ?而RGB和YUV一個像素都是占用了2B的大小立磁,但是RGB卻可以數(shù)據(jù)讀出來直接刷到屏上呈队,為什么要卻要選擇YUV的呢?原因在于YUV輸出亮度信號沒有任何損失唱歧,而色偏信號人眼并不是特別敏感宪摧,RGB565輸出格式是R5G3 G3B5會丟掉很多原始信息粒竖,所以YUV圖像質(zhì)量和穩(wěn)定性要比RGB565好的多。
? 那么几于,雖然在一般平臺上默認的是YUV的蕊苗,并不是說他是最好的或不可更改的,我們要根據(jù)不同的情況選擇時候?qū)崟r的輸出格式沿彭!
說一說架構(gòu)格式朽砰,非常固定,首先在sensor_cfg.c里面申明并定義一個SENSOR_INFO_T結(jié)構(gòu)指針喉刘,然后就可以在具體的sensor_***.c里面實現(xiàn)你的驅(qū)動代碼瞧柔!
調(diào)試sensor常見的問題:
1.讀不到ID:需要確認三個電源,power down 和reset的極性睦裳,mclk造锅,I2C是否正常打開。如果這些信息確認是正確的廉邑,還不能讀到ID基本可以確認是sensor的硬件問題哥蔚。
2.能讀到ID但是點不亮:這是最常見的情況,這個是時候已經(jīng)能確認上述的硬件信號都是正常的蛛蒙,先要看HS/VS/PCLK的極性是否配置的正確糙箍,是否在預覽前丟了1幀以上,sensor的輸出尺寸是否正確宇驾。這些通常需要通過sensor的datasheet來查看寄存器配置的是否正確。
3.拍照死機:要確認是否在拍照的時候設(shè)置了set_mode(用來設(shè)置拍照時的sensor輸出數(shù)據(jù)大小的設(shè)置)猴伶,memory是否足夠大课舍?
DC_MEM = Frame_W*Frame_H*2 *MAX((1 + need_rotation),(1+is_jpg)) + 1M根據(jù)這個公式算出來,在dc_product_cfg.c中進行配置他挎。
4.花屏:如果是很多綠線的花屏的話那么通常是HS/VS/PCLK的極性配置反了或者驅(qū)動電流太小被干擾了筝尾,如果是紅藍的顏色反了的那么是yuv輸出數(shù)據(jù)反了,在yuv_info中進行配置办桨。
5.分屏:這個是刷屏的時候刷的不是同一幀數(shù)據(jù)筹淫,是LCD的FMARK引腳沒有引出來,或者沒有配置呢撞。如果LCD沒有這個腳的話损姜,需要估算一下刷屏的時間,然后將sensor輸出的幀率調(diào)的跟它匹配殊霞。
6.旋轉(zhuǎn):預覽的在startpreview里的rotation設(shè)置成需要的角度摧阅,拍照的在_DCAMERA_DoSnapshot里面將rotation設(shè)置成需要的角度,VT在傳給底層參數(shù)時將screen2sensor_angle設(shè)置為DVT_MW_ROTATE_90或其他角度绷蹲。