在阅读了无数的文档并试图理解有关opencv/javacv提取关键点的示例之后,使用一些DescriptorExtractor计算特征以将输入图像与一堆图像进行匹配,以查看输入图像是其中之一还是其中之一的一部分,我认为,我们应该在计算后存储Mat对象。
我将使用Emily Webb'的代码作为示例:
String smallUrl =“rsz_our-mobile-planet-us-infographic_infographics_lg_unerela.jpg”; String largeUrl =“our-mobile-planet-us-infographic_infographics_lg.jpg”;
IplImage image = cvLoadImage(largeUrl,CV_LOAD_IMAGE_UNCHANGED );
IplImage image2 = cvLoadImage(smallUrl,CV_LOAD_IMAGE_UNCHANGED );
CvMat descriptorsA = new CvMat(null);
CvMat descriptorsB = new CvMat(null);
final FastFeatureDetector ffd = new FastFeatureDetector(40, true);
final KeyPoint keyPoints = new KeyPoint();
final KeyPoint keyPoints2 = new KeyPoint();
ffd.detect(image, keyPoints, null);
ffd.detect(image2, keyPoints2, null);
System.out.println("keyPoints.size() : "+keyPoints.size());
System.out.println("keyPoints2.size() : "+keyPoints2.size());
// BRISK extractor = new BRISK();
//BriefDescriptorExtractor extractor = new BriefDescriptorExtractor();
FREAK extractor = new FREAK();
extractor.compute(image, keyPoints, descriptorsA);
extractor.compute(image2, keyPoints2, descriptorsB);
System.out.println("descriptorsA.size() : "+descriptorsA.size());
System.out.println("descriptorsB.size() : "+descriptorsB.size());
DMatch dmatch = new DMatch();
//FlannBasedMatcher matcher = new FlannBasedMatcher();
//DescriptorMatcher matcher = new DescriptorMatcher();
BFMatcher matcher = new BFMatcher();
matcher.match(descriptorsA, descriptorsB, dmatch, null);
System.out.println(dmatch.capacity());
字符串
我的问题是:我如何在DB中存储mptorsA(或mptorsB)--在opencv的java实现中-?(它们是在extractor.compute(image,keyPoints,mptorsA)之后获得的Mat对象;)
我知道Mat对象在Java实现中不是可序列化的对象,但可以肯定的是,如果你想将一个图像与一组存档图像相匹配,你必须提取存档的描述符并将它们存储在某个地方以供功能使用。
4条答案
按热度按时间vecaoik11#
经过一些更多的搜索,我发现一些链接在http://answers.opencv.org/question/8873/best-way-to-store-a-mat-object-in-android/
虽然答案主要针对Android设备,并参考了之前关于保存关键点(Saving ORB feature vectors using OpenCV4Android (java API))的问题,但下面代码中的答案“从Mat对象到xml和xml到Mat对象”似乎是有效的:
字符串
gt0wga4j2#
由于Thorben提出的代码在我的情况下很慢,我使用序列化提出了以下代码。
字符串
对于描述符你OpenCV使用垫的浮动,在其他情况下,你必须相应地修改代码这个列表中找到here:
型
35g0bw713#
搜索完所有的答案后,我编辑了一些代码,它似乎工作。我用它来存储筛选描述符到HBase。
字符串
qnakjoqk4#
我还遇到了Javaorg.opencv没有原生OpenCV的FileStorage功能的问题。
字符串
存储的文件看起来像这样:
型