Android NDK開發:OpenCV Android JNI庫集成

目錄

OpenCV是什么

OpenCV(Open Source Computer Vision Library)中文全稱是源代碼開放的計算機視覺庫,是基于C/C++編寫的,是BSD開源許可的計算機視覺開發框架。

OpenCV能做什么

OpenCV應用的領域非常廣,如衛星地圖與電子地圖拼接,醫學圖像噪聲處理、對象檢測,安防領域的入侵檢測,機器人及無人駕駛技術等。

OpenCV的核心功能模塊

這里以OpenCV3.3為例,它的正式版核心模塊有如下幾個:

  • 二維與三維特征工具箱
  • 運動估算
  • 人臉識別
  • 姿勢識別
  • 人機交互
  • 運動理解
  • 對象檢測
  • 移動機器人
  • 分割與識別
  • 視頻分析
  • 運動跟蹤
  • 圖形處理
  • 機器學習
  • 深度神經網絡

OpenCV Android SDK下載

OpenCV Android SDK 下載地址:https://opencv.org/opencv-3-3/

OpenCV Android項目集成

在新建好的項目中導入OpenCV的Java庫。



導入的是sdk目錄下的Java文件夾。



接下來需要將sdk->native->libs里的所有文件拷貝到app的libs目錄下。

然后將以.a結尾的文件刪掉。



接下來需要在app的build.gradle問價中加入如下代碼:
task nativeLibsToJar(type: Jar, description: "create a jar archive of the native libs") {
        destinationDir file("$buildDir/native-libs")
        baseName "native-libs"
        extension "jar"
        from fileTree(dir: "libs", include: "**/*.so")
        into "lib"
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
}
implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')

代碼測試

我們調用一下OpenCV的相關API完成簡單的圖像灰度轉化。
效果展示:



代碼展示-布局文件:

<?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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.itfitness.opencvdemo.one.OneActivity">

    <Button
        android:id="@+id/bt"
        android:text="灰度圖"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/img"
        android:layout_width="200dp"
        android:layout_height="200dp" />
</LinearLayout>

代碼展示-Activity:

public class OneActivity extends AppCompatActivity implements View.OnClickListener{
    private Button bt;
    private ImageView img;
    private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        initOpenCv();
        bt = (Button) findViewById(R.id.bt);
        img = (ImageView) findViewById(R.id.img);
        bt.setOnClickListener(this);
        initImg();
    }

    /**
     * 加載OpenCv庫
     */
    private void initOpenCv() {
        boolean b = OpenCVLoader.initDebug();
        if(b){
            Toast.makeText(this, "加載成功", Toast.LENGTH_SHORT).show();
        }
    }

    private void initImg() {
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        img.setImageBitmap(bitmap);
    }

    @Override
    public void onClick(View v) {
        Mat src = new Mat();
        Mat dst = new Mat();
        Utils.bitmapToMat(bitmap,src);
        Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2GRAY);
        Utils.matToBitmap(dst,bitmap);
        img.setImageBitmap(bitmap);
        src.release();
        dst.release();
    }
}

項目源碼:https://github.com/myml666/OpenCvDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容