基于java的相似图片搜索_JAVA基于图片相似性算法实现以图搜图样例

packagecom.dearcloud.imagesearch;importnet.semanticmetadata.lire.aggregators.AbstractAggregator;importnet.semanticmetadata.lire.aggregators.BOVW;importnet.semanticmetadata.lire.builders.DocumentBuilder;importnet.semanticmetadata.lire.imageanalysis.features.global.CEDD;importnet.semanticmetadata.lire.imageanalysis.features.local.opencvfeatures.CvSurfExtractor;importnet.semanticmetadata.lire.imageanalysis.features.local.simple.SimpleExtractor;importnet.semanticmetadata.lire.indexers.parallel.ParallelIndexer;importnet.semanticmetadata.lire.searchers.GenericFastImageSearcher;importnet.semanticmetadata.lire.searchers.ImageSearchHits;importnet.semanticmetadata.lire.searchers.ImageSearcher;importnet.semanticmetadata.lire.utils.FileUtils;importnet.semanticmetadata.lire.utils.ImageUtils;importorg.apache.lucene.index.DirectoryReader;importorg.apache.lucene.index.IndexReader;importorg.apache.lucene.store.FSDirectory;importjavax.imageio.ImageIO;importjava.io.File;importjava.io.IOException;importjava.nio.file.Paths;public classIndexingAndSearchWithLocalFeatures {public static void main(String[] args) throwsIOException {

String indexPath= "D:\\以图搜图\\衬衣\\index";

String imageData= "D:\\以图搜图\\衬衣\\Data";

indexer(indexPath, imageData);

String searchImage= "D:\\以图搜图\\衬衣\\search\\timg.jpg";

String searchOutputFolder= "D:\\以图搜图\\衬衣\\output";

search(indexPath, searchImage, searchOutputFolder);

}/*** Indexing data using OpenCV and SURF as well as CEDD and SIMPLE.

*@paramindexFolder

*@paramimageDirectory*/

private static voidindexer(String indexFolder, String imageDirectory) {//Checking if arg[0] is there and if it is a directory.

boolean passed = false;//use ParallelIndexer to index all photos from args[0] into "index".

int numOfDocsForVocabulary = 500;

Class extends AbstractAggregator> aggregator = BOVW.class;int[] numOfClusters = new int[]{128};

ParallelIndexer indexer= newParallelIndexer(DocumentBuilder.NUM_OF_THREADS, indexFolder, imageDirectory, numOfClusters, numOfDocsForVocabulary, aggregator);

indexer.setImagePreprocessor(image->ImageUtils.createWorkingCopy(image));//Local

indexer.addExtractor(CvSurfExtractor.class);//Simple

indexer.addExtractor(CEDD.class, SimpleExtractor.KeypointDetector.CVSURF);

indexer.run();

System.out.println("Finished indexing.");

}/*** Linear search on the indexed data.

*@paramindexPath

*@throwsIOException*/

public static void search(String indexPath, String searchFile, String searchOutputFolder) throwsIOException {

IndexReader reader=DirectoryReader.open(FSDirectory.open(Paths.get(indexPath)));//make sure that this matches what you used for indexing (see below) ...

ImageSearcher imgSearcher = new GenericFastImageSearcher(1000, CEDD.class, SimpleExtractor.KeypointDetector.CVSURF, new BOVW(), 128, true, reader, indexPath + ".config");//just a static example with a given image.

ImageSearchHits hits = imgSearcher.search(ImageIO.read(newFile(searchFile)), reader);for (int i = 0; i < hits.length(); i++) {double score =hits.score(i);

String imagePath= reader.document(hits.documentID(i)).getValues(DocumentBuilder.FIELD_NAME_IDENTIFIER)[0];

System.out.printf("%.2f: (%d) %s\n", score, hits.documentID(i), imagePath);

}

String outputHtmlReport= FileUtils.saveImageResultsToHtml("search-", hits, searchFile, reader);

System.out.println("Report:" +outputHtmlReport);

org.apache.commons.io.FileUtils.copyFile(org.apache.commons.io.FileUtils.getFile(outputHtmlReport), org.apache.commons.io.FileUtils.getFile(searchOutputFolder, outputHtmlReport));

}

}

你可能感兴趣的:(基于java的相似图片搜索)