Lire图片搜索示例(基于Lucene),lirelucene,import java.
分享于 点击 36697 次 点评:47
Lire图片搜索示例(基于Lucene),lirelucene,import java.
import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import javax.imageio.ImageIO;import net.semanticmetadata.lire.DocumentBuilder;import net.semanticmetadata.lire.DocumentBuilderFactory;import net.semanticmetadata.lire.ImageDuplicates;import net.semanticmetadata.lire.ImageSearchHits;import net.semanticmetadata.lire.ImageSearcher;import net.semanticmetadata.lire.ImageSearcherFactory;import org.apache.lucene.analysis.SimpleAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;import org.junit.Test;public class TestImageSearch { private static String INDEX_PATH = "F:/index";// 索引文件存放路径 //要索引的图片文件目录 private static String INDEX_FILE_PATH = "C:/image"; private static String SEARCH_FILE = "C:/x.jpg";//用于搜索的图片 @Test public void createIndex() throws Exception { //创建一个合适的文件生成器,Lire针对图像的多种属性有不同的生成器 DocumentBuilder db = DocumentBuilderFactory.getCEDDDocumentBuilder(); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_33, new SimpleAnalyzer(Version.LUCENE_33)); IndexWriter iw = new IndexWriter(FSDirectory.open(new File(INDEX_PATH)), iwc); File parent = new File(INDEX_FILE_PATH); for (File f : parent.listFiles()) { // 创建Lucene索引 Document doc = db.createDocument(new FileInputStream(f), f.getName()); // 将文件加入索引 iw.addDocument(doc); } iw.optimize(); iw.close(); } @Test public void searchSimilar() throws Exception { IndexReader ir = IndexReader.open(FSDirectory.open(new File(INDEX_PATH)));//打开索引 ImageSearcher is = ImageSearcherFactory.createDefaultSearcher();//创建一个图片搜索器 FileInputStream fis = new FileInputStream(SEARCH_FILE);//搜索图片源 BufferedImage bi = ImageIO.read(fis); ImageSearchHits ish = is.search(bi, ir);//根据上面提供的图片搜索相似的图片 for (int i = 0; i < 10; i++) {//显示前10条记录(根据匹配度排序) System.out.println(ish.score(i) + ": " + ish.doc(i).getFieldable(DocumentBuilder.FIELD_NAME_IDENTIFIER).stringValue()); } Document d = ish.doc(0);//匹配度最高的记录 ish = is.search(d, ir);// 从结果集中再搜索 for (int i = 0; i < 4; i++) { System.out.println(ish.score(i) + ": " + ish.doc(i).getFieldable(DocumentBuilder.FIELD_NAME_IDENTIFIER).stringValue()); } } @Test//测试前先将包含重复图片的文件进行索引 public void searchDuplicates() throws Exception { IndexReader ir = IndexReader.open(FSDirectory.open(new File(INDEX_PATH))); ImageSearcher is = ImageSearcherFactory.createDefaultSearcher(); ImageDuplicates id = is.findDuplicates(ir);//查找重复的图片,如果没有,则返回null for (int i = 0; id != null && i < id.length(); i++) { System.out.println(id.getDuplicate(i).toString()); } }}//该片段来自于http://byrx.net
用户点评