安卓系统使用摄像头API
生活随笔
收集整理的這篇文章主要介紹了
安卓系统使用摄像头API
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?????? 原文鏈接:定制自己的安卓Camera
???????參考鏈接:http://blog.csdn.net/tankai19880619/article/details/9075839
??????????????????? :安卓Camera使用小結
前言:
?????? 圖像模糊是圖像檢測和特征點檢測的一個大敵,去模糊算法的復雜度使其不適用于實時性檢測的場合,因此對Camera的曝光時間進行控制是一個合適的方式,得到合適的無拖影的原始圖像。
??????可惜的是:在camera?API里面沒有找到控制底層快門時間的參數設置,不過還是把一些參數抄寫一遍吧
原文:
在Android的hardware包中有一個Camera類。這個類就是獲取Camera服務的,可以定制Camera等。
可以通過open()方法獲取其實例。
在使用這個類是需要在AndroidManifest.xml文件中加入相應的權限和特性。
如:
<uses-permission android:name = "android.permission.CAMERA" /> <uses-feature android:name = "android.hardware.camera" /> <uses-feature android:name = "android.hardware.camera.autofocus" />等。
本文實例:
package demo.camera; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import android.app.Activity; import android.content.ContentValues; import android.content.res.Configuration; import android.hardware.Camera; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.LinearLayout; /** * Android自帶的Camera應用程序可以完成很多功能。但是當其不能滿足我們需要的時候 * 我們可以定制自己的Camera。Android提供了Camera類來輔助我們實現自己的Camera。 * 這個例子就來定義一個自己的Camera * 首先,在Manifest中需要引入權限<uses-permission android:name="android:permission.CAMERA"/> * 我們需要用來存放取景器的容器,這個容器就是SurfaceView。 * 使用SurfaceView的同時,我們還需要使用到SurfaceHolder,SurfaceHolder相當于一個監聽器,可以監聽 * Surface上的變化,通過其內部類CallBack來實現。 * 為了可以獲取圖片,我們需要使用Camera的takePicture方法同時我們需要實現Camera.PictureCallBack類,實現onPictureTaken方法 * @author Administrator * */ public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{ public static final int MAX_WIDTH = 200; public static final int MAX_HEIGHT = 200; private SurfaceView surfaceView; private Camera camera; //這個是hardare的Camera對象 public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); this.setContentView(R.layout.camera); surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView); surfaceView.setFocusable(true); surfaceView.setFocusableInTouchMode(true); surfaceView.setClickable(true); surfaceView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, null, MyCamera.this); } }); //SurfaceView中的getHolder方法可以獲取到一個SurfaceHolder實例 SurfaceHolder holder = surfaceView.getHolder(); //為了實現照片預覽功能,需要將SurfaceHolder的類型設置為PUSH //這樣,畫圖緩存就由Camera類來管理,畫圖緩存是獨立于Surface的 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { } @Override public void surfaceCreated(SurfaceHolder holder) { // 當Surface被創建的時候,該方法被調用,可以在這里實例化Camera對象 //同時可以對Camera進行定制 camera = Camera.open(); //獲取Camera實例 /** * Camera對象中含有一個內部類Camera.Parameters.該類可以對Camera的特性進行定制 * 在Parameters中設置完成后,需要調用Camera.setParameters()方法,相應的設置才會生效 * 由于不同的設備,Camera的特性是不同的,所以在設置時,需要首先判斷設備對應的特性,再加以設置 * 比如在調用setEffects之前最好先調用getSupportedColorEffects。如果設備不支持顏色特性,那么該方法將 * 返回一個null */ try { Camera.Parameters param = camera.getParameters(); if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){ //如果是豎屏 param.set("orientation", "portrait"); //在2.2以上可以使用 //camera.setDisplayOrientation(90); }else{ param.set("orientation", "landscape"); //在2.2以上可以使用 //camera.setDisplayOrientation(0); } //首先獲取系統設備支持的所有顏色特效,有復合我們的,則設置;否則不設置 List<String> colorEffects = param.getSupportedColorEffects(); Iterator<String> colorItor = colorEffects.iterator(); while(colorItor.hasNext()){ String currColor = colorItor.next(); if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){ param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE); break; } } //設置完成需要再次調用setParameter方法才能生效 camera.setParameters(param); camera.setPreviewDisplay(holder); /** * 在顯示了預覽后,我們有時候希望限制預覽的Size * 我們并不是自己指定一個SIze而是指定一個Size,然后 * 獲取系統支持的SIZE,然后選擇一個比指定SIZE小且最接近所指定SIZE的一個 * Camera.Size對象就是該SIZE。 * */ int bestWidth = 0; int bestHeight = 0; List<Camera.Size> sizeList = param.getSupportedPreviewSizes(); //如果sizeList只有一個我們也沒有必要做什么了,因為就他一個別無選擇 if(sizeList.size() > 1){ Iterator<Camera.Size> itor = sizeList.iterator(); while(itor.hasNext()){ Camera.Size cur = itor.next(); if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){ bestWidth = cur.width; bestHeight = cur.height; } } if(bestWidth != 0 && bestHeight != 0){ param.setPreviewSize(bestWidth, bestHeight); //這里改變了SIze后,我們還要告訴SurfaceView,否則,Surface將不會改變大小,進入Camera的圖像將質量很差 surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight)); } } camera.setParameters(param); } catch (Exception e) { // 如果出現異常,則釋放Camera對象 camera.release(); } //啟動預覽功能 camera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 當Surface被銷毀的時候,該方法被調用 //在這里需要釋放Camera資源 camera.stopPreview(); camera.release(); } @Override public void onPictureTaken(byte[] data, Camera camera) { // data是一個原始的JPEG圖像數據, //在這里我們可以存儲圖片,很顯然可以采用MediaStore //注意保存圖片后,再次調用startPreview()回到預覽 Uri imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); try { OutputStream os = this.getContentResolver().openOutputStream(imageUri); os.write(data); os.flush(); os.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } camera.startPreview(); } }
????
總結
以上是生活随笔為你收集整理的安卓系统使用摄像头API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SLAM: 图像角点检测的Fast算法(
- 下一篇: 人工机器:作为归纳系统的深度学习