編輯:關於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); } };
三、結果展示:
至此,我們就完成了設備相機打開以及輸入預覽數據的獲取,運行在設備上可以看到:導入工程到Android Studio時,gradle出現如下錯誤。Error:Failed to complete Gradle execution.Cause:Una
android開發中通過View的getDrawingCache方法可以達到截屏的目的,只是缺少狀態欄! 原始界面 截屏得到的圖片 代碼實現 1. 添加權
要求根據給定的頭部模板,截取資源圖。背景圖可支持拖動,縮放,拖動旋轉分析定義剪切浮層,實現背景資源圖的操作view實現繪制剪切浮層/** * 初始化繪制筆
開發者可利用SDK提供的接口,使用百度為您提供的基礎地圖數據。目前百度地圖SDK所提供的地圖等級為3-21級,所包含的信息有建築物、道路、河流、學校、公園等內容。 V3.