-
下載下傳讀取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檔案。
-
進行.mat檔案的讀取,并獲得對應的double類型的二維數組:
在Matlab中導出一個[1 2; 3 4]的名字為t1.mat檔案(2*2 double),然後将檔案放到模拟器上。
使用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();
- 通過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);
- 運作結果: PS:在使用的時候,會發出一個錯誤,不影響運作結果。暫時不知道怎麼解決,求告知。
- 完整代碼:
/**
* 根據位址加載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();
}
}