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文件
    在这里插入图片描述

  2. 进行.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();
  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. 运行结果:
    运行结果
    PS:在使用的时候,会发出一个错误,不影响运行结果。暂时不知道怎么解决,求告知。
    在这里插入图片描述
  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();
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_37378399/article/details/86709912
今日推荐