-
下载读取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对象 -
进行.mat文件的读取,并获得对应的double类型的二维数组:
在Matlab中导出一个[1 2; 3 4]的名字为t1.mat文件(2*2 double),然后将文件放到模拟器上。
使用jmatio.jar中的类进行文件的读取:(PS:完整代码请看5)Android OpenCV:读取Matlab生成的.mat文件并转换成OpenCV的Mat对象
// 从指定的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:在使用的时候,会发出一个错误,不影响运行结果。暂时不知道怎么解决,求告知。
Android OpenCV:读取Matlab生成的.mat文件并转换成OpenCV的Mat对象 Android OpenCV:读取Matlab生成的.mat文件并转换成OpenCV的Mat对象 - 完整代码:
/**
* 根据地址加载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();
}
}