OpenCV - Java:使用descriptorMatcher序列化/反序列化MatofKeypoint类型描述符

时间:2016-06-23 15:30:23

标签: java opencv serialization mat

我目前正在尝试序列化/反序列化使用descriptorMatcher.compute()函数找到的描述符。我正在使用Gson的toJson和fromJason来进行序列化。

    MatOfKeyPoint kpFeatures = new MatOfKeyPoint();
    MatOfKeyPoint kpDescriptor = new MatOfKeyPoint();

    featureDetector.detect(sampleMat, kpFeatures);
    descriptorExtractor.compute(sampleMat, kpFeatures, kpDescriptor);

    //Serializing and deserializing the descriptors.
    //First convert the MatOfKeyPoint to an array for storage
    String serDescriptors = gson.toJson(kpDescriptor.toArray());
    MatOfKeyPoint deserDescriptors = new MatOfKeyPoint(gson.fromJson(serDescriptors, KeyPoint[].class));

    System.out.println("Original keypoint matrix: ");
    System.out.println(kpDescriptor);
    System.out.println("Deserialized keypoint matrix: ");
    System.out.println(deserDescriptors);

我得到的输出是:

Original keypoint matrix: 
Mat [ 1311*64*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa30c010, dataAddr=0xa691660 ]
Deserialized keypoint matrix: 
Mat [ 83904*1*CV_32FC(7), isCont=true, isSubmat=false, nativeObj=0xa39b600, dataAddr=0x2b363a24d020 ]

我认为矩阵没有正确反序列化,因此运行descriptorMatcher.compute()会返回以下错误:

  

OpenCV错误:不支持的格式或格式组合(type = 53   )在buildIndex_中,文件/local/p4clients/pkgbuild-P1uGN/workspace/src/Opencv/build/private/src/modules/flann/src/miniflann.cpp,第315行   线程“main”中的异常CvException [org.opencv.core.CvException:cv ::异常:/ local / p4clients / pkgbuild-P1uGN / workspace / src / Opencv / build / private / src / modules / flann / src / miniflann。 cpp:315:错误:( - 210)type = 53    在函数buildIndex_中   ]

我已尝试过解决方案herehere,但由于反序列化矩阵的维度总是错误,所以运气不佳。

如何从关键点数组重建CV_32FC1矩阵?

也许我只是忽略了一些愚蠢的东西,但任何意见都会非常感激!

1 个答案:

答案 0 :(得分:0)

不是使用Json,而是可以直接使用Java原语。

MatOfKeyPoint浮动[]或甚至是byte []

使用/dashboard/方法,您可以获得已填充的MatOfKeyPoint.get()。然后使用float[],您可以遍历所有浮点数,最后使用ByteBuffer.putFloat()获取已填充的byte[]

您还需要保存一些attirbutes ByteBuffer.array()MatOfKeyPoint.rows()MatOfKeyPoint.cols()

float []或byte []到MatOfKeyPoint

要重新构建MatOfKeyPoint.type()对象,如果您来自MatOfKeyPoint,首先使用byte[] ByteBuffer.asFloatBuffer(){{float[]来制作ByteBuffer.wrap(blob), then run 1}} float [] . If you're creating from FloatBuffer.get(), use float []`object。

现在您已with a properly sized new empty运行yourFloatArray,这是您之前需要保存的三件事。最后,您运行MatOfKeyPoint.create(rows, cols, type)

有一个完整的Android解决方案,其中包含可在this StackOverflow Answer中找到的Java代码。它比你的问题更进一步,因为它涉及如何将对象存储在数据库中,但是演示了OpenCv Mat对象到原始概念。