android opencv 内存_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版本就好了

接下来测试一下

布局

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">

android:layout_width="match_parent"

android:layout_height="200dp"

android:id="@+id/img"

android:layout_marginTop="100dp"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="导入"

android:layout_gravity="center"

android:layout_marginTop="20dp"

android:id="@+id/but"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="50sp"

android:layout_gravity="center"

android:text="灰度化"

android:id="@+id/use"/>

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;

}

}

};

}

最后大功告成!

Share:

你可能感兴趣的:(android,opencv,内存)