void Image::Read(char* ImageName)
{
IplImage* img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
//将一维指针img_data指向的内存中的值写入成员变量二维指针data所指的内存中
//write your code here
height=img->height;
width=img->width;
unsigned char *p=img_data;
data=new unsigned char *[height];
for(int i=0;i<width;i++)
{
data[i]=new unsigned char [width];
}
for(int i=0;i<height;i++)//这是正确的方法
{
for(int j=0;j<width;j++)
{
*(*(data+i)+j)=*((p+i*widthstep)+j);
}
}
/*int i,j; //使用数组的正确答案
for(i = 0; i < height; i++)
for(j = 0; j < width; j++)
data[i][j] = img_data[i*widthstep+j];
*/
cvReleaseImage(&img);
}
如果将双层for循环写为如下会报出越界错误:
int w=0;
int heightcount = 0;
while(*p!=NULL)
{
heightcount++;
for(int j=0;j<width;j++)
{
if(*p==NULL)
break;
*(*(data+w)+j)=*p;
p=p+widthstep/width;
}
w++;
if(*p==NULL)
break;
}
原因是IPlimage类型结构体中的imageData成员,在所存值结束时并没有空值(NULL)或者‘\0’,可能系统就是给imageData成员分配了width*height大小的空间,空间后是什么不管,也就谈不上null或‘\0’了。