0

我想训练一个神经网络来对不同类别的灰度图像进行分类。

作为该网络的输入,我想使用 SURF-128 算法提取的特征。以下代码(EmguCV library 提供的示例的简化)显示了我如何使用 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");

我可以保存一些结果。下图显示了上面的代码提取了不同大小的特征(右边是上一行代码保存的结果):

图像测试

我想要的是获得一个固定大小的向量。

如何使用 EmguCV 库为 C# 提供的 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 回答