我想将随机 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很慢
最佳答案
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 中没有 FileStorage
java 包装器。另一种方法是通过 JNI 调用上面的代码,如 example 所示。甚至更好 - 检查 Berak 的 sample .
关于java - 在Android(Java)中将opencv矩阵转换为字符串以存储在数据库中的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433261/