上一篇文档里配置好了Opencv在android工程里环境,现在就试下一个最基础的功能调用Opencv的方法来实现打开摄像头
首先
在app的AndroidManifest.xml文件里的<application标签前添加如下代码
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
获取打开摄像头的权限
然后
在activity_java.xml里添加如下代码
<org.opencv.android.JavaCameraView
android:id="@+id/javaCameraView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:camera_id="back"
app:show_fps="true" />
添加了一个JavaCameraView控件
最后
MainActivity.java代码如下
package com.example.aaa.opencvdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.TextView;
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;
public class JavaActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
private JavaCameraView javaCameraView;
//static {
// System.loadLibrary("opencv_java3");
//}
private BaseLoaderCallback baseLoaderCallback = 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);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_java);
javaCameraView = (JavaCameraView) findViewById(R.id.javaCameraView);
javaCameraView.setVisibility(SurfaceView.VISIBLE);
javaCameraView.setCvCameraViewListener(this);
}
@Override
public void onPause(){
super.onPause();
if (javaCameraView != null)
javaCameraView.disableView();
}
@Override
public void onResume(){
super.onResume();
if (!OpenCVLoader.initDebug()){
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,baseLoaderCallback);
}else{
baseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
@Override
public void onCameraViewStarted(int width,int height){
}
@Override
public void onCameraViewStopped(){
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame){
return inputFrame.rgba();
}
}
注意其中的onResume()函数
public void onResume(){
super.onResume();
if (!OpenCVLoader.initDebug()){
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,baseLoaderCallback);
}else{
baseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
这样写是表示默认调用opencv manager的需要先安装opencv manager.apk
本程序才能正常运行
之前参考别人的教程时就踩到坑了。。。他们是使用jni方法和ndk编译出.so文件集成在同一个apk中,不需要安装opencv mannager.apk所以onResume()函数的实现不同,导致程序不能正常运行,一开就闪退233333
最后最后android模拟器中的运行效果如图
有空我再把注释和每个函数的意思添加上