创建一个能够使用OpenCV JavaCameraView的应用程序来了解基于OpenCV java API 的应用程序的开发流程。有了Android的基础,在程序中需要修改的几个地方1.activity_main.xml 2.AndroidManifest.xml 3.MainActivity.java

一、创建项目

安装创建android程序的方式创建一个blank activity,项目名称为hellosamples,其他采用默认的activity_main.xml,MainActivity.java。创建完成后,安装之前介绍的方式把OpenCV Library 包含进项目里(重要步骤)。

二、设置布局文件

打开activity_main.xml

复制如下代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:opencv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <org.opencv.android.JavaCameraView android:id="@+id/HelloOpenCvView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone" opencv:camera_id="any" opencv:show_fps="true" /> </LinearLayout>

布局文件只包含一个全屏部件类org.opencv.android.JavaCameraView,这个类是在OpenCV library中实现的,采用的是Android CameraAPI实现的。opencv:show_fps="true"和opencv:camera_id="any"代表的是可以显示每秒的帧数,以及可以利用任一一个摄像头。当然最先使用的是后置的。

三、设置AndroidManifest.xml文件

打开AndroidManifest.xml复制如下代码

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hellosamples" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" /> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

这个主要是设置许可以及主题

四、编写MainActivity.java

package com.example.hellosamples; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Mat; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.SurfaceView; import android.view.WindowManager; public class MainActivity extends Activity implements CvCameraViewListener2{ private static final String TAG = "OCVSample::Activity"; private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); mOpenCvCameraView.enableView(); } break; default: { super.onManagerConnected(status); } break; } } }; @Override public void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback); } private CameraBridgeViewBase mOpenCvCameraView; @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.activity_main); mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.HelloOpenCvView); mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); mOpenCvCameraView.setCvCameraViewListener(this); } @Override public void onPause() { super.onPause(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } public void onDestroy() { super.onDestroy(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } public void onCameraViewStarted(int width, int height) { } public void onCameraViewStopped() { } public Mat onCameraFrame(CvCameraViewFrame inputFrame) { return inputFrame.rgba(); } }

首先是OpenCV的初始化过程,OnManagerConnected callback会在UI线程中调用,在使用OpenCV调用或者载入OpenCV支撑的本地库前一定要先包含这一调用。在OpenCV成功初始化后载入本地库,默认的BaseLoaderCallback会把应用程序上下文当成是Activity,所以在初始化失败时会调用Activity.finish()。要重写这一行为,就必须重写finish()这一方法。

这里采用的非同步的方式进行初始化(即在目标机器上要安装好OpenCV manager),然后这个Activity生命周期过程的一些处理。主要的修改地方是实现CvCameraViewListener2中的重要函数onCameraFrame,这个函数可以让你在摄像头捕获图像帧之后对图像进行处理,然后显示在屏幕上,其中CvCameraViewFrame类代表的是从摄像头捕获的图像帧。可以利用这个类的两个方式rgba(),gray()来RGBA和单通道图像.




更多相关文章

  1. Android(安卓)Suspend
  2. Android(安卓)P PackageManagerService 初始化流程
  3. Android(安卓)Ormlite 学习笔记1 -- 基础
  4. Android使用SimpleAdapter更新ListView里面的Drawable元素
  5. android 接入USB输入设备后应用重跑onCreate
  6. (4.1.18.4)Android(安卓)Service 服务(三)—— bindService与remot
  7. Android实现手机摄像头的自动对焦
  8. cocos2dx2.1.4FATAL EXCEPTION: GLThread 10, Class doesn't imp
  9. 深入浅出Android(安卓)Service (3)

随机推荐

  1. C# 中虚方法和抽象方法
  2. C语言变量的定义包括变量存储类型和变量
  3. for循环是先执行循环体语句,后判断表达式
  4. c语言文件读写操作有哪些?
  5. c语言源程序的扩展名是什么?
  6. c语言中switch的用法是什么?
  7. C语言中void是什么意思?
  8. C语言中for语句的执行过程是什么?
  9. c语言中“&&”什么意思?
  10. 在c语言中,一条简单语句的结束符为什么?