雖然在OpenCV官網上有如何在Android中使用OpenCV庫的文章,但是按照那個文章來根本沒法成功調入OpenCV庫。因此特撰寫此文給出正確的掛載庫的方法和掛載OpenCVManager時,函數調用的順序。
首先本文不討論如何通過static靜態塊的方法掛載OpenCV庫(因為這個方法我沒有成功),討論的是通過實現 CvCameraViewListener 介面同步掛載OpenCV庫,這也是OpenCV官網上推薦的做法:
Using async initialization is arecommendedway for application
development. It uses the OpenCV Manager to access OpenCV libraries externally installed in the target system.
通過此方法掛載的步驟為:
- 實現CvCameraViewListener 需要實現的虛函數,Eclipse中可以自動補全需要實現的虛函數。
- 定義BaseLoaderCallback回呼函數介面,並實現這個類中的onManagerConnected()方法
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { System.out.println("OpenCV loaded successfully"); } break; default: { System.out.println("OpenCV loaded Failed!"); super.onManagerConnected(status); } break; } } };
- 覆寫Activity中的OnResume方法,在調用預設OnResume後進行OpenCV庫的同步掛載(2.4.5版本)
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this, mLoaderCallback);
- 至此實現了OpenCV庫的掛載,關鍵的問題來了,在OnCreate函數中不能使用OpenCV庫相關的類和方法,因為此時OpenCV庫還沒有掛載上去!即使把initAsync方法放到OnCreate中也不行!博主在這裡卡了很久通過各種調試才發現這個問題。可以使用Handler的方法延遲新的線程的啟動以等待OpenCV庫的載入