gpt4 book ai didi

android - 使用 OpenCV4Android (java API) 保存 ORB 特征向量

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:54:55 25 4
gpt4 key购买 nike

我有一组训练图像,我对每张图像都进行了 detectedcomputed它们的特征向量(使用 ORB 特征描述符和提取器。问题是:因为我需要保存这些特征以重新利用它们来匹配测试图像(使用 SVM 分类器);什么是最好的在 Android 设备上本地存储特征向量的方法?

每个图像要保存的特征向量的大小是可变的,因此具有非最大大小的特征向量用零填充以统一所有向量的大小。当前最大尺寸为 500 行 x 32 列;因此有 16k 个特征。

这是我目前可以达到的选项;

  • 我听说过 OpenCV 的 FileStorage ,但是在浏览 java 文档时,我注意到 HOG featuressave 方法(不是 ORB)。此外,考虑到 xml 文件太大而无法加载,我不确定使用 OpenCV 的文件存储选项保存功能是否是 Android 手机的最佳内存选择。
  • 我目前的选择是选择一个 sqlLite 数据库,它有一个包含两个列的表; id 和 feature(如网上经常建议的那样);列出 sqlLite 中的所有 16k 功能。这似乎相当占用手机存储空间,但这是我能找到的最合理的解决方案。

在 Android 手机上是否有处理特征向量的通用方法?它是否包含上述任何方法;如果不能,请提供一些关于如何实现此类存储解决方案的指南?

谢谢。

最佳答案

在我看来,存储关键点最通用的方法是首先将它们转换为数据交换格式,如 JSON。

在您能够进行转换后,您可以非常灵活地存储它。 JSON 很容易转换为字符串和/或通过网络连接发送。

使用 OpenCV C++ you are able to store data as YAML ,但这还不适用于 Android。

要在 Java 中解析 JSON,您可以使用这个易于使用的 library Google GSON .

这是我第一次尝试这样做:

 public static String keypointsToJson(MatOfKeyPoint mat){
if(mat!=null && !mat.empty()){
Gson gson = new Gson();

JsonArray jsonArr = new JsonArray();

KeyPoint[] array = mat.toArray();
for(int i=0; i<array.length; i++){
KeyPoint kp = array[i];

JsonObject obj = new JsonObject();

obj.addProperty("class_id", kp.class_id);
obj.addProperty("x", kp.pt.x);
obj.addProperty("y", kp.pt.y);
obj.addProperty("size", kp.size);
obj.addProperty("angle", kp.angle);
obj.addProperty("octave", kp.octave);
obj.addProperty("response", kp.response);

jsonArr.add(obj);
}

String json = gson.toJson(jsonArr);

return json;
}
return "{}";
}

public static MatOfKeyPoint keypointsFromJson(String json){
MatOfKeyPoint result = new MatOfKeyPoint();

JsonParser parser = new JsonParser();
JsonArray jsonArr = parser.parse(json).getAsJsonArray();

int size = jsonArr.size();

KeyPoint[] kpArray = new KeyPoint[size];

for(int i=0; i<size; i++){
KeyPoint kp = new KeyPoint();

JsonObject obj = (JsonObject) jsonArr.get(i);

Point point = new Point(
obj.get("x").getAsDouble(),
obj.get("y").getAsDouble()
);

kp.pt = point;
kp.class_id = obj.get("class_id").getAsInt();
kp.size = obj.get("size").getAsFloat();
kp.angle = obj.get("angle").getAsFloat();
kp.octave = obj.get("octave").getAsInt();
kp.response = obj.get("response").getAsFloat();

kpArray[i] = kp;
}

result.fromArray(kpArray);

return result;
}

关于android - 使用 OpenCV4Android (java API) 保存 ORB 特征向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15271411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com