idInfo.baseMat = readMat(baseFile, rmc, rmr);
idInfo.meanMat = readMat(meanFile, mmc, mmr);
idInfo.referMat = readMat(trainFile, tmc, tmr);
CvMat *readMat(char *filePath, int width, int height)
{
assert(NULL != filePath);
assert(width*height > 0);
CvMat *Mat = cvCreateMat(height, width, CV_32FC1);
FILE *fp = fopen(filePath, "rb");
for(int i=0; i<height; i++)
{
unsigned char *p = Mat->data.ptr + i*width;
int r = fread(p, sizeof(double)*width, 1, fp);
if(r != 1) perror("");
}
fclose(fp);
return Mat;
}
在连续三次读取比较大的矩阵的时候,执行第三个readMat函数出现了错误,经过调试发现是cvCreateMat()函数out of memory并且是堆栈错误,当注释掉前两个readMat函数后,错误不再出现,据初步分析,可能是栈空间不足引起的。或者改为如下代码,使其在堆上分配空间也可以。
static CvMat *baseMat = cvCreateMat(rmr, rmc, CV_32FC1);
static CvMat *meanMat = cvCreateMat(mmr, mmc, CV_32FC1);
static CvMat *trainMat = cvCreateMat(tmr, tmc, CV_32FC1);
由此可以看出cvCreateMat应该是在栈上分配空间?