在Android Studio上搭建OpenCV 開發環境
阿新 • • 發佈:2018-12-02
這裡預設你已經成功安裝了Android Studio IDE;我這裡使用的AS版本是3.0.1;截止目前,AS穩定版本已經升級至3.2.1,至於版本間的區別,這裡不多做區分和說明。如果對於AS的下載和安裝有問題也可以參加我的關於AS介紹的部落格。下面就來看看如何搭建OpenCV的開發環境。
1,環境搭建
第一步:下載SDK
點選下圖中的紅色方框中SDK,也即最新發布的openCV3.4.4
第二步:解壓與分析
下載完成解壓之後的目錄如下:
其中:
- apk資料夾中儲存的是對應不同cpu的代理(manager)應用
- samples中儲存的是官方給出Demo原始碼示例,但是遺憾的是這裡都是Eclipse專案
- sdk中儲存的就是我們接下來搭建環境需要使用的一些材料
下面就來簡單看一下sdk中究竟有什麼東西:
- etc中存放的是訓練好的級聯分類器資料(HAAR和LBP)
- java中存放的是我們接下來使用的Android SDK
- native中存放基於c/c++編譯好的本地庫檔案,JNI層開發需要的標頭檔案和CMake檔案
第三步:匯入SDK
(1)建立一個新的工程,點選“File”-->"New"-->"Import Module",然後選擇上圖中的java資料夾點選OK“”即可;待工程構建完成之後,專案結構如下圖所示:
(2)把native資料夾中libs目錄下面的所以檔案copy到我們專案的libs目錄中
(3)到目前為止,我們的工作也快結束了,但是還需要修改一下gradle檔案
- 在上圖中的build.gradle(Module:app)中最外層新增如下程式碼:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { destinationDir file("$buildDir/native-libs") baseName 'native-libs' from fileTree(dir: 'libs', include: '**/*.so') into 'lib/' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) }
- 在我們匯入上面Module的時候,上一步的gradle檔案還會新增如下依賴(自動新增):
implementation project(':openCVLibrary344')
- 此外,我們還需要在依賴中載入libs目錄的檔案
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
implementation fileTree(dir: 'libs', include: ['*.jar'])
這樣,整個環境就算搭建完成了,到後面NDK相關開發的時候,還會去介紹相關的環境搭建,這裡就先不多說了,還是來看看一下環境是否搭建成功了吧。
2,校驗
還是使用一個別人舉的例子也是一個很簡單的API呼叫--圖片的灰度化;先看一下效果示意圖:
佈局activity_test.xml程式碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hfut.operationopencvmain.TestActivity">
<LinearLayout
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/test_image"
android:layout_width="400dp"
android:layout_height="400dp" />
</LinearLayout>
<Button
android:layout_marginTop="10dp"
android:text="灰度圖片"
android:onClick="grayImage"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
TestActivity.java程式碼:
package com.hfut.operationopencvmain;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
/**
* @author why
* @date 2018-11-26 23:00:06
*/
public class TestActivity extends AppCompatActivity {
private ImageView imageView;
private static final String TAG = "TestActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
boolean status = OpenCVLoader.initDebug();
if (status) {
Log.e(TAG, "onCreate: Succese");
} else {
Log.e(TAG, "onCreate: Failed");
}
imageView = findViewById(R.id.test_image);
imageView.setImageDrawable(getResources().getDrawable(R.drawable.test));
}
public void grayImage(View view) {
Mat src = new Mat();
Mat dst = new Mat();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
Utils.bitmapToMat(bitmap, src);
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(dst, bitmap);
imageView.setImageBitmap(bitmap);
//如果不用,直接釋放資源
//src.release();
//dst.release();
}
}
好了,到這裡就基本介紹完了,整個的環境搭建還是很簡單的;但是如果你嘗試著把下載下來的samples裡面的Eclipse專案移植到AS中並且能成功的在裝置上執行起來還是要費一點功夫的,這個在後面會介紹其中的一些坑。