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();