天天看點

高通camera結構(攝像頭基礎介紹)

   攝像頭基礎介紹                

一、攝像頭結構和工作原理.

   拍攝景物通過鏡頭,将生成的光學圖像投射到傳感器上,然後光學圖像被轉換成電信号,電信号再經過模數轉換變為數字信号,數字信号經過DSP加工處理,再被送到電腦中進行處理,最終轉換成手機螢幕上能夠看到的圖像。

數字信号處理晶片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通過一系列複雜的數學算法運算,對數字圖像信号參數進行優化處理,并把處理後的信号通過USB等接口傳到PC等裝置。DSP結構架構:

  1. ISP(image signal processor)(鏡像信号處理器)

  2. JPEG encoder(JPEG圖像解碼器)

  3. USB device controller(USB裝置控制器)

    常見的攝像頭傳感器類型主要有兩種,

一種是CCD傳感器(Chagre Couled Device),即電荷耦合器。

一種是CMOS傳感器(Complementary Metal-Oxide Semiconductor)即互補性金屬氧化物半導體。

CCD的優勢在于成像品質好,但是制造技術複雜,成本高昂,且耗電高。在相同分辨率下,CMOS價格比CCD便宜,但圖像品質相比CCD來說要低一些。CMOS影像傳感器相對CCD具有耗電低的優勢,加上随着工藝技術的進步,CMOS的畫質水準也不斷地在提高,是以目前市面上的手機攝像頭都采用CMOS傳感器。

手機攝像頭的簡單結構

濾光片有兩大功用:

  1.濾除紅外線。濾除對可見光有幹擾的紅外光,使成像效果更清晰。

       2.修整進來的光線。感光晶片由感光體(CELL)構成,最好的光線是直射進來,但為了怕幹擾到鄰近感光體,就需要對光線加以修整,是以那片濾光片不是玻璃,而是石英片,利用石英的實體偏光特性,把進來的光線,保留直射部份,反射掉斜射部份,避免去影響旁邊的感光點.

二、相關參數和名詞

1、常見圖像格式

    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: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即人眼對亮度的響應曲線。

三、高通的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。

三、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.cpp

vendor/qcom/proprietary/mm-camera/apps/appslib/mm_camera_interface.c

vendor/qcom/proprietary/mm-camera/apps/appslib/camframe.c

vendor/qcom/proprietary/mm-camera/apps/appslib/snapshot.c

vendor/qcom/proprietary/mm-camera/apps/appslib/jpeg_encoder.c

vendor/qcom/proprietary/mm-camera/apps/appslib/cam_frame_q.c

vendor/qcom/proprietary/mm-camera/apps/appslib/cam_display.c

vendor/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層部分的代碼大概的調用結構流程。

  1. 整個子產品主要巡行三個主線程: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中設定, 拍照源圖像大小和預覽源圖像大小需要分别設定。

以上部分完成後,攝像頭可以正确預覽。

繼續閱讀