我的项目是使用 OpenCV 库识别 Android 上的叶子。我使用ORB检测来获取图像的关键点并使用ORB描述符来获取关键点的特征。这是我使用的代码:
bmp=BitmapFactory.decodeResource(getResources(),R.drawable.t1);
Utils.bitmapToMat(bmp, mat);
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
detector.detect(mat, keypoints);
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
extractor.compute(mat, keypoints, features);
来源:http://answers.opencv.org/question/6260/orb-features/
但是每次我输入相同的图像,该图像的关键点总是不同的。如果总是不同,我可以将关键点的特征保存到数据库吗?或者我应该保存图像以保存特征数据?
如果可以保存到数据库,我该怎么做??
最佳答案
在我看来,存储关键点最通用的方法是首先将它们转换为像 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 - 如何将 OpenCV Keypoint 特征保存到数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21849938/