Android學習七---Hello OpenCV samples

來源:互聯網
上載者:User

標籤:

    建立一個能夠使用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和單通道映像.

 

 

 

Android學習七---Hello OpenCV samples

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.