本文记录了如何使用官方提供的OpenCV4Android库在android下使用OpenCV

一、基础环境

1、系统环境    macOS Sierra + jdk 1.8 2、开发工具    Android Studio 2.3.33、引用库    OpnCV 2.4.11 (Android pack)4、程序运行环境    android模拟器(CPU/ABI:x86_64 Api:23)

注:对于刚入门的程序员,为了减少调试机型的兼容问题,建议先在模拟器上调试运行

二、过程

1、把从http://opencv.org/releases.html下载下来的
OpenCV-2.4.11-android-sdk.zip 解压。得到如下文件
Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第1张图片

  • apk :OpenCV Manager安装包所在目录,根据不同机器cpu架构来选,这里使用模拟器来调试,使用的架构是x86_64, 所以选择OpenCV_2.4.11_Manager_2.20_x86.apk
  • samples:opencv示例程序及其源码
  • sdk :开发所需的类库

2、通过Android Studio 创建一个普通项目(HelloOpenCV2)、然后在当前项目的目录下创建个文件夹(比如:OpenCVModule2411)
Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第2张图片
把刚才解压出来的OpenCV-2.4.11-android-sdk.zip里的sdk/java底下的所有文件复制到OpenCVModule2411 里
Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第3张图片
3、在Android Studio中引入OpenCVModule2411 为module
Android Studio–>File–>Import Module

Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第4张图片
导入后,如果开发环境没有安装到相对应的版本android sdk,就会报错,解决方法可以根据Android Studio 的控制台提示点击 fix xxx,
或者是修改OpenCVModule2411/build.gradle里各sdk版本号和app/build.gradle里的一致

Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第5张图片

4、添加OpenCVModule2411作app的module
Android Studio–>File –>Project Structure
选择 app ,并切换到Dependencies栏 点➕ 添加 ,选择Module Dependency,选择刚才引入的OpenCVModule2411点ok完成。

Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第6张图片

5、在Android Studio 里的 app/src/main创建一个文件夹命名为jniLibs(这个名字是不能改的),把OpenCV-2.4.11-android-sdk.zip解压出来的 sdk/native/libs里的所有文件复制到刚才创建的jniLibs里面
Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第7张图片
到此基本的配置已经完成,可以正常运行(还没添加OpenCV代码,所以没有效果)。

添加OpenCV代码:
MainActivity.java部分代码

public class MainActivity extends Activity {    private Button btn;    private ImageView img;    private Bitmap srcBitmap;    private Bitmap grayBitmap;    private static boolean flag = true;    private static boolean isFirst = true;    private static final String TAG = "OPENCV";    @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());    }    @Override    protected void onResume() {        super.onResume();      OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, getApplicationContext(), mLoaderCallback);        Log.i(TAG, "onResume sucess load OpenCV...");    }    //OpenCV库加载并初始化成功后的回调函数    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {        @Override        public void onManagerConnected(int status) {            Log.i(TAG, "mLoaderCallback:status"+status);            // TODO Auto-generated method stub            switch (status){                case BaseLoaderCallback.SUCCESS:                    Log.i(TAG, "成功加载");                    break;                default:                    super.onManagerConnected(status);                    Log.i(TAG, "加载失败");                    break;            }        }    };    public void procSrc2Gray(){        Mat rgbMat = new Mat();        Mat grayMat = new Mat();        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.opencv);        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        Log.i(TAG, "procSrc2Gray sucess...");    }    public class ProcessClickListener implements View.OnClickListener{        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            if(isFirst){                procSrc2Gray();                isFirst = false;            }            if(flag){                img.setImageBitmap(grayBitmap);                btn.setText("查看原图");                flag = false;            }else{                img.setImageBitmap(srcBitmap);                btn.setText("灰度化");                flag = true;            }        }    }}

布局文件 activity_main.xml

<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:background="@drawable/opencv"        android:layout_marginTop="100dp"        android:layout_centerVertical="true"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true" />    <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>

drawable 下的opencv.jpg图片
Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第8张图片

运行,有可能出现错误,参考
http://blog.csdn.net/gao_chun/article/details/72654286
解决,不过作为程序员,要坚信大部分问题都可以通过百度或者google直接或间接地解决,善于使用搜索引擎及知识的共享带来的便利
如果没有则大功告成,运行如下:

Android Studio 使用 java 通过 OpenCV4Android 实现 Hello OpenCV_第9张图片

github:
https://github.com/1107979819/HelloOpenCV2

尊重每一份的付出,参考及代码引用:
http://blog.csdn.net/gao_chun/article/details/49359535
http://blog.csdn.net/gao_chun/article/details/72654286

转载注明来源:
http://blog.csdn.net/cs1107979819/article/details/74140673

更多相关文章

  1. android 真机 安装 模拟器 DevTools Development
  2. Android之获取手机上的图片和视频缩略图thumbnails
  3. 史上最强劲之android模拟器命令详解
  4. Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等
  5. Android 通过蓝牙控制小车源代码+视频
  6. 73、ImageView 让图片填充满
  7. 利用多张图片实现动态图
  8. android读取大图片并缓存

随机推荐

  1. mysql 8.0.12 安装配置教程
  2. Mysql无法选取非聚合列的解决方法
  3. mysql的定时任务实例教程
  4. MySQL分页Limit的优化过程实战
  5. mysql增量备份及断点恢复脚本实例
  6. 在golang中操作mysql数据库的实现代码
  7. centos7.4系统中yum源安装mysql 5.6
  8. Navicat修改MySQL数据库密码的多种方法
  9. 详解 Mysql中的delimiter定义及作用
  10. mysql server 8.0.3安装配置方法图文教程