图像检索:一维直方图+欧几里得距离+flann+KNN
在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文件,分别存放了他们的颜色直方图信息
____________________________________________________________________________________________________________________________________
第三步:利用颜色卡的颜色直方图检索图像的颜色直方图
图像检索:一维直方图+欧几里得距离+flann+KNN的更多相关文章
- 图像检索:一维直方图+EMD距离
EMD距离具体介绍已经在在这里已经给出. 思路:我们把一张图像的归一化的一维直方图作为signature的权值,也就是一般在比較两幅图像颜色直方图的EMD距离时,每一行的坐标一样,仅仅是权重值不一样. ...
- 图像检索:RGBHistogram+欧几里得距离|卡方距离
RGBHistogram: 分别计算把彩色图像的三个通道R.G.B的一维直方图,然后把这三个通道的颜色直方图结合起来,就是颜色的描写叙述子RGBHistogram. 以下给出计算RGBHistogra ...
- Opencv Cookbook阅读笔记(四):用直方图统计像素
灰度直方图的定义 灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率). #include <open ...
- opencv直方图均衡化
#include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...
- 灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)
// HIstogram.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "opencv2/opencv.hpp ...
- 彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代
今天要给大家分享的是: 在彩色图像上进行Mean Shift迭代搜索目标 二维加权直方图+巴氏系数+Mean Shift迭代 关于 加权直方图.巴氏系数.Mean Shift迭代 这三者之间的关系请大 ...
- OPENCV直方图与匹配
直方图可以用来描述不同的参数和事物,如物体的色彩分布,物体的边缘梯度模版以及目标位置的当前假设的概率分布. 直方图就是对数据进行统计的一种方法,并且将统计值定义到一系列定义好的bin(组距)中,获得一 ...
- OpenCV实现灰度直方图和直方图拉伸
原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 如有疑问或者版权问题,请移步原作者或者告知本人. 灰度直方图是数字图像中最简 ...
- opencv 7 直方图与匹配
图像直方图概述 直方图的计算与绘制 计算直方图:calcHist()函数 找寻最值:minMaxLoc()函数 示例程序:绘制H-S直方图 #include "opencv2/highgui ...
随机推荐
- 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础
本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...
- 第二章 BIO与NIO
<netty权威指南>读书笔记 一.BIO 1.服务端程序: package bio; import java.io.BufferedReader; import java.io.IOEx ...
- go语言之进阶篇数组越界导致panic
1.数组越界导致panic 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaa ...
- CListCtrl 之右键菜单
在使用CListCtrl时要为它添加一个右键菜单,步骤如下: 1. 响应CListCtrl的NM_RCLICK消息. 2. 添加一个菜单资源,在菜单资源中插入要添加到菜单内容. 一般存在两种方法: ...
- iOS开发-音乐播放(AVAudioPlayer)
现在的手机的基本上没有人不停音乐的,我们无法想象在一个没有声音的世界里我们会过的怎么样,国内现在的主流的主流网易云音乐,QQ音乐,酷狗,虾米,天天基本上霸占了所有的用户群体,不过并没有妨碍大家对音乐的 ...
- C#开发winform程序的界面框架
首先创建一个“Windows应用程序”,默认的“Form1”文件修改为MainForm的窗体,作为程序的主窗体.从控件箱拖3个控件过来:MenuStrip.ToolStrip.StatusStrip. ...
- Mahout源码目录说明
http://www.cnblogs.com/dlts26/archive/2011/08/23/2150230.html mahout项目是由多个子项目组成的,各子项目分别位于源码的不同目录下,下面 ...
- IncrediBuild 2.40 过期时间
IncrediBuild 2.40的License有2个文件CoordLicense.dat和AgentLicense.dat,分别位于Coordinator和Agent安装目录下,这两个文件都是RS ...
- js文件流下载通用方法
通常我们会用到文件流下载文件,下面给大家一个通用的文件流下载的js /* *下载文件 * options:{ * url:'', //下载地址 * isNewWinOpen:false,是否新窗口打开 ...
- Python MySQLdb模块连接操作mysql数据库实例_python
mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法.python操作数据库需要安装一个第三方的模块,在http://mysql ...