2019年4月1日 星期一

在Android上使用opencv

網路上有許多方式,這邊紀錄我認為比較簡單的一種,基本上就是在專案內建立模組,匯入opencv,設定完lib就能用了

IDE : Android Studio 3.3 (以下簡稱AS)
opencv android sdk : 3.3.0 (官方連結)




1. 下載下來解壓縮

2. 在AS內 : File -> New -> New Module -> 拉到下面選擇 Import Eclipse ADT Project -> Next


3. Source directory的地方填入剛剛解壓縮完的 (....\OpenCV-android-sdk\sdk\java) , 下面的Module name會自動填入 -> Next -> Finish


4. 這裡遇到的錯誤點擊 Affected Modules: openCVLibrary330 -> 註解掉 "uses-sdk android:minsdkversion="8" android:targetsdkversion="21" -> Try Again




5. 在src/main下面新增一個叫 jniLibs 的資料夾

6. 將opencv android sdk (....\OpenCV-android-sdk\sdk\native\libs\)這個路徑裡面的 armeabi-v7a(一般手機)、x86_64(模擬器) 放進jniLibs裡面



7. 將opencvlibrary330裡的build.gradle和app的build.gradle ,compileSdkVersion , minSdkVersion,targetSdkVersion要相同



8. 這樣opencv就載入了,再來就是用函式庫寫個demo





ex. 放個按鈕,按一下轉灰階,再按一下變原圖


layout只是個ImageView + Button 這裡就不放上來了

主要程式碼如下 :

 
   public class MainActivity extends AppCompatActivity implements View.OnClickListener{
     Button button;
     ImageView imageView;
     Bitmap srcBitmap,grayBitmap;
     boolean flag = false;

    static {
        System.loadLibrary("opencv_java3");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        imageView = findViewById(R.id.imageView);
        button.setOnClickListener(this);
        proc();
    }

    @Override
    public void onClick(View v) {
        if(v == button){
            if(!flag) {
                imageView.setImageBitmap(grayBitmap);
                flag = true;
                button.setText("GRAY");
            }else{
                imageView.setImageBitmap(srcBitmap);
                flag = false;
                button.setText("RAW");
            }
        }
    }

    public void proc(){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
        srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.photo);
        grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.RGB_565);
        Utils.bitmapToMat(srcBitmap,rgbMat);
        Imgproc.cvtColor(rgbMat,grayMat,Imgproc.COLOR_RGB2GRAY);
        Utils.matToBitmap(grayMat,grayBitmap);
    }

}



 
   
  // 這一段主要是抓取jniLibs裡的lib (libopencv_java3.so) ,所以跑的機器如果沒有相對應的版本就會拋錯
   
    static { 
        System.loadLibrary("opencv_java3");
    }



 

//呼叫opencv函式庫,如果第一次使用,需要在紅線的地方 Alt + Enter IDE會自動載入opencv (在build.gradle -> dependencies會發現implementation project(path: ':openCVLibrary330') ,載入後再 Alt + Enter一次import function即可

    public void proc(){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
        srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.photo);
        grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.RGB_565);
        Utils.bitmapToMat(srcBitmap,rgbMat);
        Imgproc.cvtColor(rgbMat,grayMat,Imgproc.COLOR_RGB2GRAY);
        Utils.matToBitmap(grayMat,grayBitmap);
    }







Source Code : https://github.com/tks3589/BloggerCode/tree/master/android/opencvBlog





沒有留言:

張貼留言