之前博文《Android学习笔记之——基于Android的opencv开发(Android studio3.6+opencv4.3.0开发环境搭建)》已经在Android studio中搭建了opencv的环境。本博文来进一步学习一下基于android的opencv开发

 

目录

OpenCV Android SDK

将OpenCV打包jar包的方法

成功在手机上运行基于opencv的demo

参考资料


 

OpenCV Android SDK

OpenCV Android SDK 本质上是使用Java 语言接口通过JNI 技术调用OpenCV C++代码完成的算法模块。Open CV 4Android 本身并不是一个纯Java 语言的计算机视觉库,而是基于OpenCVC ++本地代码、通过Java 语言接口定义,基于JNI 技术实现调
用C ++本地方法的SDK 开发包。所以当你下载好OpenCV Android SDK 之后,在它的SDK 目录下可以看到如图所示的目录结构。

Android学习笔记之——opencv开发进一步探索_第1张图片

Android学习笔记之——opencv开发进一步探索_第2张图片

 OpenCV Android SDK 的功能与Open CV 对应发布版本中的功能完全相同,唯一不同的是因为Java 语言的关系, Java 层封装的接口的参数传递和方法调用,与C++的接口相比有一些差异,这些都是为了更适应Java 语言的特性而做出的改动,使得Android 开发者更加容易学习与使用Open CV 来解决问题。

 

将OpenCV打包jar包的方法

之前博文《Android学习笔记之——基于Android的opencv开发(Android studio3.6+opencv4.3.0开发环境搭建)》完成了开发环境搭建,但是每次都要这样操作就非常麻烦了,此处将opencv打包为jar包

首先点击右边的gradle,如图所示:

Android学习笔记之——opencv开发进一步探索_第3张图片

依次选择430,other,如图所示

Android学习笔记之——opencv开发进一步探索_第4张图片

找到create full jar debug (或者release),如图

双击任意一个运行,运行完成后,改为project视图,在opencv430-bulid-intermediates-full_jar-debug下找到full_jar文件,如图所示

Android学习笔记之——opencv开发进一步探索_第5张图片

把full_jar复制到app项目的libs下,如图所示:

右键full.jar,add as a library,如图

Android学习笔记之——opencv开发进一步探索_第6张图片

Android学习笔记之——opencv开发进一步探索_第7张图片

点击ok
然后你就可以使用opencv中的Java接口,不用每次都Import Module了,如图

测试代码

package com.example.androidopencvtest;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import android.Manifest;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Build;import android.os.Bundle;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 org.opencv.android.CameraActivity;import java.io.InputStream;public class MainActivity extends AppCompatActivity {    // Used to load the 'native-lib' library on application startup.    static {        if (!OpenCVLoader.initDebug()) {//            System.loadLibrary("src/main/jniLibs");            // Handle initialization error        }//        System.loadLibrary("native-lib");//        System.loadLibrary("jniLibs");//        System.loadLibrary("src/main/jniLibs");//        System.loadLibrary("libs");    }    private double max_size = 1024;    private int PICK_IMAGE_REQUEST = 1;    private ImageView myImageView;    private Bitmap selectbp;    //权限    private static String[] PERMISSIONS_STORAGE = {//            Manifest.permission.READ_EXTERNAL_STORAGE,            Manifest.permission.WRITE_EXTERNAL_STORAGE,//写权限            Manifest.permission.CAMERA//照相权限    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        staticLoadCVLibraries();        myImageView = (ImageView)findViewById(R.id.imageView);        myImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);        Button selectImageBtn = (Button)findViewById(R.id.select_btn);        selectImageBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // makeText(MainActivity.this.getApplicationContext(), "start to browser image", Toast.LENGTH_SHORT).show();                selectImage();            }            private void selectImage() {                Intent intent = new Intent();                intent.setType("image/*");                intent.setAction(Intent.ACTION_GET_CONTENT);                startActivityForResult(Intent.createChooser(intent,"选择图像..."), PICK_IMAGE_REQUEST);            }        });        //华为手机摄像头权限申请        //用于判断SDK版本是否大于23        if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){            //检查权限            int i = ContextCompat.checkSelfPermission(this,PERMISSIONS_STORAGE[0]);            //如果权限申请失败,则重新申请权限            if(i!= PackageManager.PERMISSION_GRANTED){                //重新申请权限函数                startRequestPermission();                Log.e("这里","权限请求成功");            }        }        Button processBtn = (Button)findViewById(R.id.process_btn);        processBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // makeText(MainActivity.this.getApplicationContext(), "hello, image process", Toast.LENGTH_SHORT).show();                convertGray();            }        });    }    private void staticLoadCVLibraries() {        boolean load = OpenCVLoader.initDebug();        if(load) {            Log.i("CV", "Open CV Libraries loaded...");        }    }    private void convertGray() {        Mat src = new Mat();        Mat temp = new Mat();        Mat dst = new Mat();        Utils.bitmapToMat(selectbp, src);        Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);        Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));        Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);        Utils.matToBitmap(dst, selectbp);        myImageView.setImageBitmap(selectbp);    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {            Uri uri = data.getData();            try {                Log.d("image-tag", "start to decode selected image now...");                InputStream input = getContentResolver().openInputStream(uri);                BitmapFactory.Options options = new BitmapFactory.Options();                options.inJustDecodeBounds = true;                BitmapFactory.decodeStream(input, null, options);                int raw_width = options.outWidth;                int raw_height = options.outHeight;                int max = Math.max(raw_width, raw_height);                int newWidth = raw_width;                int newHeight = raw_height;                int inSampleSize = 1;                if(max > max_size) {                    newWidth = raw_width / 2;                    newHeight = raw_height / 2;                    while((newWidth/inSampleSize) > max_size || (newHeight/inSampleSize) > max_size) {                        inSampleSize *=2;                    }                }                options.inSampleSize = inSampleSize;                options.inJustDecodeBounds = false;                options.inPreferredConfig = Bitmap.Config.ARGB_8888;                selectbp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);                myImageView.setImageBitmap(selectbp);            } catch (Exception e) {                e.printStackTrace();            }        }    }    private void startRequestPermission(){        //321为请求码        ActivityCompat.requestPermissions(this,PERMISSIONS_STORAGE,321);    }}
<?xml version="1.0" encoding="utf-8"?>    

还是不行,应该就是没有将opencv的库编译进去

成功在手机上运行基于opencv的demo

加入下面的代码

    @Override            //免安装Opencv manager    protected void onResume() {        super.onResume();        if (!OpenCVLoader.initDebug()) {            System.out.println("Internal OpenCV library not found. Using OpenCV Manager for initialization");            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, mLoaderCallback);        } else {            System.out.println("OpenCV library found inside package. Using it!");            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);        }    }    // OpenCV库加载并初始化成功后的回调函数    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {        @Override        public void onManagerConnected(int status) {            switch (status) {                case LoaderCallbackInterface.SUCCESS: {                    System.out.println("OpenCV loaded successfully");                }                break;                default: {                    super.onManagerConnected(status);                }                break;            }        }    };

加上上边这段代码,下边这两个方法就是判断是否已经存在OpenCv库,存在就是用打包好的,不存在就下载。然后就ok啦~

Android学习笔记之——opencv开发进一步探索_第8张图片Android学习笔记之——opencv开发进一步探索_第9张图片

接下来基本就可以将之前学过的opencv相关的开发移植到手机上了哈~

 

 

参考资料

https://blog.csdn.net/qq_39321542/article/details/106080136

https://blog.csdn.net/lhhnb/article/details/89705989

https://blog.csdn.net/lhhnb/article/details/94896434

 

 

 

更多相关文章

  1. Android支持的图片格式
  2. Android——插入图片【ImageView】属性详解
  3. Android接口安全 - RSA+AES混合加密方案
  4. android图片透明度跟缩放大小动画事件
  5. Android中简单实现选择图片并裁剪
  6. Android接口定义语言---AIDL(一)
  7. Android基于tess-two的离线身份证等图片文字识别
  8. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关

随机推荐

  1. Android: 如何实现 in_app purchase
  2. android发彩信
  3. Android Studio decide the exact versio
  4. Android api 数据的保存方式
  5. Android的第一个应用(拨打电话)
  6. android 中如何解析Rss订阅的xml文件
  7. 调用android自带的截图工具进行截图
  8. Android的TCP Socket连接组件
  9. android ormlite 清空表
  10. android新手学习帮助网址