1、攝像頭結構和工做原理.前端
拍攝景物經過鏡頭,將生成的光學圖像投射到傳感器上,而後光學圖像被轉換成電信號,電信號再通過模數轉換變爲數字信號,數字信號通過DSP加工處理,再被送到電腦中進行處理,最終轉換成手機屏幕上可以看到的圖像。java
數字信號處理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是經過一系列複雜的數學算法運算,對數字圖像信號參數進行優化處理,並把處理後的信號經過USB等接口傳到PC等設備。DSP結構框架:android
1. ISP(image signal processor)(鏡像信號處理器)算法
2. JPEG encoder(JPEG圖像解碼器)架構
3. USB device controller(USB設備控制器)app
常見的攝像頭傳感器類型主要有兩種,框架
一種是CCD傳感器(Chagre Couled Device),即電荷耦合器。ide
一種是CMOS傳感器(Complementary Metal-Oxide Semiconductor)即互補性金屬氧化物半導體。函數
CCD的優點在於成像質量好,可是製造工藝複雜,成本高昂,且耗電高。在相同分辨率下,CMOS價格比CCD便宜,但圖像質量相比CCD來講要低一些。CMOS影像傳感器相對CCD具備耗電低的優點,加上隨着工藝技術的進步,CMOS的畫質水平也不斷地在提升,因此目前市面上的手機攝像頭都採用CMOS傳感器。優化
手機攝像頭的簡單結構
濾光片有兩大功用:
1.濾除紅外線。濾除對可見光有干擾的紅外光,使成像效果更清晰。
2.修整進來的光線。感光芯片由感光體(CELL)構成,最好的光線是直射進來,但爲了怕干擾到鄰近感光體,就須要對光線加以修整,所以那片濾光片不是玻璃,而是石英片,利用石英的物理偏光特性,把進來的光線,保留直射部份,反射掉斜射部份,避免去影響旁邊的感光點.
2、相關參數和名詞
一、常見圖像格式
1.1 RGB格式:
傳統的紅綠藍格式,好比RGB565,RGB888,其16-bit數據格式爲5-bit R + 6-bit G + 5-bit B。G多一位,緣由是人眼對綠色比較敏感。
1.2 YUV格式:
luma (Y) + chroma (UV) 格式。YUV是指亮度參量和色度參量分開表示的像素格式,而這樣分開的好處就是不但能夠避免相互干擾,還能夠下降色度的採樣率而不會對圖像質量影響太大。YUV是一個比較籠統地說法,針對它的具體排列方式,能夠分爲不少種具體的格式。
色度(UV)定義了顏色的兩個方面─色調與飽和度,分別用CB和CR表示。其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差別。而Cb反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差別。
主要的採樣格式有YCbCr 4:2:0、YCbCr 4:2:二、YCbCr 4:1:1和 YCbCr 4:4:4。
1.3 RAW data格式:
RAW圖像就是CMOS或者CCD圖像感應器將捕捉到的光源信號轉化爲數字信號的原始數據。RAW文件是一種記錄了數碼相機傳感器的原始信息,同時記錄了由相機拍攝所產生的一些元數據(Metadata,如ISO的設置、快門速度、光圈值、白平衡等)的文件。RAW是未經處理、也未經壓縮的格式,能夠把RAW概念化爲「原始圖像編碼數據」或更形象的稱爲「數字底片」。sensor的每一像素對應一個彩色濾光片,濾光片按Bayer pattern分佈。將每個像素的數據直接輸出,即RAW RGB data
Raw data(Raw RGB)通過彩色插值就變成RGB.
RAW格式圖像示例
2. 相關技術指標
2.1 圖像解析度/分辨率(Resolution):
SXGA(1280 x1024)又稱130萬像素
XGA(1024 x768)又稱80萬像素
SVGA(800 x600)又稱50萬像素
VGA(640x480)又稱30萬像素(35萬是指648X488)
CIF(352x288) 又稱10萬像素
SIF/QVGA(320x240)
QCIF(176x144)
QSIF/QQVGA(160x120)
2.2 彩色深度(色彩位數):
256色灰階,有256種灰色(包括黑白)。15或16位彩色(高彩色):65,536種顏色。24位彩色(真彩色):每種原色都有256個層次,它們的組合便有256*256*256種顏色。32位彩色:除了24位彩色的顏色外,額外的8位是儲存重疊圖層的圖形資料(alpha頻道)。
2.3 光學變焦和數碼變焦:
光學變焦: 經過鏡頭的調整,拉近拉遠所要拍攝的對象,保持像素不變和畫質基本不變,卻能夠拍到本身理想的物像。
數碼變焦:其實沒有什麼變焦,只是從原圖片中截取出來放大,你從液晶屏幕上看到變大了,實際上畫質並無本質提升,而像素比你相機能拍攝的最大像素下降了。畫質上說基本是雞肋把,可是能夠提供一些方便。
2.4 圖像壓縮方式:
JPEG/M-JPEG
H.261/H.263
MPEG
H.264
2.5 圖像噪音:
指的是圖像中的雜點干撓。表現爲圖像中有固定的彩色雜點。
2.6 自動白平衡處理技術(auto White Balance):
簡單來講就是:攝像機對白色物體的還原。相關概念:色溫。
2.7 視角:
與人的眼睛成像是相成原理,簡單說就是成像範圍。
2.8 自動對焦:
自動對焦能夠分紅兩大類:一類是基於鏡頭與被拍攝目標之間距離測量的測距自動對焦,另外一類是基於對焦屏上成像清晰的聚焦檢測自動對焦(清晰度算法)。
注:變焦就是把遠處的物體拉近。對焦是讓圖像清晰。
2.9 自動曝光和Gamma:
就是光圈和快門的組合。光圈,快門速度,ISO。Gamma即人眼對亮度的響應曲線。
3、高通的CAMERA部分硬件架構
CAMERA部分硬件架構
VFE:VIDEO front-end 視頻前端
VPE:Video preprocessing 視頻預處理
攝像頭模組中自帶了ISP(圖像信號處理器),因此,VFE和VPE有關圖像效果處理的功能都是關閉的。
1.VFE的功能:
1.1 經過算法提升圖像的質量。1.2 提供高分辨率的圖像的AWB(自動白平衡)/AE(自動曝光)/AF(自動對焦)算法處理。1.3 圖像衰減校訂。1.4 低光下的噪聲濾波。1.5 圖像色彩效果優化。1.6 皮膚顏色效果優化。1.7 圖像抖動計算。1.8 亮度適應算法。2.VPE的功能:2.1 圖像穩定性。2.2 數字對焦。2.3 圖像旋轉。2.4 Overlay。
3、android系統camera基本架構
1.應用層
Camera 的應用層在Android 上表現爲直接調用SDK API 開發的一個Camera 應用APK 包。代碼在/android/packages/apps/Camera 下。主要對 android.hardware.Camera(在Framework中) 類的調用,而且實現Camera 應用的業務邏輯和UI 顯示。一個Android 應用中若要使用這個android.hardware.Camera類,須要在Manifest 文件聲明Camera 的權限,另外還 須要添加一些<uses-feature> 元素來聲明應用中的Camera 特性,如自動對焦等。 具體作法可以下:
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
2.Framework層
2.1 android.hardware.Camera:代碼位置/android/frameworks/base/core/java/android/hardware/Camera.java
這部分目標是framework.jar。這是是Android 提供給app層調用的java接口。這個類用來鏈接或斷開一個Camera 服務,設置拍攝參數,開始、中止預覽,拍照等。
2.2 android.hardware.Camera這個類是和JNI中定義的類是一個,有些方法經過JNI的方式調用本地代碼獲得,有些方法本身實現。
Camera的JAVA native調用部分(JNI):/android/frameworks/base/core/jni/android_hardware_Camera.cpp。Camera.java 承接JAVA 代碼到C++ 代碼的橋樑。編譯生成libandroid_runtime.so 。libandroid_runtime.so庫是公用的, 其中除了Camera 還有其餘方面的功能。
2.3 Camera框架的client部分:
代碼位置:/android/frameworks/base/libs/camera/下5個文件。
Camera.cpp
CameraParameters.cpp
ICamera.cpp
ICameraClient.cpp
ICameraService.cpp
它們的頭文件在/android/frameworks/base/include/camera目錄下。
這部分的內容編譯生成libcamera_client.so 。在Camera 模塊的各個庫中,libcamera_client.so 位於核心的位置,做爲Camera 框架的 Client 客戶端部分,與另一部份內容服務端 libcameraservice.so 經過進程間通信(即Binder 機制)的方式進行通信。
2.4 Camera框架的service部分:
代碼位置:/android/frameworks/base/services/camera/libcameraservice。
這部份內容被編譯成庫libcameraservice.so 。CameraService 是Camera 服務,Camera 框架的中間層,用於連接CameraHardwareInterface 和Client部分 ,它經過調用實際的Camera 硬件接口來實現功能,即下層HAL層。
四. 攝像頭預覽、拍照、錄像基本數據流向和處理流程以及驅動調試
HAl層相關代碼:(frameworks/base/services/camera/libcameraservice/CameraService.cpp)vendor/qcom/android-open/libcamera2/QualcommCameraHardware.cppvendor/qcom/proprietary/mm-camera/apps/appslib/mm_camera_interface.cvendor/qcom/proprietary/mm-camera/apps/appslib/camframe.cvendor/qcom/proprietary/mm-camera/apps/appslib/snapshot.cvendor/qcom/proprietary/mm-camera/apps/appslib/jpeg_encoder.cvendor/qcom/proprietary/mm-camera/apps/appslib/cam_frame_q.cvendor/qcom/proprietary/mm-camera/apps/appslib/cam_display.cvendor/qcom/proprietary/mm-camera/targets/vfe31/8x60/vendor/qcom/proprietary/mm-camera/targets/vfe31/common/vpe1/QualcommCameraHardware.cpp主要分爲三個部分,preview,snapshot,video。它們分別用一個pthread進行處理。另外還有auto focus功能也是用pthread的方式處理。預覽或拍照、視頻線程處理獲得的數據幀都以datacallback的方式回調到上層CameraService.cpp中,進行存儲或預覽等操做。如下是HAL層部分的代碼大概的調用結構流程。
整個模塊主要巡行三個主線程:control、config及frame。
control用來執行總的控制,是上層控制接口。
config主要進行一些配置,這個線程裏面主要進行3A的工做,另外還有一些跟效果有關的設置;
frame線程主要用來作幀queue的循環獲取處理。全部事件或狀態的反饋,用回調函數的方式傳回QualcommCameraHardware.cpp。
2. 驅動部分從設備驅動s5k8aa.c開始。新建平臺設備後,執行入口函數probe時,調用建立攝像頭設備功能函數
int msm_camera_drv_start(struct platform_device *dev, int (*sensor_probe)(const struct msm_camera_sensor_info *, struct msm_sensor_ctrl *))
並將設備信息結構體和攝像頭設備調用入口sensor_probe傳入。msm_camera_drv_start(xxx)函數在msm_camera.c中實現。他建立了提供上層調用的四個終於設備結點:
/dev/msm_camera/frame%d
/dev/msm_camera/control%d
/dev/msm_camera/config%d
/dev/msm_camera/pic%d
實現了上層庫對VFE模塊,VPE模塊,jpeg_encoder模塊和攝像頭sensor模塊驅動的控制調用接口。在file_operations中的相應函數中分別實現的是這些設備的新建初始化和IOCTL功能調用接口。
而後這個函數還建立了四個工做隊列:
struct msm_device_queue event_q; struct msm_device_queue frame_q; struct msm_device_queue pict_q; struct msm_device_queue vpe_q;
event_q包括/dev/msm_camera/control%d傳入的控制信號隊列,用於將上層傳下來的控制命令(command)傳到config thread中去。
frame_q用於對圖像幀的操做管理,預覽或錄像時幀將傳遞給DSP進行處理。
pict_q包含拍照幀,用於給jpeg_encoder進行圖像編碼處理。
vpe_q是VPE控制命令隊列。
s5k8aa.c是相應攝像頭設備的驅動部分。它的功能很簡單,主要實現sensor模塊的建立、初始化和控制。主要實現如下三個函數:
s->s_init = ov2685_sensor_init; s->s_release = ov2685_sensor_release; s->s_config = ov2685_sensor_config;ov2685_sensor_init函數:
主要實現攝像頭的上電、時鐘控制(MCLK)、設備初始化功能。 上電分爲DOVDD、DVDD、AVDD、reset、PWDN幾個部分。須要按照設備要求順序操做,通常時鐘控制順序也包含在內。 設備初始化過程是將sensor設備的全部寄存器所有初始化一遍,採用IIC方式將初始化寄存器地址和值所有發送到sensor端。完成後此時攝像頭模組才能正常工做,並將圖像經過MIPI線路傳送到CPU端。
ov2685_sensor_config函數:
主要實現對sensor的各類配置接口,相應的有幀率配置,白平衡效果設置,曝光度設置,特效設置等等。相應接口將配置好的寄存器列表經過IIC發送到sensor中。
3. 攝像頭調試中的幾個問題點:
1.1 是否正確上電,是否有時鐘波形輸出。 檢測輸出電壓的電壓值是否和上電時序以及MCLK是否符合sensor的要求。這部分能夠用示波器和萬用表測量。測量電壓值和上電時序以及MCLK的時鐘頻率是否正確。
1.2 IIC讀寫是否正常。調試CPU與ISP間的I2C通訊。 檢測包括IIC地址是否正確,協議是否匹配。這部分也能夠用示波器測量IIC的SDA、CLK的峯值、波形邏輯是否正確。
1.3 正確上電並初始化之後sensor模塊是否正常工做。 這部分主要經過用示波器測量MIPI線路的數據和時鐘PIN是否正確,它的波形是否含有數據,是否標準波形,峯值有沒有達到要求等。
1.4 若是以上都正確了之後,MIPI控制器將接收到中斷,並開始處理圖像信號。此時若是出錯,能夠經過中斷信號的出錯值查看錯誤狀態。除CPU端是否正常初始化工做的問題外,須要關注模組端設置的圖像格式和CPU接收的默認圖像格式和圖像大小(SIZE)是否一致。模組中圖片格式和圖像大小經過寄存器值查看。CPU端接收圖片格式和圖像大小在HAL部分的s5k8aa中設置, 拍照源圖像大小和預覽源圖像大小須要分別設置。
以上部分完成後,攝像頭能夠正確預覽。