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

标签 java android opencv matrix feature-descriptor

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

相关文章:

java - JTree选择问题

android - jar 不匹配!修复使用 appcompat_v7 和 Facebook sdk 时的依赖关系。

java - 通过音调生成创建听力测试 Android 应用程序

opencv - 频域滤波opencv c++?

java - REST Web 应用程序中的 Spring 3 MVC 示例在哪里下载?

java - 如何全局忽略带有 restesy 响应的空字段?

java - Android:屏幕旋转后 Activity 方向并不总是改变

python - 使用 iPhone 加速度计数据获取图像的俯 View

java - 如何在运行时更改 JavaCameraView 的 maxFrameSize

java - 每个 recyclerview 项目内的可点击字符串数组项目