-1

我正在尝试通过论坛的帮助代码来实现 KNN 算法。代码如下。

#include <opencv\cv.h>
#include <opencv\ml.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>


using namespace std;
using namespace cv;

//typedef unsigned char BYTE;

int readFlippedInteger(FILE *);

int main()
{
    FILE *fp = fopen("D:\\KNN\\train-images.idx3-ubyte", "rb");
        FILE *fp2 = fopen("D:\\KNN\\train-labels.idx1-ubyte", "rb");

    if(!fp || !fp2)
    {
        cout<<"Files not Found"<<endl;
        return 0;
    }

    int magicNumber = readFlippedInteger(fp);
    int numImages = readFlippedInteger(fp);
    int numRows = readFlippedInteger(fp);
    int numCols = readFlippedInteger(fp);

    fseek(fp2, 0x08, SEEK_SET);

    int size = numRows*numCols;
    CvMat *trainingVectors = cvCreateMat(numImages, size, CV_32FC1);
    CvMat *trainingLabels = cvCreateMat(numImages, 1, CV_32FC1);

    //BYTE *temp = new BYTE[size];
    unsigned char *temp =  (unsigned char *) malloc(size);

    unsigned char tempClass=0;

    for(int i=0; i < numImages; i++)
    {
        fread((void*)temp, size, 1, fp);
        fread((void*)(tempClass), sizeof(unsigned char*), 1, fp2);

        trainingLabels->data.fl[i] = tempClass;

        for(int k=0; k < size; k++)
            trainingVectors->data.fl[i*size+k] = temp[k];
    }

    KNearest knn(trainingVectors, trainingLabels);
    printf("Maximum k: %d\n", knn.get_max_k());  

    fclose(fp);
    fclose(fp2);

    cvReleaseMat(&trainingVectors);
    cvReleaseMat(&trainingLabels);

    return 0;
}

int readFlippedInteger(FILE *fp)
{
    int ret = 0;
    unsigned char *temp;

    temp = (unsigned char*)(ret);
    fread(&temp[3], sizeof(unsigned char*), 1, fp);
    fread(&temp[2], sizeof(unsigned char*), 1, fp);
    fread(&temp[1], sizeof(unsigned char*), 1, fp);
    fread(&temp[0], sizeof(unsigned char*), 1, fp);

    return ret;
}

我使用 unsigned char 而不是 BYTE,我认为它应该做同样的工作。如果我在这里错了,请纠正我。

尽管如此,我不是编程专家,但是当我运行代码时出现此错误

* K-Nearest Neighbour.exe 中 0x000007FEE68F7450 (msvcr110d.dll) 处未处理的异常:0xC0000005:访问冲突写入位置 0x0000000000000003

有人可以帮我构建此代码..谢谢

4

1 回答 1

0

您错过了“地址”运算符,并且 sizeof 似乎是错误的:

int readFlippedInteger(FILE *fp)
{
    int ret = 0;
    unsigned char *temp = (unsigned char*)(&ret);
    fread(&temp[3], sizeof(unsigned char), 1, fp);
    fread(&temp[2], 1, 1, fp);  // should be equivalent to above
    ...    
}

另一个问题可能是 4 字节的假设int,因为您正在使用 64 位进行编译,这从错误消息中可以明显看出。

于 2013-04-21T05:31:47.003 回答