之前研究过opencv,不过都是在vs上运行程序的。现在转到android开发阵营中,就想着弄弄老本行,前些天试了下opencv2.4.x配置,需要安装manager.APK,发现对于不同的平台也就是CPU架构不同所需安装的apk也不同,试着安装上文档中给的对应的apk,各种报错,应该是最近几年手机发展太快,opencv2.x.x给的apk已经赶不上硬件的进步了。现在开发在android7.1.1平台上,想找个5.0的版本都没有。于是想到借助opencv在android上开发,总不能一直额外adb个apk。因此就想着,可不可以不要manager.APK。查了些资料,在opencv3之后就可以了,今天弄了下,的确可以的。下面介绍下环境的搭建和使用。
本人使用的是AndroidStudio2.2.3,当然你电脑本身就已经搭建好了AndroidStudio并可以正常创建项目,这里只是告诉你怎么加入opencv。在网上搜到OpenCV-3.1.0-android-sdk,下载下来(该版本之后的应该也可以,有兴趣的可以试一试)。解压出来。下面就一步步介绍:
1)在AndroidStudio中File->New->ImportModule,导入项目其实这里是导入opencv库。
2)导入的项目在解压出OpenCV-3.1.0-android-sdk的文件夹下,../sdk/java(java文件夹),点击ok导入。
3)由于导入的项目的配置文件不匹配,将AndroidStudio调为Project视角,进入到新加入的openCVLibrary310中的build.gradle中,将下图中红圈内的改为你自己的开发环境的配置,可参考自己项目的其他build.gradle。
4)接下来给你需要添加opencv库的项目进行配置(我的是app项目),进入File中的Project Struture,按如下图所示的步骤。
5) 添加openCVLibrary310。
6)复制解压OpenCV-3.1.0-android-sdk文件夹下,../sdk/native/libs的libs文件夹。
7)粘贴到你需要opencv库的项目下../app/src/main下,将libs重新命名为jniLibs。
8)通过上述步骤,就完成了。
现在我们在app项目中进行代码测试。(在MainActivity中加入:static{System.loadLibrary("opencv_java3"); } )
public class MainActivity extends Activity { static{System.loadLibrary("opencv_java3"); } private Button btn; private ImageView img; private Bitmap srcBitmap; private Bitmap grayBitmap; private static boolean flag = true; private static boolean isFirst = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = (ImageView)findViewById(R.id.img); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new ProcessClickListener()); } public void procSrc2Gray(){ Mat rgbMat = new Mat(); Mat grayMat = new Mat(); srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.genie); grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565); Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B. Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap } public class ProcessClickListener implements View.OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub if(isFirst){ Runnable runnable=new Runnable () { @Override public void run() { procSrc2Gray(); } }; new Thread (runnable) .start (); isFirst = false; } if(flag){ img.setImageBitmap(grayBitmap); btn.setText("查看原图"); flag = false; }else{ img.setImageBitmap(srcBitmap); btn.setText("灰度化"); flag = true; } } } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="OpenCV"/> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/genie"/> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/img" android:layout_centerHorizontal="true" android:text="灰度化"/>" </RelativeLayout>
试验结果: