Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> OpenCV學習筆記(六)—— Android打開相機

OpenCV學習筆記(六)—— Android打開相機

編輯:關於Android編程

在之前的篇章中,我們完成了Android平台開發環境的配置,也找到了剔除OpenCV Manager API的辦法,那麼接下來我們開始從零開始,完成一個個人的程序,實現功能如下:

1.識別指定的圖片,並用彩色框繪制圖片邊緣

2.在識別的圖片上顯示一個3D的模型

不難看出,這實際上就是AR最初步的功能,當然要完成這個功能卻需要完成很多事情,步驟:

打開相機—>獲取圖像流—>模式識別—>對象跟蹤—>繪制模型

===============================分割線=====================================

在這裡,我們主要是調用OpenCV android SDK中的API來實現打開相機的功能。

一、知識准備:

1.了解Android工程如何運行在設備上

2.了解C/C++編譯過程,能夠讀懂makefile

 

二、實現流程:

1.打開Eclipse,新建一個空白的Android工程:

\

\

項目名稱為OpenCV_Test:

\

 

2.為新建工程引入OpenCV Library - 3.1.0庫工程:

\

選擇工程,右鍵點擊Properties(屬性),然後在Android頁簽中,用Add功能添加一個庫工程引用。

 

3.打開src目錄下面的MainActivity,由於我們的目標是在應用中通過OpenCV的Java API實現打開相機全屏顯示,並獲取預覽框,所以MainActivity需要實現CvCameraViewListener2接口,可以實現三個方法,分別是:onCameraViewStarted、onCameraViewStopped和onCameraFrame,關鍵的圖像處理寫在onCameraFrame函數中:

\

 

4.修改AndroidManifest.xml文件:

添加相機的相關權限:

 


  

設置應用的界面主題為沒有頂部標題欄且全屏顯示的,在application標簽中添加:

 

 



 

5.為界面布局文件添加顯示相機內容的組件:

打開res/layout下面的activity_main.xml布局文件,往布局中添加一個OpenCV的視覺組件JavaCameraView:

 



    


 

6.回到MainActivity中,完成API的調用:

聲明一個CameraBridgeViewBase對象,用於存放activity_main.xml中的JavaCameraView組件,並在OnCreate中實現綁定和添加事件監聽:

 

mCVCamera = (CameraBridgeViewBase) findViewById(R.id.camera_view);
mCVCamera.setCvCameraViewListener(this);

 


 

7.添加C/C++編譯支持,即Add Native Support,這是為了不依賴於OpenCV Manager,直接引入庫文件進行編譯:

\

記住這裡的填寫的名稱就是引入的庫文件被編譯生成.so文件的名稱:

\

打開生成的jni目錄下的Android.mk文件,這個是C/C++編譯和鏈接時使用到的makefile配置文件,稍微做一點點修改內容,在“include $(CLEAR_VARS)”後面添加以下內容:

 

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
ifdef OPENCV_ANDROID_SDK
  ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
    include ${OPENCV_ANDROID_SDK}/OpenCV.mk
  else
    include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
  endif
else
  include ../../sdk/native/jni/OpenCV.mk
endif
如此,我們就完成了庫文件的引入操作,那麼接下來就是讓相機的輸入幀展示在預覽組件JavaCameraView上。

 

 

8.修改public Mat onCameraFrame(CvCameraViewFrame inputFrame)回調函數的內容了,這個函數在相機刷新每一幀都會調用一次,而且每次的輸入參數就是當前相機視圖信息,我們直接獲取其中的RGBA信息作為Mat數據返回給顯示組件即可:

 

/**
	 * 圖像處理都寫在此處
	 */
	@Override
	public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
		//直接返回輸入視頻預覽圖的RGBA數據並存在Mat數據中
		return inputFrame.rgba();
	}

 


9.以上操作中,我們在OnCreate函數中已經獲取到mCVCamera對象,只有調用mCVCamera.enableView()之後,預覽組件才會顯示每一幀的Mat圖像,但是在顯示之前我們必須先確保OpenCV的庫文件已經加載完成,所以調用此方法需要進行異步處理:

 

/**
	 * 通過OpenCV管理Android服務,異步初始化OpenCV
	 */
	BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
		@Override
		public void onManagerConnected(int status){
			switch (status) {
			case LoaderCallbackInterface.SUCCESS:
				Log.i(TAG,"OpenCV loaded successfully");
				mCVCamera.enableView();
				break;
			default:
				break;
			}
		}
	};

 

所以只有當mLoaderCallback收到LoaderCallbackInterface.SUCCESS消息的時候,才會打開預覽顯示,那麼這個消息是從哪裡發出來的呢,這就需要我們重寫Activity的onRusume方法了,因為每次當前Activity激活都會調用此方法,所以可以在此處檢測OpenCV的庫文件是否加載完畢:

 

@Override
	public void onResume() {
		super.onResume();
		if (!OpenCVLoader.initDebug()) {
			Log.d(TAG,"OpenCV library not found!");
		} else {
			Log.d(TAG, "OpenCV library found inside package. Using it!");
			mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
		}
	};

 

 

三、結果展示:

至此,我們就完成了設備相機打開以及輸入預覽數據的獲取,運行在設備上可以看到:

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved