OpenCV是一個基於BSD許可(開源)發行的跨平臺電腦視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類,同時提供了Python、Ruby、MATLAB等語言的介面,實現了和電腦視覺方面的很多通用演算法 ...
OpenCV是一個基於BSD許可(開源)發行的跨平臺電腦視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類,同時提供了Python、Ruby、MATLAB等語言的介面,實現了和電腦視覺方面的很多通用演算法百度百科 詞條:opencv
- 目前公司項目的新功能用到圖片識別功能,在瞭解到過程中知道了OpenCV這個神器,因此學習了基礎,特地來記錄,防止以後忘記。後期將進一步完善其學習記錄。更多內容歡迎訪問我的個人網站
我用到東西如下:
- Android Studio 2.3
- OpenCV for Android 點我下載
下載OpenCV4Android
- 將壓縮包解壓後可以看到有以下文件,其中使用紅線包裹的文件夾是非常重要的文件夾,後面要用到
- apk 保存的是一些基礎包,要根據你的手機晶元的架構安裝合適的版本,否則將會提醒你安裝,以至於各種錯誤,所以在之前,還是老老實實安裝吧。
- samples 保存的一些demo,可以根據自己的需要進行學習
sdk 我們開發所用的一些工具
註意:我在學習的過程,直接在手機安裝會報解析安裝包錯誤,以至於無法安裝,那麼這裡需要連接開發者模式,使用adb進行安裝,命令: adb install ****.apk 就可以安裝成功了。
創建工程
- 創建一個普通的安卓工程即可,然後我們需要導入Module
導入Module 這個東西就是上圖中的java文件夾,選擇File--> new --> import Module 選擇步驟一圖中紅色框框圈起來的JAVA文件夾即可,然後在文件欄中就可以看到這個新的Module了,後面的320指的是版本號,每個人可能不一樣
導入Module之後我們需要配置一下,在File--->Project Structure菜單中選擇該Moudle作為庫依賴即可,如下操作
註意:在某些情況下,再倒入Module的情況下,會出現報錯的情況,這是修改Module的編譯版本和目標版本和APP的保持一致,然後重新Sync即可.
導入庫文件
- 這裡需要導入so庫等文件,文件就在步驟一圖的用紅線圈中的libs文件夾裡面,選中裡面的所有文件,註意是選中lib裡面所有的文件,不是選中libs文件夾。
在項目中,選app工程,在src/main目錄下新建jniLibs文件夾,將上面選中的文件全部複製到其中。
為了確保工程創建成功,我們可以重新reBuild一下工程
載入Opencv
- 我們在Activity的回調函數中非同步初始化OpenCV,代碼很簡單,一句話加上一個回調。
@Override
protected void onResume() {
super.onResume();
//載入OpenCv初始化引擎,並載入庫,可以看到initAsync,使用的是非同步載入
//因此需要提供回調函數
//OpenCVLoader.OPENCV_VERSION_3_2_0指的是版本號,請根據你自己的版本選擇
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, getApplicationContext(), mLoaderCallback);
}
//OpenCV庫載入並初始化成功後的回調函數
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status) {
case BaseLoaderCallback.SUCCESS:
Log.e("OpenCv", "成功載入");
break;
default:
super.onManagerConnected(status);
Log.e("OpenCv", "載入失敗");
break;
}
}
};
使用OpenCV
- 我們來使用OpenCv做一個簡單灰度圖
- 首先是佈局文件,就一個簡單的圖片
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_width="600px"
android:layout_height="1000px"
android:layout_centerHorizontal="true" />
</RelativeLayout>
- 具體代碼如下
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
//從資源中獲取圖片
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.psb);
//構建灰度RGB圖片
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
//將資源圖片轉化為Mat類資源
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
//將圖片灰度化
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
//將灰度Mat轉換為灰度BitMap資源
Utils.matToBitmap(grayMat, grayBitmap);
//設置顯示
((ImageView)findviewById(R.id.img)).setImageBitmap(binaryBitmap);
- 效果圖
當然還有更多的使用方法沒有再此詳細闡述,可以再網上尋找一些資源,Mat是非常強大的一個類,好好玩吧。