1. 程式人生 > >學習筆記:在android 上 使用 opencv

學習筆記:在android 上 使用 opencv

這篇筆記我預料肯定會很長,因為他是我學習了賈老師(賈志剛),OpenCV android 開發實戰的記錄筆記,因為怕後面難得找所以肯定會盡量累積在一篇,或者二篇文章。

今天看到一句話,我認為我以後得學習,就應該以他為標準,這是來自李沫《動手學深度學習》中得一句話:電腦科學是一門動手的科學,沒有足夠的動手能力難以取得很好的成就,如果演算法能力對應一臺機器的記憶體大小,動手能力則是機器的CPU的頻率,記憶體決定了能跑多麼複雜的程式,CPU則決定你能多快的完成它,兩者都不能缺。

深度學習圖片識別方向,少不了對圖片處理進行打交道,而opencv是比較常用得,我也是在看賈老師得python學習opencv中瞭解到賈老師出得這本書,本身現在是在做android,作為技術得縱向發展,這是我必須進修得一門課,所以就有了這篇筆記得記錄,對後面做圖片領域應該有所幫助。

##1. OpenCv 在android上得 環境搭建

@@1. 下載 sdk 

官方地址 :https://opencv.org/opencv-4-0-0.html ,大約壓縮包有300多M,解壓有900多M。

將其解壓,解壓之後的檔案結構:

 

@@2.自行安裝 jdk ,android 開發環境,android NDK 開發環境。

@@3.android 專案上 使用

 

 

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)


    }

 

//3.0 之前的
compile fileTree(dir: "$buildDir/native-libs", include: "native-libs.jar") 

//3.0 之後的
implementation  fileTree(dir: "$buildDir/native-libs", include: "native-libs.jar") 

 

@@4.新增lib,到app,寫測試執行程式碼

package com.zhangrong.opencvdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;


/**
 * Created by zhangrong on 2018/10/31.
 * <p>
 * 程式碼測試頁面
 */

public class CodeTestActivity extends Activity {

    private ImageView iv_show;//顯示圖片控制元件
    private Button bt_fdOp;//操作按鈕

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_codetest_layout);
        initLoadOpenCv();
    }

    //載入OpenCv本地庫
    private void initLoadOpenCv() {
        boolean successBol = OpenCVLoader.initDebug();
        if (successBol) {
            Log.i("CodeTest", "載入 OpenCv本地庫成功");
        } else {
            Log.i("CodeTest", "載入 OpenCv本地庫失敗");
            Toast.makeText(this, "載入 OpenCv本地庫失敗", Toast.LENGTH_SHORT).show();
        }

        iv_show = this.findViewById(R.id.show_iv);
        bt_fdOp = findViewById(R.id.bt_fdOp);
        bt_fdOp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
                Mat src = new Mat();
                Mat dst = new Mat();
                Utils.bitmapToMat(bitmap, src);
                Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
                Utils.matToBitmap(dst, bitmap);
                iv_show.setImageBitmap(bitmap);

                //釋放操作
                src.release();
                dst.release();
            }
        });




    }


}

 該篇文章,只完成了第一個知識點記錄,後面還很長,待完善。。。。