0

我正在尝试制作一个 K 最近邻分类器来根据其色调颜色值识别对象。我有两个 CSV 文件,其中填充了两个单独对象的这些颜色值,每个对象包含大约 100 个样本。它们都被归一化为包含 40 个整数,用于描述该对象每行的平均颜色。我使用 K 值 10。

我的分类器总是返回标签“1”,即使我在准备作为训练数据的相同数据上使用它。当我查找函数返回的最近点时find_nearest,无论输入数据如何,我总是会看到相同的 10 个点:1、1、0、1、1、1、1、1、1、1。输入数据或学习数据似乎都有问题,但是当我检查CvMat*对象的内容时,它们都是应有的。

谁能在下面的代码中看到我做错了什么?我通常使用 c++ API,但我发现找到 k 最近邻居的示例更加困难。我已经检查了openCV和这个博客的例子

int dataArray[amountCategories_][amountSamples_][dataBandWidth_];
//Fill dataArray with data from csv files here (tested this and looks fine)

CvMat* trainData = cvCreateMat(amountCategories_ * amountSamples_, dataBandWidth_, CV_32FC1);
CvMat* trainClasses = cvCreateMat(amountCategories_ * amountSamples_, 1, CV_32FC1);

for (int categories = 0; categories < 2; categories++) {
    for (int samples = 0; samples < amountSamples_; samples++) {
        trainClasses->data.fl[samples] = categories;
        cout << samples << ": ";
        for (int datas = 0; datas < dataBandWidth_; datas++) {
          trainData->data.fl[samples * dataBandWidth_ + datas] = (float) dataArray[categories][samples][datas];
          cout << trainData->data.fl[samples * dataBandWidth_ + datas] << ", ";
        }
        cout << " and is type " << trainClasses->data.fl[samples] << endl;
    }
}

knn_.train(trainData, trainClasses);

要识别对象:

vector<int> lineColors;
//fill lineColors with integers of the hue value
CvMat *playerRow = cvCreateMat(1, 40, CV_32FC1);
CvMat* nearests = cvCreateMat(1, kValue_, CV_32FC1);
cout << "Input vals: ";
for (int c = 0; c < dataBandWidth_; c++) {
    playerRow->data.fl[c] = (float) lineColors.at(c);
    cout << playerRow->data.fl[c] << ", ";
}
cout << " " << endl;
float outcome = knn_.find_nearest(playerRow, kValue_, 0, 0, nearests, 0);
cout << "Type: " << outcome << endl;
4

0 回答 0