转载声明,本文转自CSDN:http://blog.csdn.net/qq_22033759/article/details/51156121
ps:本来在贴吧上有人问,想自己写的,但时间有限,当初自己也是学习了这个CSDN博文后配置的,一为了收藏,二为了让更多朋友搜索到,就转载一下。。。
以下为转载原文:
我所使用的opencv版本为3.1,Android Studio版本为2.0
先从opencv官网下载对应的版本的安卓的opencv的sdk 解压出来路径不要有中文
然后在Android Studio里创建一个安卓项目,在根目录创建一个文件夹,命名为libraries
然后把sdk结业目录下的 sdkJava文件夹复制到libraries文件夹内,重命名为opencv
接着在该opencv目录下创建一个build.gradle,内容为
apply plugin: 'com.android.library' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0' } } android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 21 targetSdkVersion 23 versionCode 2480 versionName "3.1.0" } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] res.srcDirs = ['res'] aidl.srcDirs = ['src'] } } }
需要依照需求修改对应的sdk版本
然后在修改下项目的settings.gradle ,添加一行
include ':libraries:opencv'
要选择Sync Now
然后右键项目名,选择Open Module Settings,选择app然后点Dependencies,再点击加号,选第三个,把opencv添加进去
添加好后如图:
接着在/app/src/main/下创建一个文件夹叫jniLibs
把上图目录下的所有文件夹都复制到jniLibs中去。
到这就算是配置完全了。
接下来就是使用。
一定要先添加static{ System.loadLibrary(“opencv_java3”); }
我测试的代码:(界面有一个ImageView和一个Button)
package com.example.chengk.opencvexamples; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; public class MainActivity extends AppCompatActivity { static{ System.loadLibrary("opencv_java3"); } int i=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView)findViewById(R.id.imageView); final Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.aa1)).getBitmap(); imageView.setImageBitmap(bitmap); final Button button2 = (Button)findViewById(R.id.button); button2.setText("转换"); button2.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { i++; Mat rgbMat = new Mat(); Mat grayMat = new Mat(); //获取lena彩色图像所对应的像素数据 Utils.bitmapToMat(bitmap, rgbMat); //将彩色图像数据转换为灰度图像数据并存储到grayMat中 Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY); //创建一个灰度图像 Bitmap grayBmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565); //将矩阵grayMat转换为灰度图像 Utils.matToBitmap(grayMat, grayBmp); ImageView imageView = (ImageView)findViewById(R.id.imageView); if(i%2==1) imageView.setImageBitmap(grayBmp); else imageView.setImageBitmap(bitmap); } }); } }
运行效果图:
点击按钮前
点击按钮后
这么做确实是可行的,但空间占用太大,我这个程序占用空间将近50M,还在寻找其他更好的办法,找到了继续更新。