天天看點

Android OpenCV:讀取Matlab生成的.mat檔案并轉換成OpenCV的Mat對象

  1. 下載下傳讀取mat檔案需要用到的jar包:

    第一個jar包下載下傳位址:http://pan.baidu.com/s/1nuMMqvB

    第二個jar包下載下傳位址:https://github.com/ujmp/universal-java-matrix-package/releases/download/0.3.0/ujmp-complete-0.3.0.jar

    PS:該部分文章參考自lz3018的Java讀取mat檔案。

    Android OpenCV:讀取Matlab生成的.mat檔案并轉換成OpenCV的Mat對象
  2. 進行.mat檔案的讀取,并獲得對應的double類型的二維數組:

    在Matlab中導出一個[1 2; 3 4]的名字為t1.mat檔案(2*2 double),然後将檔案放到模拟器上。

    Android OpenCV:讀取Matlab生成的.mat檔案并轉換成OpenCV的Mat對象
    使用jmatio.jar中的類進行檔案的讀取:(PS:完整代碼請看5)
// 從指定的url中讀取mat檔案,如"/storage/emulated/0/Download/t1.mat"
MatFileReader matFileReader = new MatFileReader(url);

// MatFileReader中,資料存在matFileReader.data中,是以通過getContent()擷取資料
Map<String, MLArray> data = matFileReader.getContent();

// filename為在Matlab中導出的數組的名字,此為t1
MLArray mlArray = data.get(filename);

// 擷取數組行數和列數
int rows = mlArray.getM();
int cols = mlArray.getN();

// 進行類型的強制轉換
MLDouble mlDouble = (MLDouble)mlArray;

// 轉換為double類型的二維數組,主要用于後面的轉換為OpenCV的mat對象
double[][] doubles = mlDouble.getArray();
           
  1. 通過double類型的二維數組,獲得OpenCV的Mat對象:
int index = 0;
// Mat對象的初始化無法使用二維數組,是以需要将二維數組轉換成一維數組
 double[] doubleMat = new double[rows*cols];
 for(double[] a : doubles){
     for (double b : a) {
         doubleMat[index++] = b;
     }
 }

// mat對象的初始化
mat = new Mat(rows, cols, new MatOfDouble().type());
mat.put(0, 0, doubleMat);
           
  1. 運作結果:
    Android OpenCV:讀取Matlab生成的.mat檔案并轉換成OpenCV的Mat對象
    PS:在使用的時候,會發出一個錯誤,不影響運作結果。暫時不知道怎麼解決,求告知。
    Android OpenCV:讀取Matlab生成的.mat檔案并轉換成OpenCV的Mat對象
  2. 完整代碼:
/**
     * 根據位址加載double資料類型的mat檔案
     * @param url
     * @return mat
     */
    public static Mat loadDoubleMatFile(String url, String filename){
        Mat mat = null;
        try {
            MatFileReader matFileReader = new MatFileReader(url);
            Map<String, MLArray> data = matFileReader.getContent();
            MLArray mlArray = data.get(filename);
            int rows = mlArray.getM();
            int cols = mlArray.getN();

            MLDouble mlDouble = (MLDouble)mlArray;
            double[][] doubles = mlDouble.getArray();
            int index = 0;
            double[] doubleMat = new double[rows*cols];

            for(double[] a : doubles){
                for (double b : a) {
                    doubleMat[index++] = b;
                }
            }

            mat = new Mat(rows, cols, new MatOfDouble().type());
            mat.put(0, 0, doubleMat);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mat;
    }

// 對Mat對象進行輸出測試
    public static void printMat(Mat mat){
        for (int i=0; i<mat.rows(); i++){
            for (int j=0; j<mat.cols(); j++) {
                System.out.printf(mat.get(i, j)[0] + " ");
            }
            System.out.println();
        }
    }
           

繼續閱讀