关于OpenCV在Android Studio 上的环境搭建,请看实例笔记1
最近更新 160806
一、第一种方式打开前置后置摄像头
通过OpenCV Library的方式,不需要编写C、C++代码,只需要引入OpenCV 的Library,一般的路径是OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\java
(这里以OPENCV V3.1版本为准,采用的是第一种方法,需要安装OPENCVMANAGER)
需要在自己创建的工程时引入该Library,同时需要引入libopencv_java3.so,这是Library依赖的库。
工程中通过静态域的方式引入即可。
static {
OpenCVLoader.initDebug();
}
代码
package com.wang.opencv;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.OpenCVLoader;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
public class OpenCameraActivity extends Activity implements CvCameraViewListener2 {
private static final String TAG = "OpenCameraActivity";
static {
OpenCVLoader.initDebug();
}
private Mat mRgba;
private Mat mFlipRgba;
private CameraBridgeViewBase mOpenCvCameraView;
public OpenCameraActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.camera_surface_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);
mOpenCvCameraView.enableView();//
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//前置摄像头 CAMERA_ID_BACK为后置摄像头
}
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume() {
super.onResume();
}
public void onDestroy() {
super.onDestroy();
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat();
mFlipRgba = new Mat();
}
public void onCameraViewStopped() {
mRgba.release();
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();//注意
Core.flip(mRgba, mFlipRgba, 1);
return mFlipRgba;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return true;
}
}
xml配置简单:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<org.opencv.android.JavaCameraView
android:id="@+id/fd_activity_surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
AndroidManifest记得添加摄像头权限。
<uses-permission android:name="android.permission.CAMERA"/>
需要注意的是前置摄像头获取的图像是倒置的,需要通过flip方法翻转一次。
Core.flip(mRgba, mFlipRgba, 1);