我目前正在尝试序列化/反序列化使用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_中 ]
我已尝试过解决方案here和here,但由于反序列化矩阵的维度总是错误,所以运气不佳。
如何从关键点数组重建CV_32FC1矩阵?
也许我只是忽略了一些愚蠢的东西,但任何意见都会非常感激!
答案 0 :(得分:0)
不是使用Json,而是可以直接使用Java原语。
使用/dashboard/
方法,您可以获得已填充的MatOfKeyPoint.get()
。然后使用float[]
,您可以遍历所有浮点数,最后使用ByteBuffer.putFloat()
获取已填充的byte[]
。
您还需要保存一些attirbutes ByteBuffer.array()
,MatOfKeyPoint.rows()
和MatOfKeyPoint.cols()
。
要重新构建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对象到原始概念。