4

私は、画像のRGBヒストグラムを描画し、クエリ画像を使用して他の画像間の距離を計算するCBIR(コンテンツベースの画像検索)プロジェクトに取り組んでいます。

VS 2008 - MFC と OpenCV ライブラリを使用しています。距離を計算するために使用したかった方法はユークリッド距離(ED)ですが、なぜかうまくいきませんでした。

2 つのヒストグラム間の距離を計算するのに役立つ関数 cvCalcEMD2() を見つけました。この関数を使用するには、ヒストグラムの署名を作成する必要があります。

これは、私が見つけた署名を作成するための例です

For ループには、ヒストグラムを渡す必要がある行があります。

float bin_val = cvQueryHistValue_2D( hist1, h, s );

ヒストグラムの私の関数には、変数 h_bins や s_bins のようなものはありません

私のプログラムでは、ヒストグラムをR、G、Bに計算/描画します。つまり、各画像には3つのヒストグラムがあります。例: CvHistogram *hist_red, *hist_green, *hist_blue;

ヒストグラムを使用して署名を作成するにはどうすればよいですか?

* drawHistogram 関数へのリンクは、以下のコメントにあります

4

1 に答える 1

0

これは、プロジェクトでRGB hist署名を作成するためのコードです。私の場合、署名tuはfloatの配列である必要がありました。

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);
}
于 2011-01-27T09:38:13.127 に答える