0

さまざまなクラスのグレースケール画像を分類するために、ニューラル ネットワークをトレーニングしたいと考えています。

このネットワークの入力として、SURF-128 アルゴリズムによって抽出された特徴を使用したいと考えています。次のコード ( EmguCV ライブラリで提供される例の簡略化) は、API の使用方法を示しています。

SURFDetector surfCPU = new SURFDetector(500, true);
VectorOfKeyPoint observedKeyPoints;

BriefDescriptorExtractor descriptor = new BriefDescriptorExtractor();

observedKeyPoints = surfCPU.DetectKeyPointsRaw(img, null);
Matrix<Byte> observedDescriptors = descriptor.ComputeDescriptorsRaw(img, null, observedKeyPoints);

次のコードを使用します。

observedDescriptors.Save(@"SURF.bmp");

いくつかの結果を保存できます。次の画像は、上記のコードがさまざまなサイズの特徴を抽出することを示しています (右側には、前のコード行で保存された結果があります)。

画像テスト

私が欲しいのは、固定サイズのベクトルを取得することです。

C# 用の EmguCV ライブラリが提供する API を使用して、一般的なグレースケール画像を 128 次元配列に変換するにはどうすればよいですか?

4

1 に答える 1

0

問題が解決しました。

グレースケール画像を表す 128 次元の配列を取得するために、固定キー ポイント (画像の中心など) に関連する特徴が格納されています。次のコードを使用しました。

SURFDetector surfCPU = new SURFDetector(400, true);

float x = 30, y = 50; //KeyPoint position
float kpSize = 20;    //KeyPoint size

MKeyPoint[] keyPoints = new MKeyPoint[1];
keyPoints[0] = newMKeyPoint(x, y, kpSize); //This method is written below

ImageFeature<float>[] features = surfCPU.ComputeDescriptors<float>(img, null, keyPoints);

float[] array_of_128_elements = features[0].Descriptor;

private static MKeyPoint newMKeyPoint(float x, float y, float size)
{
    MKeyPoint res = new MKeyPoint();
    res.Size = size;
    res.Point = new PointF(x, y);
    //res.Octave = 0;
    //res.Angle = -1;
    //res.Response = 0;
    //res.ClassId = -1;

    return res;
}
于 2013-04-15T15:21:35.903 に答える