2017-03-29 24 views
0

我想做一些圖像處理工作,我想從我的相機(在預覽狀態)獲取實時圖像數據,而不是在拍照後。我看着post,但不知道如何使用它。Android - 實時從相機獲取圖像數據?

設置在此之後,

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() 
{ 
    public void surfaceCreated(SurfaceHolder holder) { 
     camera.setPreviewCallback(previewCallback); 
    } 
} 

private Camera.PreviewCallback previewCallback= new Camera.PreviewCallback() 
{ 
    @Override 
    public void onPreviewFrame(byte[] data,Camera cam) 
    { 
      Camera.Size previewSize = cam.getParameters().getPreviewSize(); 
      YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21,previewSize.width,previewSize.height, null); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      yuvImage.compressToJpeg(new Rect(0,0,previewSize.width,previewSize.height),80,baos); 
      byte[] jdata = baos.toByteArray(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(jdata,0,jdata.length);  
    } 
}; 

我即時怎樣才能讓我的圖像數據嗎?任何人都可以請給我一個簡短的示例代碼?

感謝

+0

這個是實時的。不是嗎? – greenapps

+0

http://stackoverflow.com/q/3376672/1066839 – John

+0

@greenapps 啊,我發現我需要做的就是把我的代碼放在裏面。 –

回答

2

換做你可以用OpenCV庫使用基於圖像處理操作。 在這裏,我給定樣品的代碼來直接從相機中使用的OpenCV

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.JavaCameraView; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.Mat; 

import static org.opencv.core.CvType.CV_8UC1; 

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { 

    private static final String TAG = "MainActivity"; 
    JavaCameraView javaCameraView; 
    Mat frame; 
    public static final int CAMERA_PERMISSION_REQUEST_CODE = 3; 

    static { 
     System.loadLibrary("MyOpenCVLibs"); 
    } 

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch(status){ 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        javaCameraView.enableView(); 
       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE); 
     } 

     javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view); 
     javaCameraView.setVisibility(View.VISIBLE); 
     javaCameraView.setCvCameraViewListener(this); 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     if(javaCameraView!=null) 
      javaCameraView.disableView(); 
    } 

    @Override 
    protected void onDestroy(){ 
     super.onDestroy(); 
     if(javaCameraView!=null) 
      javaCameraView.disableView(); 
    } 

    @Override 
    protected void onResume(){ 

     super.onResume(); 
     if (OpenCVLoader.initDebug()) { 
      Log.i(TAG, "OpenCV loaded successfully."); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } else { 
      Log.i(TAG, "OpenCV not loaded."); 
      OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback); 
     } 
    } 

    @Override 
    public void onCameraViewStarted(int width, int height) { 
     frame=new Mat(height,width,CV_8UC4); 

    } 

    @Override 
    public void onCameraViewStopped() { 
     frame.release(); 
    } 

    @Override 
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
     frame=inputFrame.rgba(); 

    } 
} 
  • 此代碼檢查的OpenCV正確導入與否和檢查許可相機處理的幀。
  • 並且每個輸入幀都保存在幀變量中。