我的项目是使用 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/

10-11 22:49
查看更多