有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将opencv矩阵转换为字符串以存储在Android(Java)数据库中的最佳方法

我想将随机OpenCV描述符提取器生成的描述符矩阵存储为数据库实体

假设desc是描述符矩阵

String s = (desc.reshape(1,1)).dump;

为了从数据库中获取矩阵,我做了

Mat desc = new Mat(numberOfRows * numberOfCols * numberOfChannels, 1, type);
/* I stored number of rows and number of cols and type of the matrix separately and pass them to the function that returns the matrix */
String ss[] = s.substring(1, s.length -1).split(", ");
int[] temp = new int[sss.length ];
for(int i = 0; i < sss.length; i++) temp [i] = Integer.parseInt(sss[i]);
MatOfInt int_values = new MatOfInt(temp);
int_values.convertTo(desc, type);
desc = fingerprint.desc(numberOfChannels, numberOfRows);

这很好,但需要很多时间,尤其是在。split方法和涉及parseInt的循环,因为矩阵中有大量元素(在我的例子中大约是100k)

我的问题是:有没有更好的方法

我的第二个问题是,分配一个100K长的字符串数组并对其进行解析(考虑到字符串实际上最多为2-3个字符)不应该真正花费2秒钟,是因为Android/Java很慢吗


共 (2) 个答案

  1. # 1 楼答案

    好的,我找到了一个类似于Kiran提到的Berak的解决方案。我的尝试不太一般,但对描述符矩阵很好,速度很快,不涉及jni

            // for writing
            MatOfByte bytes = new MatOfByte(desc.reshape(1, nrows * ncols * nchannels));
            byte[] bytes_ = bytes.toArray();
    
            String s = Base64.encodeToString(bytes_, Base64.DEFAULT);
    
    
            // for reading
            byte[] bytes_ = Base64.decode(s, Base64.DEFAULT);
            MatOfByte bytes = new MatOfByte(bytes_);
            Mat desc  = new Mat(nrows * ncols * nchannels, 1, type);
            bytes.convertTo(desc, type);
    
            desc = desc.reshape(nchannels, nrows);
    
  2. # 2 楼答案

    OpenCV为持久性提供了FileStorage类,如link。基本上Mat图像可以保存为XML/YAML文件,稍后我们可以从中读取。下面是一个简单的例子

    //for writing
    cv::FileStorage store(“save.yml", cv::FileStorage::WRITE);
    store << “mat” << img;
    store.release();
    
    //for reading
    cv::FileStorage store(“save.yml", cv::FileStorage::READ);
    store[“mat”] >> img;
    store.release();
    

    但是我们在Android中没有FileStoragejava包装器。另一种方法是通过JNI调用上述代码,就像在这个example中那样,或者更好——检查Berak的sample