Android搭建opencv环境(超详细)
16lz
2021-01-24
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 即可获取工程源码
更多相关文章
- Android(安卓)MVP开发模式 google 官方Mvp架构详解(转)
- android 静默安装,含获取各种应用信息方法,根据apk获取应用信息
- 在Eclipse中导入新浪微博SDK
- JS与Android互调
- [置顶] 编译自己的Windows Android(安卓)SDK(how to build Andro
- Android支付——支付宝支付总结
- Android小知识点收集
- Android(安卓)EventBus 封装(支持多个粘性事件消息共存)
- Android(安卓)App接入微信开放平台注意事项