首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

处置图像数据是内存越界

2012-12-16 
处理图像数据是内存越界//计算平均灰度和标准偏差void CalGray(IplImage* img){IplImage *grayImg cvCre

处理图像数据是内存越界

//计算平均灰度和标准偏差
void CalGray(IplImage* img)
{  
IplImage *grayImg = cvCreateImage(cvSize(IMAGE_HEIGHT,IMAGE_WIDTH),IPL_DEPTH_8U,1);
if(img->nChannels = 3)
{
//转换为单通道灰度图,进行计算
//遍历RGB图像
//char *data = img->imageData;
intstep = img->widthStep/(img->width);
char r, g, b ;
for (int i = 0;i < img->height;i++)
{
for(int j = 0;j < img->width;j++)
{
b = *(img->imageData + i*(img->widthStep) + j*step + 0);
g = *(img->imageData + i*(img->widthStep) + j*step +1);
r = *(img->imageData + i*(img->widthStep) + j*step + 2);
//对灰度图像进行赋值
 char grayVal =   r*0.29900f + g*0.58700f  +  b*0.11400f +0.5f;
 (grayImg->imageData + i*grayImg->widthStep)[j] = grayVal;
// *(grayImg->imageData + i*(grayImg->width))[j] = grayVal; 
}
}
/*delete r;
delete g;
delete b;
r = NULL;
g = NULL;
b = NULL;*/
//进行图像格式转换,src是自定义的图像格式
Image src; 
if (grayImg)
{
src.cn =grayImg->nChannels;
src.step = grayImg->widthStep;
src.nBitsPerCh = grayImg->depth;
src.w = grayImg->width;
src.h = grayImg->height;
src.data = (unsigned char *)grayImg->imageData;
}
else
return;
//计算平均灰度
static int nAveVal, nStDev;
GetAverageGray(src, nAveVal);
GetGrayStDev(src, nAveVal, nStDev);
//CCalGrayScale::GetAverageGray(src, nAveVal);
//CCalGrayScale::GetGrayStDev(src, nAveVal, nStDev);
CString strTmp = _T("");
strTmp.Format("平均灰度和标准离差是 d%, d%");
MessageBox(NULL, strTmp, IDOK);
cvReleaseImage(&grayImg );
return;
}
else
{
MessageBox(NULL,"无法处理该类型图像",IDOK);
return;
}
}
bool GetAverageGray(Image &src, int nAveVal)
{
unsigned char *pData = src.data;
if(!pData)
{
return false;
}

//设计计数器SunVal,保存总灰度
int SumVal = 0;
if(src.cn == 1)
{
for(long y = 0; y < src.h; y++)
for(long x = 0; x < src.w; x++)
{
SumVal = SumVal + *(pData + y*(src.h) + x);
}
}
delete pData;
pData = NULL;

//设计计数器,用来保存总像素数目
int PixNum = src.w * src.w;

//求解平均灰度值
long dAveVal = SumVal/PixNum;
nAveVal = dAveVal;
return true;
}

bool GetGrayStDev(Image &src, long nAveVal, long nStDev)
{
unsigned char *pData = src.data;

if(!pData)
{
return false;
}
//求标准偏差
int sum = 0;
for(long y = 0; y < src.h; y++)
for(long x = 0; x < src.w; x++)
{
sum = sum + (*(pData + y*(src.h) + x) - nAveVal)^2; 
}
delete pData;


pData = NULL;

//设计计数器,用来保存总像素数目
int PixNum = src.w * src.w;

//求解标准离差
int dVariance = sum/PixNum;
int dStDev = sqrt((long double)dVariance);
nStDev = dStDev;
return true;
}


对衣服灰度图像求平均灰度和标准离差,出现了内存越界,内存泄露的错误,初步定为是在GetAverageGray
和 GetGrayStDev两个函数中,请大家看看到底哪里出现了问题???
[最优解释]
内存越界都用断点找,崩溃点使用callstack窗口,向下找很快就能找到。

用肉眼找崩溃代码,满清十大酷刑么?
[其他解释]
引用:
C/C++ code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929……
发现了一个问题了,
(grayImg->imageData + i*grayImg->widthStep)[j] = grayVal;有问题,
应该对指针进行*运算。。。。
改成了*(grayImg->imageData + i*grayImg->widthStep + j) = grayVal;

热点排行