Hipi相关操作,文件搜索部分

这块的代码很丑,很丑,,

丑的我自己都不好意思拿出来。。。。


因为官方文档没有提供相应的列子,或者是走的hadoop本身的map机制

我不想用hadoop,想自己沿着思路写一个,于是有了以下这段很丑很丑的代码。。

只是个思路,不要用于实际开发了。因为真的很慢。。。



import hipi.image.FloatImage;
import hipi.image.ImageHeader;
import hipi.image.io.JPEGImageUtil;
import hipi.imagebundle.HipiImageBundle;
import hipi.util.ByteUtils;


import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


import javax.imageio.ImageIO;




import net.semanticmetadata.lire.ImageSearchHits;
import net.semanticmetadata.lire.ImageSearcher;
import net.semanticmetadata.lire.impl.GenericFastImageSearcher;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.solr.store.hdfs.HdfsDirectory;
import org.mortbay.log.Log;


import com.cee.common.SysParameter;
public class DonloadInfo extends HipiImageBundle {


 


/**


 * @param file_path


 * @param conf
 * @throws Exception 


 */


public DonloadInfo(Path file_path, Configuration conf) throws Exception {
super(file_path, conf);
try {


//开启模式

this.openForRead();
int i=0;
int k=1;
String imageSeacher2file = SysParameter.getParameter("imageSeacher2file");
ArrayList<String> list = (ArrayList<String>) this.getList(conf);
while (this.hasNext()) {
FileOutputStream out =null;
 ImageHeader imageHeader = this.next();
 FloatImage floatimage = this.readImage();
 
 if (floatimage==null||imageHeader==null)

continue;
}
String hashval = ByteUtils.asHex(ByteUtils.FloatArraytoByteArray(floatimage.getData()));
System.out.print(" 本次图片的hash:"+ hashval);


if(list.contains(hashval)){
if(k>list.size()){
break;
}
int  j = list.indexOf(hashval);
if(j<(list.size()-1)&&list.get(j).equals(list.get(j+1))){
  j=j+i;i++;
}else{
i=0;
}
System.out.println("          对比成功,为相似图片,第"+j+"张图片打印中。。。");
out = new FileOutputStream(imageSeacher2file+"\\a"+(j+1)+".jpg");
JPEGImageUtil.getInstance().encodeImage(floatimage, imageHeader, out);
out.flush();
out.close();
k++;
}else{
System.out.println(" 不是相似图片,略过。");
}
}


this.close();


} catch (IOException e) {
e.printStackTrace();
}
}

//判定有多少张相同的图片,从服务器端返回所有相似图片的hash值的集合。

public List<String> getList(Configuration conf) throws Exception{
String imagePath = SysParameter.getParameter("imageSeacherfile")+"//1.jpg";
String images = SysParameter.getParameter("images");
ImageSearchHits _hits = this.searchImage(imagePath, conf.get("fs.defaultFS"), "/hadoop/index", images,"FCTH");
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < _hits.length(); i++)
{
String fileName = _hits.doc(i).getValues("descriptorImageIdentifier")[0];
System.out.println("返回相近图片的hash值:"+fileName);

list.add(fileName);
}
return list;
}

//params 搜索的文件的绝对路径    服务器hadoop地址  索引地址  返回的结果数量  搜索用到的类型。

public ImageSearchHits searchImage(String imgFilePath, String hdfsValue, String lireIndexDir, String resultNum, String searchType)
throws IOException
{

BufferedImage img = null;
if (imgFilePath.length() > 0)
{
File f = new File(imgFilePath);
img = ImageIO.read(f);

}
Configuration conf = new Configuration();
conf.set("fs.defaultFS", hdfsValue);
Path path = new Path((new StringBuilder(String.valueOf(hdfsValue))).append(lireIndexDir).toString());
HdfsDirectory directory = new HdfsDirectory(path, conf);
IndexReader ir = DirectoryReader.open(directory);
ImageSearcher searcher = getSearcher(Integer.parseInt(resultNum), searchType);
ImageSearchHits hits = searcher.search(img, ir);
ir.close();
return hits;
}


private ImageSearcher getSearcher(int resultNum, String searchType)
{
ImageSearcher searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.FCTH.class);
if (searchType.equals("AutoColorCorrelogram"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.AutoColorCorrelogram.class);
else
if (searchType.equals("CEDD"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.CEDD.class);
else
if (searchType.equals("ColorLayout"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.ColorLayout.class);
else
if (searchType.equals("EdgeHistogram"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.EdgeHistogram.class);
else
if (searchType.equals("FCTH"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.FCTH.class);
else
if (searchType.equals("Gabor"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.Gabor.class);
else
if (searchType.equals("ScalableColor"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.ScalableColor.class);
else
if (searchType.equals("SimpleColorHistogram"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.SimpleColorHistogram.class);
else
if (searchType.equals("Tamura"))
searcher = new GenericFastImageSearcher(resultNum, net.semanticmetadata.lire.imageanalysis.Tamura.class);
return searcher;
}

}

这些参数都是写在配置文件里的 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值