图像的检索
一种是将图像的语义进行检索,即之间检索文字,这样就需要认为定义图片的关键字;
另一种是提取图像的底层特征,然后检索特性相近的图像。
在辅导本科生的毕业设计时,采用的是基于特征的图像检索。
下面是简单的基于颜色特征的检索,采用的库是来自:Corel5k数据集。数据源
(1)首先将图像分成2*2子块,每一块分别提取颜色特征3个分量r,g,b直方图,量化等级为8,,得到累积直方图,最后一个等级值为1,因此一个子块的特征为3*7=21个
(2)然后将每个子块与数据库中数据(训练好的,按照(1)中方法)求距离,
(3)根据投票法排序得到排名,显示。
其中将数据存在sql server2008中,一共23个列,包括r(0~7)g(0~7)b (0~7) imgKeyword imgPath
vc6.0连接·sql server使用的是ado连接方式。ado集成类
ADO连接有ODBC , OLEDB两种方式,主要用的OLEDB
其中ODBC需要提供数据源,oledb是采用统一的方式处理,效率更高些。
首先需要import“”ADO类; 然后初始化com;然后connection建立连接;
ado操作中主要有三个智能指针:Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录
其中分块注意
vector<IplImage *>m_img;
void split_img(string name)
{
IplImage* src=cvLoadImage(name.c_str(),3);
char *m_num=new char;
int num=0;
long img_width=src->width/SPLIT;
long img_height=src->height/SPLIT;
//实现图像分块
vector<IplImage*> m_image;
for (int i = 0; i < SPLIT;i++)//行
{
for (int j = 0; j < SPLIT; j++)//列
{
IplImage * temp=cvCloneImage(src);
CvRect rect;
rect.x=i *img_width;
rect.y= j *img_height;
rect.width= img_width;
rect.height=img_height;
cvSetImageROI(temp, rect);
IplImage* g=cvCreateImage(cvSize(rect.width,rect.height),temp->depth,temp->nChannels);
cvResize(temp,g,CV_INTER_LINEAR);
cvResetImageROI( temp);
m_image.push_back(g);//注意要有cvresize,不然g在存入后进行其他操作会出错,如果只是显示可以不用。直接g=temp;就可以
}
}
}
排序·:采用的multimap
multimap<double,CString>对每一个子块得到imgrank1 imgrank2 imgrank3 imgrank4
然后转为 multimap<CStirng,double > imgsearch1,imgsearch2,imgsearch3,imgsearch4
最后合并4个imgsearch,将CString相同的double相加。得到最后排序