1. 程式人生 > >Android Studio配置JavaCPP Presets for OpenCV

Android Studio配置JavaCPP Presets for OpenCV


通過使用JavaCV,無需複雜的配置就可呼叫OpenCV_Contrib中的演算法,比較方便。而OpenCV官方目前是不提供For Android擴充套件包下載的。

一、      配置Jar檔案方式

參考 https://www.jianshu.com/p/7f9d31839b8f

1.   下載jar

http://bytedeco.org/download/下載

解壓

2.   在Android Studio中新建專案

3.   將以下檔案複製到"\app\libs"資料夾下

4.   右鍵“app”->“Open ModuleSettings”->選擇“Dependencies”->點選“+” ->選擇“2 Jar Dependency”, 將剛才複製的".jar"檔案新增進去。

5.   在"app/build.gradle"中新增如下程式碼

packagingOptions {
   
exclude 'META-INF/services/javax.annotation.processing.Processor'
   

pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
   
pickFirst 
'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
}

 

6.   測試程式碼

package com.javacvtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.opencv_imgproc;
import org.bytedeco.javacpp.opencv_ximgproc;
import org.bytedeco.javacv.AndroidFrameConverter;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;

// 靜態成員變數必須 static匯入.
import static org.bytedeco.javacpp.opencv_core.IPL_DEPTH_8U;

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = (ImageView) findViewById(R.id.img1);

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.i1);
        IplImage iplImage = this.bitmapToIplImage(bitmap);

        AndroidFrameConverter converterToBitmap = new AndroidFrameConverter();
        OpenCVFrameConverter.ToIplImage converterToIplImage = new OpenCVFrameConverter.ToIplImage();
        OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat();

        // Bitmap 轉 Frame
        Frame frame = converterToBitmap.convert(bitmap);
        // Frame 轉 Mat
        opencv_core.Mat mat = converterToIplImage.convertToMat(frame);
        // 灰度化
        opencv_imgproc.cvtColor(mat, mat, opencv_imgproc.COLOR_RGB2GRAY);
        opencv_core.Mat mat1 = new opencv_core.Mat();
        // SAUVOLA二值化(擴充套件包演算法)
        opencv_ximgproc.niBlackThreshold(mat, mat1, 255, opencv_ximgproc.BINARIZATION_SAUVOLA, 5, 0.5, opencv_imgproc.THRESH_BINARY);
        // Mat 轉 Frame
        Frame frame1 = converterToMat.convert(mat1);
        // Frame 轉 Bitmap
        Bitmap bitmap1 = converterToBitmap.convert(frame1);
        imageView.setImageBitmap(bitmap1);

        mat.release();
        mat1.release();
    }
    /**
     * IplImage轉化為Bitmap
     * @param iplImage
     * @return
     */
    public Bitmap IplImageToBitmap(opencv_core.IplImage iplImage) {
        Bitmap bitmap = null;
        bitmap = Bitmap.createBitmap(iplImage.width(), iplImage.height(),
                Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(iplImage.getByteBuffer());
        return bitmap;
    }

    /**
     * Bitmap轉化為IplImage
     * @param bitmap
     * @return
     */
    public opencv_core.IplImage bitmapToIplImage(Bitmap bitmap) {
        opencv_core.IplImage iplImage;
        iplImage = IplImage.create(bitmap.getWidth(), bitmap.getHeight(),
                IPL_DEPTH_8U, 4);
        bitmap.copyPixelsToBuffer(iplImage.getByteBuffer());
        return iplImage;
    }

    /**
     * 將資源ID轉化為Drawable
     * @param id
     * @return
     */
    public Drawable idToDrawable(int id) {
        return this.getResources().getDrawable(id);
    }

    /**
     * 將Drawable轉化為Bitmap
     * @param drawable
     * @return
     */
    public Bitmap drawableToBitmap(Drawable drawable) {
        if(drawable == null)
            return null;
        return ((BitmapDrawable)drawable).getBitmap();
    }
}

二、      Gradle方式

1.   在Android Studio中新建專案

2.   在"app/build.gradle"中新增如下程式碼

packagingOptions {
   
exclude 'META-INF/services/javax.annotation.processing.Processor'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
   
pickFirst  'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
}

 

compile 'org.bytedeco:javacv:1.4'
compile 'org.bytedeco.javacpp-presets:opencv:3.4.0-1.4:android-arm'
 
 

3.   測試程式碼

測試程式碼同方法一