Android搭建opencv环境(超详细)

在这里插入图片描述
在这里插入图片描述
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 即可获取工程源码
在这里插入图片描述

原创文章 19 获赞 4 访问量 5132

猜你喜欢

转载自blog.csdn.net/dwh1314/article/details/105048043