版权声明:个人学习之路,若有误,欢迎指正。其中一些博文被证明有错误的地方,最近比较忙,没时间更正,谨慎参考!! https://blog.csdn.net/y396397735/article/details/78386250
关于
自己业余时间搭建的一个基于LIRE的图像检索系统,可用于对图像检索研究领域的相关人员作为相关结果展示参考等。
简介
系统功能:
①点击客户端界面可对ImagesFolder文件目录下图像文件进行创建索引操作,默认设置为CEDD、PHOG等18种特征提取索引文件一次全部创建。
②创建索引后,选择本地一张图片,点击开始检索,会根据选择的相应的特征提取算法,检索出相应的最相似的60张照片(现默认设置为60张)。
系统设计
①服务端环境:JDK8,Eclipse Jee Oxygen
②客户端环境:Qt5.9.0
③通信方式:TCP socket通信
客户端发送请求相关部分代码:
void MainWindow::SendRequest(const QString& strAction, const QString& filepath, const QString& depends)
{
m_pSocket->connectToHost("127.0.0.1", 12345);
bool connected = m_pSocket->waitForConnected();// waitForConnected();
QString sendStr = strAction + "CSU" + filepath + "CSU" + depends + "CSU" + "\n";
if(connected)
{
m_pSocket->write(sendStr.toStdString().c_str(), sendStr.size());
m_pSocket->waitForBytesWritten();
}
}
客户端通过发送
strAction + "CSU" + filepath + "CSU" + depends + "CSU" + "\n"
字符串给服务端
strAction
表示为搜素或索引指令
filepath
表示为所选择的图像文件的路径
depends
表示为选择的图像特征提取算法
服务端处理部分代码:
BufferedWriter outbuf = new BufferedWriter(new OutputStreamWriter(tclient.getOutputStream()));
BufferedReader inbuf = new BufferedReader(new InputStreamReader (tclient.getInputStream()));
String recvMsg = inbuf.readLine();//读取接受客户端的数据
String[] recvDataStr = recvMsg.split("CSU");
// action 客户端请求类型
String action = recvDataStr[0];
//搜索请求
if(action.equals("SEARCH")){
String imgPath = recvDataStr[1];
String imgDepends = recvDataStr[2];
SearchDependsType searchDependsType;
switch (imgDepends) {
case "AutoColorCorrelogram":
searchDependsType = SearchDependsType.AutoColorCorrelogram;break;
//略..
default:
searchDependsType = SearchDependsType.CEDD;
break;
}
Searcher mySearcher = new Searcher();
//开始搜索,默认搜索60幅图像
mySearcher.DoSearch(imgPath, searchDependsType, 60);
String str = "";
for(int i=0; i< Searcher.imgList.size();i++){
str+=Searcher.imgList.get(i)+"CSU";
}
System.out.println("Send String is: " + str);
outbuf.write(str);
outbuf.close();
}else if(action.equals("INDEX")) { //索引请求
//建立索引文件
String imagePath="ImagesFolder";
Indexer myIndexer = new Indexer();
boolean isIndexover = myIndexer.IndexAll(imagePath);
if(isIndexover){
String str = "Index over!";
System.out.println(str);
outbuf.write(str);
outbuf.close();
}
}
tclient.close();
服务端根据不同请求作相应的索引或者检索处理。