2

我想将随机 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 很慢

4

2 回答 2

3

OpenCV 提供FileStorage了持久性类,如链接。基本上,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 调用上述代码,或者甚至更好 - 检查 Berak 的示例

于 2014-12-12T04:59:38.510 回答
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);
于 2014-12-12T22:28:01.163 回答