標籤:android style blog http io ar color 使用 sp
搭建好OpenCV4Android環境後,就要著手開發自己的應用了。對於一個沒有OpenCV基礎的人來開發OpenCV應用確實有點難度,不過我們可以從samples裡學起,結合javadoc和萬能的網路開發一個簡單的應用應該不難。為了簡單,我們採用的是純粹的java API不涉及JNI,等對這一部分熟悉之後再來採用JNI實現。
首先對OpenCV的android應用來個感性的認識,把samples中的image-manipulations安裝到手機上(手機上先安裝好OpenCV manager 和binary pack見上節),然後把menu調出來,試一試Histograms,Canny ,sobel 等菜單,會發現應用對網路攝影機捕獲的映像即時的處理,在螢幕的一個小的視窗中輸出處理結果圖。
這樣一來我們的重點就確定了,簡單的介面設計,資料存放區,顯示和演算法的應用是關鍵。而演算法的應用就通過調用一系列的API來實現。我們就圍繞下面幾個問題來進行
1.操縱相機,取出映像進行處理
首先必須要知道OC(OpenCV)是怎麼操縱相機的,如何從映像流中取出一幀幀來進行處理?
解決:通過opencv官網的例子瞭解
JAVA 包含OpenCV java包。即通過非同步的方式來進行應用開發,這個是官網強烈推薦的方式,因為可以減少代碼量等優勢,主要是用OpenCV Manager方式來擷取OpenCV庫(已經在目標系統安裝好了)
1.1 File -> Import -> Existing project in your workspace.
1.2. Project -> Properties -> Android -> Library -> Addselect OpenCV Library - 2.4.9.
1.3 一個簡單的程式
public class Sample1Java extends Activity implements CvCameraViewListener { 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); } ...}
OnManagerConnected callback會在UI線程中調用,在使用OpenCV調用或者載入OpenCV支撐的本地庫前一定要先包含這一調用。在OpenCV成功初始化後載入本地庫,預設的BaseLoaderCallback會把應用程式上下文當成是Activity,所以在初始化失敗時會調用Activity.finish()。要重寫這一行為,就必須重寫finish()這一方法。
2.要瞭解處理的程式是寫在哪一部分的,如何達到只對這一部分修改,而其他部分不變?
官網上的samples,ImageManipulationsActivity採用的是OpenCV java API來寫的,通過一個hello opencv知道整個流程(雖然這個程式沒有運行成功),
知道應該修改的是OnCameraFrame,對每幀映像進行處理。
3.如何?一個簡單基於連通域分析的OpenCV文本定位演算法,把演算法嵌入應用程式中?
演算法流程,對彩色的幀映像進行二值化,二值化之後進行連通域分析,分析每個連通域的情況,對連通域進行分析,去除一些不符合要求的,對剩下的連通域採用形態學影像處理,連成一個文本行,在對文本行進行濾除,最後得到文本的地區位置。
4.如何對錯誤進行調試使最終實現運行?
採用同Android相同的方式進行調試,如logcat和端點,一系列快速鍵的使用如F5,F6,F7,F8 和ctrl+R等。
Android學習六---OpenCV for android samples