处理图像数据是内存越界
//计算平均灰度和标准偏差
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;
}