我正在使用CBIR(基于内容的图像检索)项目,该项目将绘制图像的RGB直方图,并计算其他图像与查询图像之间的距离。
我正在使用VS 2008 - MFC和OpenCV库。我想用来计算距离的方法是欧几里德距离(ED),但不知怎的,我没有解决它。
我找到了一个函数--cvCalcEMD2(),可以帮我计算两个直方图之间的距离。 要使用此功能,我需要为直方图创建签名。
这是我找到的example for creating signature
在For循环中,有一行我需要在直方图中传递:float bin_val = cvQueryHistValue_2D(hist1,h,s);
在我的直方图函数中没有类似变量h_bins和savesins
的东西在我的程序中,我将直方图计算/绘制为R,G和B. 意思是,每个图像我都有3个直方图。 例如:CvHistogram * hist_red,* hist_green,* hist_blue;
如何使用直方图创建签名?
*我的drawHistogram功能的链接在我的评论下面
答案 0 :(得分:0)
这是我在项目中创建RGB hist签名的代码: 在我的情况下,我需要签名tu是一个花车阵列。
void makeColorSign(const IplImage* img,float** colorSign) {
unsigned int* N = Params::colorSignSize;
float* sign = (float*)malloc(N[0]*N[1]*3*sizeof(float));
IplImage* s = cvCreateImage(cvSize(N[0],N[1]),img->depth,img->nChannels);
cvResize(img,s,CV_INTER_NN);
RgbImage rgb(s);
for(unsigned int y=0; y<N[1]; ++y) {
for(unsigned int x=0; x<N[0]; ++x) {
unsigned int coord = (y*N[1]+x)*3;
sign[coord] = rgb[y][x].r;
sign[coord+1] = rgb[y][x].g;
sign[coord+2] = rgb[y][x].b;
}
}
*colorSign = sign;
cvReleaseImage(&s);
}