图像检索:二维直方图+flann+KNN+欧几里得距离

第一步:批处理提取图像库的二维直方图,并存在到.xml中的featureHists中

第一个参数:图像的路径 目录.txt

第二个参数:图像特征   features.xml

[保存到features.xml中featureHists]

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;

//计算二维直方图特征
Mat hist2d(const Mat& src);

int main(int argc,char* argv[])
{
	if(argc !=3)
	{
		cerr << "Wrong Argument !" <<endl;
		return -1;
	}
	//定义文件流,只能读取
	ifstream inPutFile(argv[1],ios::in);
	if(! inPutFile)
	{
		cerr << "File Open Erro !" <<endl;
		return -1;
	}
	//读取文件流中的每一行,并赋值给fileName,读取每一幅图像
	string fileName ;
	Mat image;
	Mat featureHist;
	Mat featureHists;
	while (getline(inPutFile,fileName))
	{

		image = imread(fileName,1);
		//计算二维直方图特征
		featureHist = hist2d(image);
		//按行存储每一幅图像的二维直方图特征
		featureHists.push_back(featureHist);
	}
    //注意一定要记得关闭文件流
	inPutFile.close();

	/*第五步,把图像特征保存到.xml文件中*/
	FileStorage fs(argv[2],FileStorage::WRITE);
	fs<<"featureHists"<<featureHists;
	fs.release();

	return 0;
}

Mat hist2d(const Mat& src)
{
	Mat hsv;

	//颜色空间的转换 BGR2HSV
	cvtColor(src,hsv,CV_BGR2HSV);

	//把H通道分为30个bin,把S通道分为32bin
	int hbins = 30;
	int sbins = 32;
	int histSize[] = { hbins , sbins};

	//H的取值范围 0-179
	float hranges[]= {0,180};
	//S的取值范围 0-255
	float sranges [] ={0,256};
	const float* ranges [] ={hranges,sranges};

	Mat hist2D,histRow,histRowDst;
	//我们根据图像的第一通道和第二通道,计算二维直方图,而且输出的hist2D为32F
	int channels [] ={0,1};
	calcHist(&hsv,1,channels,Mat(),hist2D,2,histSize,ranges,true,false);
	//把直方图特征按一行来存储
	histRow=hist2D.reshape(1,1);

	//把直方图归一化
	normalize(histRow,histRowDst,1,0,NORM_L1);

	return histRowDst;
}

第二步:提取查询图像的二维直方图特征,并保存到.xml中

第一个参数:查询图像的路径

第二个参数:保存查询图像特征的.xml的路径

第三个参数:特征的名字

#include<iostream>
#include<string>
using namespace std;
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(int argc,char* argv[])
{
	Mat src = imread(argv[1],1);
	if(! src.data)
	{
		cout <<"No Image" << endl;
		return -1;
	}

	Mat hsv;
	//颜色空间的转换BGR2HSV
	cvtColor(src,hsv,CV_BGR2HSV);

	//把H通道分为60个bin,S通道分为32个bin(可以修改)
	int hbins = 60;
	int sbins = 32;
	int histSize[] = { hbins ,sbins};

	//H的取值范围 0-179
	float hranges[]= {0,180};
	//S的取值范围 0-255
	float sranges[] = {0,256};

	const float* ranges [] ={hranges,sranges};
	Mat hist2D,histRow,histRowDst;
	//我们根据图像的第一和第二个通道,计算二维直方图,而且输出的hist2D为32F
	int channels [] ={0,1};
	calcHist(&hsv,1,channels,Mat(),hist2D,2,histSize,ranges,true,false);
	//把直方图特征按一行来存储
	histRow=hist2D.reshape(1,1);

	//把直方图归一化
	normalize(histRow,histRowDst,1,0,NORM_L1);
	FileStorage fs(argv[2],FileStorage::WRITE);
	//把histRowDst保存到.xml文件中
	fs << argv[3] << histRowDst;
	fs.release();
	return 0;
}

第三步:从图像库中用K-最近邻算法中,查找和查询图像相似的图片

#include<iostream>
using namespace std;

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\flann\flann.hpp>
using namespace cv;
int main(int argc,char* argv[])
{
	FileStorage dataBase(argv[1],FileStorage::READ);
	Mat features;
	dataBase["featureHists"]>>features;
	dataBase.release();
	FileStorage queryImage(argv[2],FileStorage::READ);
	Mat queryFeature;
	queryImage[argv[3]]>>queryFeature;
	queryImage.release();
	flann::Index fl(features,flann::KDTreeIndexParams(4));
	Mat index,distance;
	fl.knnSearch(queryFeature,index,distance,1);
	queryImage.release();
	return 0;
}

因为工作的需要把三部分分开了。

图像检索:二维直方图+flann+KNN+欧几里得距离

时间: 2024-10-12 11:30:08

图像检索:二维直方图+flann+KNN+欧几里得距离的相关文章

图像检索:二维直方图+EMD距离

#include<iostream> #include<fstream> #include<map> #include<string> using namespace std; #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> #include<opencv2\imgproc\imgproc.hpp> using namespace

matlab画二维直方图以及双y轴坐标如何修改另一边y轴的颜色

1.首先讲一下如何用hist画二维直方图 1 x=[-568179 -766698 -935586 -826865 -393971 -771826 -1529945 -1910695 -1694740 -926367 -306998 -844840 -1828334 -2062815 -2297296 -1498824 -411346 -827922 -1826636 -1844777 -1862918 -1881060 -746534 -100479 -845832 -1832756 -194

二维直方图及其比较

创建图像的HSV空间的H和S二维直方图并比较直方图相似度: 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> CvHistogram* Histogram2D(IplImage* src,int HSize,int SSize) { IplImage* SrcH=cvCreateImage(cvGetSize(src),8,

二维码扫码积分系统定制开发

微信积分系统 二维码扫码积分系统定制开发找丽姐[158.1816.6626/电微]二维码营销模式系统定制开发 微信扫二维码营销系统开发 扫码领积分系统开发 一.如何实现扫二维码领红包功能? 1.使用扫描二维码领取红包对活动进行设置,包括红包数量.红包金额.促销地区.中奖概率等. 2.将生成的二维码赋到商品上面并赋涂层,一方面可以起到保证二维码的一次性,另一方面也可以引起消费者的好奇心. 3.通过手机微信打开扫一扫,扫码商品二维码关注公众号并领取红包,如果参与分享还可以获得抽奖的机会. 二.微信扫

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops

家电二维码售后服务平台系统开发

家电二维码售后服务平台系统开发,家电二维码售后系统开发,小吴183.2071.6434微电,家电二维码售后软件开发,家电二维码售后平台开发. 互联网平台的节点有两大类型:第一基数节点,也就是弱连接的节点,其规模要大,越大越好,互联网的价值与节点数的平比成正比.第二活跃节点,也就是强连接的节点,其能量要强,越强越好,互联网的价值与其强度成正比. 一.家电维修行业"维修黑幕"层出不穷 记者从一位从事家电维修人士那里了解到,目前行业公认当前家电维修行业有陷阱,"维修黑幕"

微信小程序(4)--二维码窗口

微信小程序二维码窗口: <view class="btn" bindtap="powerDrawer" data-statu="open">button</view> <!--mask--> <view class="drawer_screen" bindtap="powerDrawer" data-statu="close" wx:if=&qu

微信服务器与项目服务器的交互(关注功能、微信扫描带参数二维码)

<?php /** * wechat php test */ //define your token define("TOKEN", "txtj"); $wechatObj = new wechatCallbackapiTest(); if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallback

14-高效求最长公共子序列(二维数组存不下)

/*                                   See LCS again时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述 There are A, B two sequences, the number of elements in the sequence is n.m; Each element in the sequence are different and less than 100000. Calculate the length