bool MotionBlur(IplImage* src)
{
// 指向目标图像的指针
unsigned char * LPsrc;
//图象的宽度和高度
int Width = src->width;
int Height= src->height;
int LineBytes=src->width*src->nChannels;
int iColumn, jRow;//循环变量
int temp,m;//临时变量
double p,q;// 临时变量
int nTotTime, nTotLen, nTime;
nTotTime = 10;//总的运动时间10s
nTotLen = 10;// 总的运动距离10个象素点
double B;// 摄像机的暴光系数
B = 0.1;
int *nImageDegener;//用来存储源图象和变换核的时域数据
nImageDegener = new int [Height*LineBytes];// 为时域和频域的数组分配空间
// 将数据存入时域数组
for (jRow = 0; jRow < Height; jRow++)
{
for(iColumn = 0; iColumn < LineBytes; iColumn++)
{
temp=0;
// 指向源图像倒数第jRow行,第iColumn个象素的指针
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;
// 象素点的象素值积累
for ( nTime = 0; nTime < nTotTime; nTime++ )
{
p = (float)iColumn - (float)(nTotLen)*nTime/nTotTime;
if (p > 0)
{
q = p - floor((double)p);
if(q >= 0.5)
m = (int)ceil((double)p);
else
m = (int)floor((double)p);
// 累加
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + m;
temp = temp + *LPsrc;
}
}
// 乘以摄像机的暴光系数
temp = B * temp;
temp=(int)ceil((double)temp);
// 使得temp的取值符合取值范围
if(temp<0)
temp=0;
if(temp>255)
temp=255;
nImageDegener[LineBytes*jRow + iColumn] = temp;
}
}
//转换为图像
for (jRow = 0;jRow < Height ;jRow++)
{
for(iColumn = 0;iColumn < LineBytes ;iColumn++)
{
// 指向源图像倒数第jRow行,第iColumn个象素的指针
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;
*LPsrc = nImageDegener[LineBytes*jRow + iColumn];
}
}
//释放存储空间
delete[] nImageDegener;
// 返回
return true;
}
{
// 指向目标图像的指针
unsigned char * LPsrc;
//图象的宽度和高度
int Width = src->width;
int Height= src->height;
int LineBytes=src->width*src->nChannels;
int iColumn, jRow;//循环变量
int temp,m;//临时变量
double p,q;// 临时变量
int nTotTime, nTotLen, nTime;
nTotTime = 10;//总的运动时间10s
nTotLen = 10;// 总的运动距离10个象素点
double B;// 摄像机的暴光系数
B = 0.1;
int *nImageDegener;//用来存储源图象和变换核的时域数据
nImageDegener = new int [Height*LineBytes];// 为时域和频域的数组分配空间
// 将数据存入时域数组
for (jRow = 0; jRow < Height; jRow++)
{
for(iColumn = 0; iColumn < LineBytes; iColumn++)
{
temp=0;
// 指向源图像倒数第jRow行,第iColumn个象素的指针
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;
// 象素点的象素值积累
for ( nTime = 0; nTime < nTotTime; nTime++ )
{
p = (float)iColumn - (float)(nTotLen)*nTime/nTotTime;
if (p > 0)
{
q = p - floor((double)p);
if(q >= 0.5)
m = (int)ceil((double)p);
else
m = (int)floor((double)p);
// 累加
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + m;
temp = temp + *LPsrc;
}
}
// 乘以摄像机的暴光系数
temp = B * temp;
temp=(int)ceil((double)temp);
// 使得temp的取值符合取值范围
if(temp<0)
temp=0;
if(temp>255)
temp=255;
nImageDegener[LineBytes*jRow + iColumn] = temp;
}
}
//转换为图像
for (jRow = 0;jRow < Height ;jRow++)
{
for(iColumn = 0;iColumn < LineBytes ;iColumn++)
{
// 指向源图像倒数第jRow行,第iColumn个象素的指针
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;
*LPsrc = nImageDegener[LineBytes*jRow + iColumn];
}
}
//释放存储空间
delete[] nImageDegener;
// 返回
return true;
}