通过使用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. 测试代码
测试代码同方法一