OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

官网下载sdk
https://opencv.org/
OPENCV
本次环境搭建是使用opencv提供的java接口。

  • 第一步新建工程

  • 工程名字自己取

  • 搭建好了

  • 打开下载好的opencv

  • 进入这一个目录

  • 把java目录复制到自己的工程里面

  • 导入




这里要注意一下,有报错!

我们只需要把opencv里面的manifest里面的uses-sdk这里注释掉就好了

接着添加依赖

implementation project(path: ':openCVLibrary343')


新建一个jinLibs文件夹

最后添加so库
打开opencv复制opencv_sdk\OpenCV-android-sdk\sdk\native\libs里面的v7a库,当然也可以全部复制过去

复制过去后的样子

在app里面的build.gradle里面添加资源路径

在工程的MainActivity.java里面添加

@Override    public void onResume()    {        super.onResume();        if (!OpenCVLoader.initDebug()) {            Log.i("cv", "Internal OpenCV library not found. Using OpenCV Manager for initialization");        } else {            Log.i("cv", "OpenCV library found inside package. Using it!");        }    }

然后环境基本搭建好了。
我们运行时可能会有报错

只需要进去opencv的build.gradle里面改一下sdk版本就好了

接下来测试一下
布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"    android:orientation="vertical">    <ImageView        android:layout_width="match_parent"        android:layout_height="200dp"        android:id="@+id/img"        android:layout_marginTop="100dp"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="导入"        android:layout_gravity="center"        android:layout_marginTop="20dp"        android:id="@+id/but"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="50sp"        android:layout_gravity="center"        android:text="灰度化"        android:id="@+id/use"/></LinearLayout>

java代码

package com.android.opencv;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import org.opencv.android.OpenCVLoader;import org.opencv.android.Utils;import org.opencv.core.CvType;import org.opencv.core.Mat;import org.opencv.imgproc.Imgproc;import java.io.FileNotFoundException;public class MainActivity extends AppCompatActivity {    private Button but;    private  Button but1;    private ImageView img;    private Bitmap bitmap;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        but = findViewById(R.id.but);        img= findViewById(R.id.img);        but1=findViewById(R.id.use);        but.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //intent可以应用于广播和发起意图,其中属性有:ComponentName,action,data等                Intent intent=new Intent();                intent.setType("image/*");                //action表示intent的类型,可以是查看、删除、发布或其他情况;我们选择ACTION_GET_CONTENT,系统可以根据Type类型来调用系统程序选择Type                //类型的内容给你选择                intent.setAction(Intent.ACTION_GET_CONTENT);                //如果第二个参数大于或等于0,那么当用户操作完成后会返回到本程序的onActivityResult方法                startActivityForResult(intent, 1);            }        });        but1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Bitmap bit = bitmap.copy(Bitmap.Config.ARGB_8888, false);                Mat src = new Mat(bit.getHeight(), bit.getWidth(), CvType.CV_8UC(3));                Utils.bitmapToMat(bit, src);                Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);                Utils.matToBitmap(src, bitmap);                Message message=new Message();                message.what=1;                handler.sendMessage(message);            }        });    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        //用户操作完成,结果码返回是-1,即RESULT_OK        if(resultCode==RESULT_OK){            //获取选中文件的定位符            Uri uri = data.getData();            Log.e("uri", uri.toString());            //使用content的接口            ContentResolver cr = this.getContentResolver();            try {                //获取图片                bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));                img.setImageBitmap(bitmap);            } catch (FileNotFoundException e) {                Log.e("Exception", e.getMessage(),e);            }        }else{            //操作错误或没有选择图片            Log.i("MainActivtiy", "operation error");        }        super.onActivityResult(requestCode, resultCode, data);    }    @Override    public void onResume()    {        super.onResume();        if (!OpenCVLoader.initDebug()) {            Log.i("cv", "Internal OpenCV library not found. Using OpenCV Manager for initialization");        } else {            Log.i("cv", "OpenCV library found inside package. Using it!");        }    }    Handler handler=new Handler(){        @Override        public void handleMessage(@NonNull Message msg) {            super.handleMessage(msg);            switch (msg.what)            {                case 1:img.setImageBitmap(bitmap);break;            }        }    };}



最后大功告成!

关注公众号回复:android搭建opencv 即可获取工程源码

更多相关文章

  1. Android(安卓)MVP开发模式 google 官方Mvp架构详解(转)
  2. android 静默安装,含获取各种应用信息方法,根据apk获取应用信息
  3. 在Eclipse中导入新浪微博SDK
  4. JS与Android互调
  5. [置顶] 编译自己的Windows Android(安卓)SDK(how to build Andro
  6. Android支付——支付宝支付总结
  7. Android小知识点收集
  8. Android(安卓)EventBus 封装(支持多个粘性事件消息共存)
  9. Android(安卓)App接入微信开放平台注意事项

随机推荐

  1. android 查看系统分配程序内存限制
  2. android模拟器上网
  3. android 内置默认输入法
  4. Android(安卓)ANR介绍与避免
  5. CreateProcess error = 2,系统找不到指定
  6. Android Handler Message 通信机制
  7. Android 下压缩图片—微弱失真
  8. Android(安卓)GSM驱动模块(rild)详细分析(二
  9. Android中的表格布局TableLayout
  10. Android IMF学习笔记二