Android中用opencv處理圖片

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是引入的動態庫包路徑。
Android中用opencv處理圖片
其中配置文件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();
相關文章
相關標籤/搜索