導航:首頁 > 操作系統 > androidcamera參數設置

androidcamera參數設置

發布時間:2023-02-15 10:31:18

⑴ 手機相機怎麼設置參數

1.ISO感光度
感光度,又稱為ISO值,是衡量底片對於光的靈敏程度。

簡單來說,就是當ISO值越高,越能在光源不理想的情況下實現正常拍攝,但是ISO的提高也意味著畫質的下降。

日常拍夜景的話,建議大家設置在400-800之間,這樣拍出的夜景比較理想。

假如你想拍攝突出燈光效果比較強的夜景,也可將ISO參數調至100左右,使用腳架長時間曝光。這樣可保持影像品質清晰銳利。

2.S快門速度
手機相機上的「S」圖標就是快門,快門速度影響著進光量的多少,所以它可以控制畫面的明暗。

如果是要拍快速移動的物體,可以將快門調至1/1000秒、1/1600秒、1/2000秒。

如果快門速度長達30S的時候,我們就可以拍攝光繪,拍攝星空。不確定的情況下,可使用不同快門的畫面進行對比調整。

需要注意的是,一定要在曝光時間結束前保持手機靜止,這樣才能拍出好看的畫面,否則畫面會很模糊。

3.EV曝光補償

EV就是曝光補償,這個設置很簡單:光線太暗就調高曝光補償值,突顯畫面的清晰度;光線太亮,就降低曝光補償值,數值調到能拍出清晰的照片就行了。

如果你拿不準該調高還是調低,多拍幾張,對比一下就有答案了。

4.AF對焦方式

對焦方式,手機相機的專業模式有三種,分別是AF-S、AF-C、MF。

三種模式分別對應三種不同的拍攝對象,AF-S適合拍靜物,AF-C適合拍移動的物體,MF則是手動對焦。

重點說一下AF-C連續自動對焦,在這個模式下,相機會鎖定被攝主體所在區域,一旦目標與相機之間的相對焦點發生改變,相機會自動再次對焦。

所以AF-C特別適合運動中的物體。

5.AWB白平衡

為了讓我們拍出的照片不受外界光源影響,相機專業模式下將光源劃分為了不同的種類,如鎢絲燈、白熾燈、陰天等等。

拍照的時候根據所處的環境,選擇相應的模式即可。懶得分辨模式或搞不清楚光源的時候,自動模式AWB是最好的選擇。

以上就是手機拍照專業模式中的主要參數設置。其實拍照這件事主要在於實踐,在實踐中積累自己的經驗。

當你不明白應該如何設置參數時,多嘗試、多對比,然後記住這個參數,遇到同樣的場景就可以反復使用了。

android 實時視頻採集—Camera預覽採集與顯示(平台系統camera功能理解分享)

        本文之所以有必要編寫並作記錄,主要原因是因為在工作中開發出一個萬能的自定義camera預覽控制項之後,本是一個提高效率以及提供一個強大能力的控制項,但是產品並不能理解這個萬能控制項存在的意義,產品無法與技術設計相結合的理解使用;並且發現我們的智能業務部Camera自定義預覽技術雖然是使用多年,但是我們並沒有真正的形成規范,由於產品在不能夠理解系統平台(Android/iOS)給產品和研發帶來了什麼,導致產品可能會出現在不理解系統平台以及系統知識的情況下,臆想產品所謂的形態;當產品設計脫離了系統平台所支持的技術點以及設計的初衷,就會導致回歸問題的時候,出現不必要的討論,其根結就是一點:「信息不同步,知識不同步」。

        所以,為了提高效率,就採用記錄和分享的方式,嘗試性推動產品、測試、研發三者對工程與架構的同步理解,更深的懂得程序架構設計意義,嘗試性通過信息同步的方式,在一個統一的知識儲備的平台下,共同完成一個更高效,和高品質的工程產品。(為了能夠讓非技術:產品設計,以及測試都能夠理解,所以,使用了更多的白話解釋)

        附:強大靈活的FsCameraTextureView(第一版,自適應截取)( 第二版本版本:自適應展示)

        首先,拋出幾個問題,

      1)什麼是攝像頭支持的previewSize?

      2)什麼是視頻或者圖片的pictureSize?

      3)  如何獲取和查看攝像頭支持的PreViewSize 和PictureSize ?

      4)手機預覽所見的區域SurfaceView(TextureView)與camera 的previewSize的關系是什麼?

      5)為什麼會設計了兩種預覽方式view,兩種預覽方式都會有什麼樣子的效果呢?

一,概述

通過Android Camera拍攝預覽中設置setPreviewCallback實現onPreviewFrame介面,實時截取每一幀視頻流數據(簡單說來,就是通過設置一個介面,接收系統回調通知我們的每一幀數據)

二,知識點

    1, camera支持的格式:

    2,拍照流程

    3,camera許可權

  三,Android Camera中PreviewSize、 PictureSize、 SurfaceView(TextureView)之間的關系

        1,PreviewSize:

          相機預覽時候的能支持的尺寸,簡單的說一下,就是預覽的大小,也就是拍照前能夠看到的圖片大小。(通過Android手機相機可以試一下,這個參數設置不同,同樣的焦距下,拍攝桌子上一個固定距離的東西,看到的視野會不同)

          相機的預覽尺寸,不能隨意的設置值,只能通過camera的parameters的getSupportedPreviewSizes方法,獲取支持的預覽尺寸列表,並從列表中選擇一個設置在parameters中。(通俗簡單的說就是,獲取camera中能夠支持的預覽大小合集,如果你想要查看某個預覽對應的尺寸,就把該尺寸設置到camera的屬性中即可,則camera會返回相對應尺寸的預覽數據流提供顯示)。

        2,PictureSize :

指的是拍照之後,最終拍攝到的圖片大小,也就是圖片的質量。圖片尺寸同樣也只能從支持的列表中選取一個設置。 調用camera的takePicture方法(拍照)後,獲得拍照的圖像數據,注意picturesize和previewsize的寬高比也要保證一致,否則獲取的圖片會將preview時的圖像裁剪成picturesize的比例。 previewsize的解析度,只會影響預覽時的解析度,不會影響獲取圖片的解析度,所以preview只是確定了圖像的取景最大范圍。最終圖片的解析度是由picturesize來決定。 所以,最好的設置方法,例如:previewsize為1280*720,picturesize為2560*1440。(由於我們沒有拍照業務,目前這個知識,不做深究)

        3,SurfaceView(TextureView)

          用於展示camera預覽圖像的view,就是將preview獲得的數據,放在這個view上。所以如果preview的寬高比和SurfaceView的寬高比不一樣,就會導致看到的圖像拉伸變形。圖像拉伸變形解決的辦法:

          (1)就是在確定preview的解析度後,重新設置SurfaceView寬高;

          (2)如果SurfaceView寬高定死,則需要獲取一個比例適合SurfaceView尺寸的PreviewSize 的preview,盡量小的裁剪,然後填充在SurfaceView中。

        4,利用圖片的顯示方式,理解Preview與SurfaceView(TextureView)顯示關系

          ImageView (UI上面設計的一個控制項)與圖片bitmap 的關系,比如限定死一個ImageView的大小,但是圖片與ImageView尺寸不一致,就會有幾種方案,首先選取一張長方形1920*1080的圖片,ImageView就是紫色部分,無論長寬比都比ImageView要大。

圖片適配例1:拉伸填充ScaleType.FIT_XY :雖然被全部填充,但是整個圖片為了適配圖片已經扭曲,失真,圖片縮放到控制項大小,完全填充控制項大小展示。

圖片適配例2:等比例裁剪填充ScaleType.CENTER_CROP ,因為在該模式下,圖片會被等比縮放直到完全填充整個ImageView,並居中顯示。該模式也是最常用的模式了。如圖可以看到,圖片的高度是能完全展示出來的,但是左右部分被進行了裁剪,並沒有完全顯示。

圖片適配例3 :  ScaleType.CENTER_INSIDE,此模式,用以完全展示圖片內容為目的。圖片將被等比縮放到能夠完整展示在ImageView中並居中,如果圖片大小,小於控制項尺寸,那麼就直接居中展示該圖片

            圖片適配ImageView方式還有很多,就不一一列舉,這三種已經足夠重要,為什麼講解camera預覽,卻穿插了圖片的適配,其實可以這么理解,camera的preview就是由多張圖片組成,不斷的像幀動畫一樣變化,而SurfaceView就是一個載體,相當於ImageView,業務中定死了SurfaceView的大小之後,被動的承載你選擇的previewSize,來展示camera的Preview,你可以選擇類似於前面三種例子來理解preview的填充,以下會舉例說明preview的填充策略選擇有哪幾種方式,我們會採用哪種方式:

        1)拉伸填充,自適應view,不可取,比如:手機的SurfaceView是整個手機的屏幕尺寸(全屏填充),或者任意尺寸比例的surfaceView,使用這種方式,就如同(圖片適配例1)的方式,導致視頻扭曲,拉伸。

        2)等比例裁剪填充,目前我們項目中,採用的就是這種方式,並且提供給很多三方使用,已經成為一種獨立,並且穩定的技術實現自定義view,簡單說一下視頻的適配策略方式,SurfaceView隨便由業務方,自定義寬度大小,比如業務方選擇了1900*1000的SurfaceView, 我們的適配過程是:(1)從PreviewSize列表中選取最接近SurfaceView尺寸的PreviewSize(假設該攝像頭,只支持1920*1080,和320*640),1920*1080最接近,所以被獲取;(此處展示一下蹩腳的英文Try to find an size match aspect ratio and size,嘗試找到縱橫比與view大小比適中的一個尺寸)(2)等比例裁剪填充到SurfaceView,首先我們設計的邏輯是,先選取一個縮放比例,假設等比例1920的圖片按照SurfaceView的寬度等比例縮小到1900,而為了不讓Preview失真,則高度1080等比例縮小的值是1068.75(等比例方程式,這里就不重復初中的知識,請自行計算),所以圖片被壓縮成為1900*1068這個尺寸,依舊保證圖片完整,並且不失真。(3)將等比例縮減的圖片,1900*1068進行顯示在1900*1000的SurfaceView中,就會有一種效果類似(圖片適配例2),寬度全部展示,高度被裁剪。(如同  圖片適配例2中左右部分裁剪一樣的道理)                       

          3)完全展示camera內容的縮放填充(類似圖片適配例3),我們打開任意一部手機的camera,預覽圖像都沒有全屏幕展示,類似拍照功能,所見即所得,PreviewSize是多少,就顯示什麼樣子的比例尺寸,以及最後生產的照片比例就是多少,我們的自定義view,也可以隨意設置大小,此模式下,用以完全展示camera內容為目的。Preview將被等比縮放到能夠完整展示在SurfaceView中並居中,但是可能會有部分位置無法填充(類似圖片適配例3顯示效果)。

(該方式只是進行了技術儲備,由於沒有業務場景設計,所以沒有使用,目前只是儲備了這樣的自定義控制項)

四,靈活的自定義TextureView預覽控制項       

        FsCameraTextureView(第一版,自適應截取):等比例裁剪填充,方式(適配方式2),採用前面說的適配方式2,而產出的一種自定義view,2019年5月產出至今,在金融APP,以及商城的app中使用,經過逐步優化,和多版本檢驗,目前該控制項,擁有以下特點:  1)穩定:目前各個使用場景,均無邏輯崩潰,內存泄漏,線程等任意問題; 2)靈活:隨意設置預覽view的尺寸大小,自適應任意業務設計;不僅僅滿足刷臉業務,並且滿足任意相機預覽業務方使用; 3)提高效率,減輕工作量:使用簡單,操作步驟簡潔,接入只需要兩步;減輕接入端,或者想要使用相機預覽的業務的工作量,不需要重復造車,並且安全穩定。

      輸出的業務方有(經不完全統計):(目前業務為保密進行公網保密處理)1)**創新科技業務部-區塊鏈部門 2)泰國人臉識別業務SDK3)S D**Bank 人臉業務4)核驗身份證業務5)HT**Bank 人臉業務 6)**雲,商業平台部門

      FsAllPreviewCameraTextureView(技術儲備版,全預覽模式顯示):完全展示camera內容的縮放填充,採用前面說的(適配方式3)適合拍照相關的業務使用,優點同樣是,外部業務隨意改變view大小,可以自適應view,由於目前沒有業務方使用,暫時做儲備,不深入講解。

如果可以控制項開源成功,後期,我將開源這兩個控制項,讓更多的使用方使用,我們也希望共同技術進步,提高工程產出的使用能力。

預計下一次分享內容是(臨時命名)

1)人臉核驗內存和線程爆表到泄漏為零

2)分享七年前參於的Scrum(如何提高崗位間效率所定製的敏捷開發過程)

本文參考:

https://www.jianshu.com/p/32e335d5b842

https://www.cnblogs.com/skyseraph/archive/2012/03/26/2418665.html

⑶ 手機相機如何調整參數

您使用專業模式進行拍攝時,可以自由調節 ISO 感光度、對焦方式等參數。
1.打開相機或進入相機 > 更多 (取決於您的機型),選擇專業模式。
2.您可以設置以下參數:
(1)調整測光方式:點擊 M,選擇測光方式。
(2)調節 ISO 感光度:點擊 ISO,滑動 ISO 調節區。
當光線較弱時,可提高 ISO 感光度;當光線充足時,可降低 ISO 感光度,避免畫面出現過多噪點。
(3)調節快門速度:點擊 S,滑動快門速度調節區。
快門速度會影響相機的進光量,當拍攝靜止風景、人像時,可調低快門速度;當拍攝運動風景、人像時,可調高快門速度。
(4)調節曝光補償值:點擊 EV·,滑動 EV 調節區。
當光線較弱時,可以調高 EV 值;當光線較強時,調低 EV 值。
(5)調節對焦:點擊 AF·,選擇對焦模式。
(6)調節色彩基調:點擊 WB·,選擇白平衡。
如在日光下,可選擇太陽圖標;在陰天或陰暗環境下,選擇下雨圖標。
點擊色溫圖標,可改變色溫,讓畫面呈現較冷或較暖的色調。
(7)調節存儲格式:專業模式為您提供了 JPG 和 RAW 兩種圖像格式。點擊取景框頂端的JPG圖標,選擇不同的存儲格式。
RAW 格式的照片保留了更多照片細節,方便對照片進行後期處理,但佔用較多存儲空間;JPG 格式的照片佔用存儲空間相對較小,您可根據需要選擇。
若選擇 RAW 格式,拍照時,手機將自動保存一張普通格式和一張 RAW 格式的照片,RAW 格式的照片保存在圖庫的 RAW 相冊中。
(8)開啟自動對焦輔助燈:若要在弱光環境下對焦,點擊對焦輔助燈圖標,開啟自動對焦輔助燈。
3.點擊快門拍照。

⑷ 如何自定義開啟android攝像頭

開啟攝像頭的過程如下:
Android提供了Camera來控制拍照,步驟如下:
(1)調用Camera的open()方法打開相機。
(2)調用Camera的getParameters()獲取拍照參數,該方法返回一個Cmera.Parameters對象。
(3)調用Camera.Parameters對象對照相的參數進行設置。
(4)調用Camera的setParameters(),並將Camera.Parameters對象作為參數傳入,這樣就可以對拍照進行參數控制,Android2.3.3以後不用設置。
(5)調用Camerade的startPreview()的方法開始預覽取景,在之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)設置使用哪個SurfaceView來顯示取得的圖片。
(6)調用Camera的takePicture()方法進行拍照。
(7)程序結束時,要調用Camera的stopPreview()方法停止預覽,並且通過Camera.release()來釋放資源。
需要賦予Camera的許可權:
1
2
3
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.CAMERA"/>

下面上代碼:

⑸ Android進階——你所知道的Camera2和你所不知道的Camera2完全解析

一切源於在項目過程中的一個Bug:我的需求是在MainActivity 實現自動預覽,也可以點擊跳到簽到SignedActivity去實現拍照簽到,第一次進入界面的時候都是正常的,但是有時候返回來的時候預覽失敗,即從MainActivity跳轉到SignedActivity偶爾預覽失敗和從SignedActivity返回MainActivity偶爾失敗,都是報(CAMERA_IN_USE)ERRO=1的錯誤,奇怪的是的的確確做了完全釋放操作,加上以前用的更多的是Camera api 對於Camer2 的機制沒有完整去研究過,一下子懵了,於是乎先去找了Stack Overflow,查到一個解決方案是:"我棄用了新API,換回舊API",ORZ,找了其他的也沒有答案,可是我不服呀,我就把官方的文檔全部啃了一遍,於是乎便有了以下的理解,我想如果你不懂得怎麼使用Camera2的話,這篇絕對值得你去閱讀,你會發現Camera2 並非像大多數說得那樣使用起來很復雜。

全新的android.hardware.Camera2 。Android 5.0對拍照API進行了全新的設計,新增了全新設計的Camera 2 API,這些API不僅大幅提高了Android系統拍照的功能,還能支持RAW照片輸出,甚至允許程序調整相機的對焦模式、曝光模式、快門等。

在Camera2 架構在核心參與類角色有: CameraManager CameraDevice CameraCharacteristics CameraRequest與CameraRequest.Builder CameraCaptureSession 以及 CaptureResult

位於android.hardware.camera2.CameraManager下,也是Android 21(5.0)添加的,和其他系統服務一樣通過 Context.getSystemService(CameraManager.class ) 或者 Context.getSystemService(Context.CAMERA_SERVICE) 來完成初始化,主要用於管理系統攝像頭:

CameraDevice是Camera2中抽象出來的一個對象,直接與系統硬體攝像頭相聯系。因為不可能所有的攝像頭都會支持高級功能(即攝像頭功能可被分為limit 和full 兩個級別),當攝像頭處於limited 級別時候,此時Camera2和早期的Camera功能差不多,除此之外在Camera2架構中,CameraDevice還承擔其他兩項重要任務:

正如前面所說, 系統向攝像頭發送 Capture 請求,而攝像頭會返回 CameraMetadata,這一切都是在由對應的CameraDevice創建的CameraCaptureSession 會話完成 ,當程序需要預覽、拍照、再次預覽時,都需要先通過會話。(A configured capture session for a CameraDevice , used for capturing images from the camera or reprocessing images captured from the camera in the same session previously.A CameraCaptureSession is created by providing a set of target output surfaces to createCaptureSession , or by providing an InputConfiguration and a set of target output surfaces to for a reprocessable capture session . Once created, the session is active until a new session is created by the camera device, or the camera device is closed.)CameraCaptureSession一旦被創建,直到對應的CameraDevice關閉才會死掉。雖然CameraCaptureSession會話用於從攝像頭中捕獲圖像,但是只有同一個會話才能再次從同一攝像頭中捕獲圖像。另外, 創建會話是一項耗時的非同步操作,可能需要幾百毫秒 ,因為它需要配置相機設備的內部管道並分配內存緩沖區以將圖像發送到所需的目標,因而createCaptureSession和會將隨時可用的CameraCaptureSession發送到提供的監聽器的onConfigured回調中。如果 無法完成配置,則觸發onConfigureFailed回調 ,並且會話將不會變為活動狀態。最後需要注意的是,如果 攝像頭設備創建了一個新的會話,那麼上一個會話是被關閉的,並且會回調與其關聯的onClosed ,如果不處理好,當會話關閉之後再次調用會話的對應方法那麼所有方法將會跑出IllegalStateException異常。關閉的會話清除任何重復的請求(和調用了stopRepeating()方法類似),但是在新創建的會話接管並重新配置攝像機設備之前,關閉的會話仍然會正常完成所有正在進行的捕獲請求。簡而言之,在Camera2中CameraCaptureSession承擔很重要的角色:

描述Cameradevice屬性的對象,可以使用CameraManager通過getCameraCharacteristics(String cameraId)進行查詢。

CameraRequest代表了一次捕獲請求, 而CameraRequest.Builder用於描述捕獲圖片的各種參數設置,包含捕獲硬體(感測器,鏡頭,快閃記憶體),對焦模式、曝光模式,處理流水線,控制演算法和輸出緩沖區的配置。 ,然後傳遞到對應的會話中進行設置, CameraRequest.Builder則負責生成CameraRequest對象 。當程序調用setRepeatingRequest()方法進行預覽時,或調用capture()方法進行拍照時,都需要傳入CameraRequest參數。CameraRequest可以通過CameraRequest.Builder來進行初始化,通過調用createCaptureRequest來獲得。

CaptureRequest描述是從圖像感測器捕獲單個圖像的結果的子集的對象。(CaptureResults are proced by a CameraDevice after processing a CaptureRequest)當CaptureRequest被處理之後由CameraDevice生成。

CameraManager 處於頂層管理位置負責 檢測獲取所有攝像頭及其特性 傳入指定的CameraDevice.StateCallback回調打開指定攝像頭 CameraDevice 是負責管理抽象對象,包括 監聽Camera 的狀態回調CameraDevice.StateCallback 創建CameraCaptureSession和CameraRequest CameraCaptureSession 用於描述一次圖像捕獲操作,主要負責 監聽自己會話的狀態回調CameraCaptureSession.StateCallback CameraCaptureSession.CaptureCallback捕獲回調 ,還有 發送處理CameraRequest CameraRequest 則可以看成是一個"JavaBean"的作用用於描述希望什麼樣的配置來處理這次請求;最後三個回調用於監聽對應的狀態。

CameraManager 處於頂層管理位置負責檢測 檢測獲取所有攝像頭並設置輸出參數,傳入指定的CameraDevice.StateCallback回調,然後打開指定攝像頭,並觸發CameraDevice.StateCallback中的onOpened方法,並在onOpened方法里開始通過調用創建預覽會話, ,CameraDevice負責創建請求 CameraCharacteristics CameraRequest與CameraRequest.Builder CameraCaptureSession 以及 CaptureResult 則可以看成是一個JavaBean的作用用於描述以什麼樣的配置來處理這次請求。

Camera2Helper類只是簡單的封裝了下,為了讓Camera2的初始化和Activity 高度分離,這個類只是Demo 階段部分有待優化,另外結合我具體的業務,對於圖片大小有限制,所以我都是默認採用采樣壓縮率方式對圖片進行壓縮

⑹ 關於6739 Android_O一些Camera問題簡單匯總

(1)、前後攝像頭出現連接不上CCT,或者調試過程中斷開
有以下兩種改法可供參考:
1)
文件路徑:alps\vendor\mediatek\proprietary\custom\mt6739\cgen\cfgfileinc\CFG_Camera_File_Max_Size.h
相應的宏修改為: #define MAXIMUM_NVRAM_CAMERA_FEATURE_FILE_SIZE (5344)
2)、

(2)、預覽或者錄像被設置為固定幀率30幀
修改config文件 如

其中5000是最低幀率5幀的意思。

(3)、錄像模式如果打開eis模式界面會變暗
修改下面兩個文件:
文件路徑:
alps\vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6739\v1\adapter\MtkDefault\MtkDefaultCamParameter.cpp

修改方法:

//if(mpParamsMgr->getRecordingHint() && mpParamsMgr->getVideoStabilization())
改為
if(mpParamsMgr->getRecordingHint() && mpParamsMgr->getVideoStabilization() && (!isEisWithDfr))

文件路徑:
alps\vendor\mediatek\proprietary\custom\mt6739\hal\camera\camera_custom_eis.cpp

修改方法:

bool GetEisLinkWithDfr()
{
return true; // true : dynamic frame rate off when eis on; false : dynamic frame rate on when eis on
}

改為

bool GetEisLinkWithDfr()
{
return false; // true : dynamic frame rate off when eis on; false : dynamic frame rate on when eis on
}

(4)、概率性拍照的時候預覽變暗

alps\vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6739\core\featureio\pipe\aaa\state_mgr\aaa_state_precapture.cpp

IAeMgr::getInstance().setExp(m_SensorDevId, 3000);

目前實踐證明:第一種改法有效,第二種改法無效。

(5)、開啟閃光燈拍照拍出來的照片是黑色的
修改的文件在turning文件夾裡面

(6)、調整ISP參數後須要恢復出廠設置之後才可以連接上工具
修改路徑:
vendor/mediatek/proprietary/hardware/mtkcam/legacy/platform/mt6739/core/featureio/drv/nvram/nvram_drv.cpp

修改方法:
if( a_eNvramDataType==CAMERA_DATA_PDC_TABLE)
{
err = readDefaultData(a_eSensorType, u4SensorID, a_eNvramDataType, a_pNvramData);
if (err != NVRAM_NO_ERROR)
logE("read default PDC Table error!");
return err;
}

下面加一段:
if( a_eNvramDataType==CAMERA_NVRAM_DATA_FEATURE)
{
err = readDefaultData(a_eSensorType, u4SensorID, a_eNvramDataType, a_pNvramData);
if (err != NVRAM_NO_ERROR)
logE("read default Feature Table error!");
return err;
}

⑺ Android Camera(二)

CameraManager、CameraDevice、CameraCharacteristics、CameraRequest與CameraRequest.Builder、CameraCaptureSession以及CaptureResult。

1. 開發相機必須的的許可權就是 Manifest.permission.CAMERA 了,所以第一步要在Manifest中添加Camera permission:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" /></pre>

如果是6.0以上的手機還要動態申請許可權,關於許可權這塊大家可以使用PermissionUtil全局管理。

2.獲取CameraManager實例 開啟相機

3.當相機成功打開後會回調onOpened方法,這里可以拿到CameraDevice對象,也就是具體的攝像頭設備

4.設置相機一些參數 包括方向

5.開啟預覽

6.開啟預覽後獲取實時流數據,onImageAvailable回調中的ImageRender獲取實時流數據,這個數據是YUV_420_888的數據 ,我們可以存儲數據也可以對數據流進行美顏濾鏡操作,也可以推送給服務端。

7.當關閉界面或者停止預覽時 :

⑻ android camera美顏主要設置哪些參數

final void setErrorCallback(Camera.ErrorCallback cb):Camera發送錯誤的時候回調,可以在其中進行錯誤的後續處理。

final void setPreviedCallback(Camera.PreviewCallback cb):Camera預覽界面發生變化的時候回調,可以在其中獲取到Camera捕獲到的幀圖像。

FEATURE_CAMERA:設備是否有攝像頭。

FEATURE_CAMERA_ANY:設備至少有一個攝像頭。

FEATURE_CAMERA_AUTOFOCUS:設備支持的攝像頭是否支持自動對焦

FEATURE_CAMERA_FLASH:設備是否配備閃光燈。

FEATURE_CAMERA_FRONT:設備是否有一個前置攝像頭。

⑼ Android Camera2 教程 · 第一章 · 概覽

從 Android 5.0 開始,Google 引入了一套全新的相機框架 Camera2(android.hardware.camera2)並且廢棄了舊的相機框架 Camera1(android.hardware.Camera)。作為一個專門從事相機應用開發的開發者來說,這一刻我等了太久了,Camera1 那寥寥無幾的 API 和極差的靈活性早已不能滿足日益復雜的相機功能開發。Camera2 的出現給相機應用程序帶來了巨大的變革,因為它的目的是為了給應用層提供更多的相機控制許可權,從而構建出更高質量的相機應用程序。本文是 Camera2 教程的開篇作,本章將介紹以下幾個內容:

Camera2 的 API 模型被設計成一個 Pipeline(管道),它按順序處理每一幀的請求並返回請求結果給客戶端。下面這張來自官方的圖展示了 Pipeline 的工作流程,我們會通過一個簡單的例子詳細解釋這張圖。

為了解釋上面的示意圖,假設我們想要同時拍攝兩張不同尺寸的圖片,並且在拍攝的過程中閃光燈必須亮起來。整個拍攝流程如下:

一個新的 CaptureRequest 會被放入一個被稱作 Pending Request Queue 的隊列中等待被執行,當 In-Flight Capture Queue 隊列空閑的時候就會從 Pending Request Queue 獲取若干個待處理的 CaptureRequest,並且根據每一個 CaptureRequest 的配置進行 Capture 操作。最後我們從不同尺寸的 Surface 中獲取圖片數據並且還會得到一個包含了很多與本次拍照相關的信息的 CaptureResult,流程結束。

相機功能的強大與否和硬體息息相關,不同廠商對 Camera2 的支持程度也不同,所以 Camera2 定義了一個叫做 Supported Hardware Level 的重要概念,其作用是將不同設備上的 Camera2 根據功能的支持情況劃分成多個不同級別以便開發者能夠大概了解當前設備上 Camera2 的支持情況。截止到 Android P 為止,從低到高一共有 LEGACY、LIMITED、FULL 和 LEVEL_3 四個級別:

相機的所有操作和參數配置最終都是服務於圖像捕獲,例如對焦是為了讓某一個區域的圖像更加清晰,調節曝光補償是為了調節圖像的亮度。因此,在 Camera2 裡面所有的相機操作和參數配置都被抽象成 Capture(捕獲),所以不要簡單的把 Capture 直接理解成是拍照,因為 Capture 操作可能僅僅是為了讓預覽畫面更清晰而進行對焦而已。如果你熟悉 Camera1,那你可能會問 setFlashMode() 在哪? setFocusMode() 在哪? takePicture() 在哪?告訴你,它們都是通過 Capture 來實現的。

Capture 從執行方式上又被細分為【單次模式】、【多次模式】和【重復模式】三種,我們來一一解釋下:

CameraManager 是一個負責查詢和建立相機連接的系統服務,它的功能不多,這里列出幾個 CameraManager 的關鍵功能:

CameraCharacteristics 是一個只讀的相機信息提供者,其內部攜帶大量的相機信息,包括代表相機朝向的 LENS_FACING ;判斷閃光燈是否可用的 FLASH_INFO_AVAILABLE ;獲取所有可用 AE 模式的 CONTROL_AE_AVAILABLE_MODES 等等。如果你對 Camera1 比較熟悉,那麼 CameraCharacteristics 有點像 Camera1 的 Camera.CameraInfo 或者 Camera.Parameters 。

CameraDevice 代表當前連接的相機設備,它的職責有以下四個:

熟悉 Camera1 的人可能會說 CameraDevice 就是 Camera1 的 Camera 類,實則不是,Camera 類幾乎負責了所有相機的操作,而 CameraDevice 的功能則十分的單一,就是只負責建立相機連接的事務,而更加細化的相機操作則交給了稍後會介紹的 CameraCaptureSession。

Surface 是一塊用於填充圖像數據的內存空間,例如你可以使用 SurfaceView 的 Surface 接收每一幀預覽數據用於顯示預覽畫面,也可以使用 ImageReader 的 Surface 接收 JPEG 或 YUV 數據。每一個 Surface 都可以有自己的尺寸和數據格式,你可以從 CameraCharacteristics 獲取某一個數據格式支持的尺寸列表。

CameraCaptureSession 實際上就是配置了目標 Surface 的 Pipeline 實例,我們在使用相機功能之前必須先創建 CameraCaptureSession 實例。一個 CameraDevice 一次只能開啟一個 CameraCaptureSession,絕大部分的相機操作都是通過向 CameraCaptureSession 提交一個 Capture 請求實現的,例如拍照、連拍、設置閃光燈模式、觸摸對焦、顯示預覽畫面等等。

CaptureRequest 是向 CameraCaptureSession 提交 Capture 請求時的信息載體,其內部包括了本次 Capture 的參數配置和接收圖像數據的 Surface。CaptureRequest 可以配置的信息非常多,包括圖像格式、圖像解析度、感測器控制、閃光燈控制、3A 控制等等,可以說絕大部分的相機參數都是通過 CaptureRequest 配置的。值得注意的是每一個 CaptureRequest 表示一幀畫面的操作,這意味著你可以精確控制每一幀的 Capture 操作。

CaptureResult 是每一次 Capture 操作的結果,裡麵包括了很多狀態信息,包括閃光燈狀態、對焦狀態、時間戳等等。例如你可以在拍照完成的時候,通過 CaptureResult 獲取本次拍照時的對焦狀態和時間戳。需要注意的是,CaptureResult 並不包含任何圖像數據,前面我們在介紹 Surface 的時候說了,圖像數據都是從 Surface 獲取的。

如果要我給出強有力的理由解釋為什麼要使用 Camera2,那麼通過 Camera2 提供的高級特性可以構建出更加高質量的相機應用程序應該是最佳理由了。

如果你熟悉 Camera1,並且打算從 Camera1 遷移到 Camera2 的話,希望以下幾個建議可以對你起到幫助:

本章到此結束,主要是介紹了 Camera2 的一些基礎概念,讓大家能夠基本了解 Camera2 的工作流程和基礎概念,並且知道使用 Camera2 能夠做些什麼。如果你對 Camera2 還是感到很陌生,不要緊,後續的教程會帶領大家逐步深入了解 Camera2。

⑽ Android 系統原生相機API角度原理與適配

雖然Camera作為第一代原生android所提供的相機類一直被開發者甚至Google官方開發人員所詬病,但為了兼容和適配Android版本5.0以下的App應用,我們別無選擇。因此,有了本篇文檔詳細闡述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView與Camera類。

文檔下文會在拍照流程中的不同的階段應用到上述四個角度,而「終端自然方向」貫穿整個流程當中。這一個方向、四個角度非常重要,缺一不可,是支撐相機Camera 系列API的關鍵。在設計NXDesign的相機項目中,經過對官方文檔的研讀和各路資料的調研之後發現,我們在網路上查到的博客類相關資料有80%的實現方式是存在問題的,當然,這也可以歸咎於該API其本身確實不好用,如果不對源碼注釋進行仔細研究,很容易對開發者產生誤導。

更加准確的說,相機的生命周期是依託於SurfaceView的創建和銷毀來完成的。SurfaceView的作用是提供相機內容的實時預覽。我們需要在surfaceview創建好之後打開相機使用相機資源,在surfaceview被銷毀後釋放相機資源。

surfaceview 提供了holder機制向調用方通知surfaceview的變化時機,為了在不同的時機對相機資源做不同的事情,需要調用SurfaceHolder.addCallback()方法。

現在的Android手機一般會有多個攝像頭,但根據其方向可以歸為兩類: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打開攝像頭之前,首先需要獲取相機資源,判斷相機個數 Camera.getNumberOfCameras() 。每個相機對應一個CameraInfo,它的定義如下:

這里涉及到一個重要概念:相機圖像感測器(camera sensor),想要理解上述注釋的含義,就需要先理解下圖內容。

左圖是通常情況下,我們對view的x y方向的認知,以屏幕的左上角為原點向右為x正方向,向下為y正方向;但是,右圖描述的是絕大多數情況下, 相機圖像感測器 的起始位置和方向判定。與view不同的是,感測器以手機屏幕在自然方向上的右上角為原點,向下為x正方向,向左為y正方向。因此,我們理解上述注釋就不難了。如果相機自帶的感測器頂部與終端自然方向(手機屏幕的硬體方向,一般手機都是豎直方向,也就是文檔中說的naturally tall screen)的右邊緣一致,則這個值就是90度。如果前置攝像頭感測器的頂部與手機自然方向一致,則這個值就是270度。

當我們定義startCamera()方法時,要做5件事情,1.遍歷攝像頭cameraId,找到想要打開的攝像頭(前置還是後置);2.獲取攝像頭信息,主要獲取orientation;3. 設置相機DisplayOrientation 4.設置相機參數,主要是寬高比、對焦模式、圖片格式、setRotation等。5. 向camera設置surfaceview.viewholder,並且startPreview。主要邏輯如下:

拿到cameraInfo.orientation之後,要調用camera.setDisplayOrientation設置進去,保證通過surfaceview預覽到的取景跟當前的手機方向保持一致,但是,setDisplayOrientation設置的其實是經過兩個角度計算之後的復合角度,而並不單純是cameraInfo.orientation。正確的做法是這樣的:先獲取手機屏幕的旋轉方向,然後與cameraInfo.orientation加和得到最終角度。通常情況下,如果我們設置相機為portrait,則不用考慮rotation。這也是為什麼絕大部分網路資料中都會粗暴的寫入一個90度完事兒而並沒有解釋這么做的道理。

調用camera.takePicture(null, null, pictureCallback)

這里需要做的僅僅是將callback中返回的data存儲為File。需要注意的是,data中會包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具類生成bitmap,再進行存儲或者展示,生成出來的圖像其實是缺失了旋轉角度的原始方向,這十有八九會發生圖像展示角度錯誤的情況。因此,需要直接保存,再通過Exif工具類讀取File中的角度信息(當然Exif工具類就是為了讀取File中的各種信息而生的,比如拍照時間、經緯度等等)。

基於Camera API,
surfaceview的預覽需要setDisplayOrientation(),入參角度與CameraInfo.orientation(感測器偏角)和WindowManager.default.displayOrientation(屏幕旋轉角度)兩個角度有關。
相機拍照前需要setRotation(),入參角度與CameraInfo.orientation(感測器偏角)和OrientationEventListener返回的orientation(終端自然角度偏角)有關,二者的換算結果就是圖像寫入偏角,該偏角意味著圖像被順時針旋轉該角度就能夠回正展示。

閱讀全文

與androidcamera參數設置相關的資料

熱點內容
32單片機的重映射哪裡改 瀏覽:814
為什麼前端不用刷演算法題 瀏覽:706
對稱加密系統和公鑰加密系統 瀏覽:428
歷史地理pdf 瀏覽:604
物聯網雲伺服器框架 瀏覽:646
sybaseisql命令 瀏覽:181
android權威編程指南pdf 瀏覽:661
哪些軟體屬於加密軟體 瀏覽:644
文件夾75絲什麼意思 瀏覽:468
最便宜sop8單片機 瀏覽:964
圖解周易預測學pdf 瀏覽:418
c盤莫名奇妙多了幾個文件夾 瀏覽:169
貴州花溪門票優惠app哪個好 瀏覽:801
如何說話不會讓人有被命令的感覺 瀏覽:438
哪裡可下載湘工惠app 瀏覽:263
福特python 瀏覽:310
pdf轉換成word表格 瀏覽:351
無線遠端伺服器無響應是什麼意思 瀏覽:670
兩位整數倒序輸出python 瀏覽:781
為什麼我的世界天空伺服器進不去 瀏覽:262