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.xml'
pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
pickFirst
}
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. 測試程式碼
測試程式碼同方法一