在F盘生成了一个文件名称为“文件夹”的文本文件。
第一步:批处理提取图像的一维颜色直方图,并保存到.xml中的featureHists
第一个參数:图像的路径
第二个參数:保存的.xml
#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 hist1d(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 = hist1d(image);
        //按行存储每一幅图像的一维直方图特征
        featureHists.push_back(featureHist);
    }
    //注意一定要记得关闭文件流
    inPutFile.close();
    /*第五步。把图像特征保存到.xml文件里*/
    FileStorage fs(argv[2],FileStorage::WRITE);
    fs<<"featureHists"<<featureHists;
    fs.release();
    
    return 0;
}
Mat hist1d(const Mat& src)
{
    Mat hsv;
    //颜色空间的转换 BGR2HSV
    cvtColor(src,hsv,CV_BGR2HSV);
    //把H通道分为60个bin
    int hbins = 60;
    int histSize[] = { hbins };
    //H的取值范围 0-179
    float hranges[]= {0,180};
    const float* ranges [] ={hranges};
    Mat hist1D,histRow,histRowDst;
    //我们依据图像的第一通道。计算一维直方图,并且输出的hist1D为32F
    int channels [] ={0};
    calcHist(&hsv,1,channels,Mat(),hist1D,1,histSize,ranges,true,false);
    //把直方图特征按一行来存储
    histRow=hist1D.reshape(1,1);
    //把直方图归一化
    normalize(histRow,histRowDst,1,0,NORM_L1);
    return histRowDst;
}
编译完毕后,进入命令行
然后,在F盘出现了一个features的.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
	int hbins = 60;
	int histSize[] = { hbins };
	//H的取值范围 0-179
	float hranges[]= {0,180};
	
	const float* ranges [] ={hranges};
	Mat hist1D,histRow,histRowDst;
	//我们依据图像的第一通道,计算一维直方图,并且输出的hist1D为32F
	int channels [] ={0};
	calcHist(&hsv,1,channels,Mat(),hist1D,1,histSize,ranges,true,false);
	//把直方图特征按一行来存储
	histRow=hist1D.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;
}
分别各自提取他们的一维颜色直方图
然后,在F盘出现了四个.xml文件,分别存放了他们的颜色直方图信息
____________________________________________________________________________________________________________________________________
第三步:利用颜色卡的颜色直方图检索图像的颜色直方图
原文:http://www.cnblogs.com/gcczhongduan/p/5374621.html