图像检索:一维直方图+欧几里得距离+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 ...
随机推荐
- 标识符(IDentifier)
ylbtech-Miscellaneos:标识符(IDentifier) A,返回顶部 1, 标识符(IDentifier)是指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在日常生活 ...
- 开源3D软件——大集合【转】
要3D打印一件作品,自然少不了3D建模.以下是一些免费开源3D模型设计软件: Blender Blender是最受欢迎的免费开源3D模型制作软件套装. 跨平台支持所有的主要操作系统. 功能非常强大,但 ...
- CSS-返回顶部代码
现在的网站基本上都是长页面,多的有四五屏,少的话也有两三屏,页面太长有的时候为了提升用户体验,会在页面右边出现一个回到顶部的按钮,这样能快速回到顶部,以免在滑动页面出现视觉屏幕,回到顶部一般有四种方式 ...
- NLP--自然语言处理与机器学习会议
http://blog.csdn.net/ice110956/article/details/17090061 整理至11月中旬在重庆参加的自然语言处理与机器学习会议,第一讲为自然语言处理. 由基本理 ...
- ARM 汇编的mov操作立即数的疑问
1. 因为对arm汇编有些指令还不能理解,特别是一些相似功能指令间的区别.偶然在网上搜到"faq ARM assembly",其中描述的几个问题还是值得好好研究一下. 2. 慢慢的 ...
- mke2fs 制作ext2文件系统image
方法1: 利用/dev/ram1: linux下有很多ram,我们用ram1,首先把ram1格式化成ext2文件系统[root@gucuiwen babylinux]# sudo mkfs.ext ...
- MFC如何获取硬盘的序列号
要把如下的两篇文章结合起来看: qt怎么获取硬盘序列号,是不是没戏? http://www.qtcn.org/bbs/simple/?t65637.html system("wmic pat ...
- Tensorflow高速入门2--实现手写数字识别
Tensorflow高速入门2–实现手写数字识别 环境: 虚拟机ubuntun16.0.4 Tensorflow 版本号:0.12.0(仅使用cpu下) Tensorflow安装见: http://b ...
- Oracle数据表中输入引号等特殊字符
Oracle输入特殊字符的特殊方法: UPDATE BOOKMARK SET BM_VALUE=q'/ --在这里写下需要输入的内容(可以包括引号.回车等特殊的符号),所见即所得 /' -- WHER ...
- jQuery 超屏加载
jQuery 超屏加载,当文档超出屏幕的高度时,加载最新下个列数据 $(window).scroll(function () { var height = $(document).height(); ...