1、opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,能够运行在Linux、Windows、Android和Mac OS操做系统上。它轻量级并且高效——由一系列 C 函数和少许 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的不少通用算法。
OpenCV用C++语言编写,它具备C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 现在也提供对于C#、Ch、Ruby,GO的支持。
opencv官方下载请添加连接描述
我下载的是opencv-4.4.0-android-sdkjava
2、加载编译
先建立个Android工程,而后File-New-Import Module,导入咱们下载好的sdk中的.\sdk\java路径,而后将.\sdk\native\libs下的动态库so包引入到lib下。
此时编译总是报错,缺乏一个libc++_shared.so的包,网上找到并引入,编译成功。
工程目录以下,opencv即导入的module,jniLibs是引入的动态库包路径。
其中配置文件build.grdle(:app)中
defaultConfig中加入配置以下,主要是为了解决上面说的编译时缺乏libc++_shared.so包的问题。网上找到的解释是,由于版本差别,libopencv_java4中没有这个so包,因此要编译时伪装编译出了咱们放在libb目录下的libc++_shared.so。android
ndk{ abiFilters "armeabi ","armeabi-v7a" }
调用的主activity中加载opencvc++
@Override protected void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback); } else { Log.d(TAG, "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } //openCV4Android 须要加载用到 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this); } break; default: { super.onManagerConnected(status); } break; } } };
3、图片缩放web
final String oldPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.jpg"; final String newPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_new.jpg"; double scale = 0.1; // 缩放比例 long start = new Date().getTime(); Mat img = Imgcodecs.imread(oldPath);// 读入图片,将其转换为Mat Size dsize = new Size(img.width() * scale, img.height() * scale); // 设置新图片的大小 Mat img2 = new Mat(dsize, CvType.CV_16S);// 建立一个新的Mat(opencv的矩阵数据类型) Imgproc.resize(img, img2,dsize);//调用Imgproc的Resize方法,进行图片缩放 if(Imgcodecs.imwrite(newPath, img2)){//将图形保存到new.jpg中 File f = new File(newPath); if(f.exists()) { bm=BitmapFactory.decodeFile(newPath); imgview.setImageBitmap(bm); long end = new Date().getTime(); Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start)); Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 3).show(); } } else{ Toast.makeText(ButtonSizeImage.this, "===========图片缩小失败============!!", 3).show(); }
4、图片转格式算法
final String webpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.webp"; final String newWebpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_2.jpg"; long start = new Date().getTime(); Mat img = Imgcodecs.imread(webpPath);// 读入图片,将其转换为Mat Imgcodecs.imwrite(newWebpPath, img); Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start)); Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 4).show();