www.pudn.com > MediaPlayer.rar > MyBmp.cpp


#include   "stdafx.h" 
#include "MyBmp.h" 
float infi = 0.00100000 ; 
#define  PI 3.14159265358979323846 
#define thresh 40 
#define NULL 0  
 
 
void MyBmp::SaveBMPData(unsigned char *imageData, int width, int height, char *bmpname, int nType) 
{ 
	BITMAPFILEHEADER bfh; 
	BITMAPINFOHEADER bih; 
	RGBQUAD rgbQuad[256];    //定义调色板 
	LONG lineBytes, dwImgDataSize; 
	unsigned char *out; 
	if(nType == 8) 
	{ 
	lineBytes = WIDTHBYTES(width*8); 
	//用于内存处理的宽度是调整好的,字节数是4的整数倍 
	dwImgDataSize = lineBytes * height; 
	 
	out = new unsigned char[lineBytes * height]; 
	 
	memset(out, (BYTE)255, lineBytes * height); 
 
	unsigned char *p, *p1; 
	//设定BMP的文件头(共14字节) 
	bfh.bfType = 0x4d42; 
	//文件的属性bfSize计算时用的图像数据大小是用调整后的宽度计算的 
	bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+dwImgDataSize;  
 
	bfh.bfReserved1 = 0; 
	bfh.bfReserved2 = 0; 
	bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD); 
	//设定BMP的信息头(共40字节) 
	bih.biSize = sizeof(BITMAPINFOHEADER); 
	//bih.biWidth = lineBytes; 
	//bmp文件里的biWidth属性是图像的实际宽度 
	bih.biWidth = width; 
	bih.biHeight = height; 
	bih.biPlanes = 1; 
	bih.biBitCount = 8; 
	bih.biCompression = BI_RGB; 
	bih.biSizeImage = dwImgDataSize; 
	bih.biYPelsPerMeter = 0; 
	bih.biXPelsPerMeter = 0; 
	bih.biClrUsed = 0; 
	bih.biClrImportant = 0; 
	 //对调色板进行赋值 
		for(int i=0; i<256; i++) 
		{ 
			rgbQuad[i].rgbBlue = (BYTE)i; 
			rgbQuad[i].rgbGreen = (BYTE)i; 
			rgbQuad[i].rgbRed = (BYTE)i; 
			rgbQuad[i].rgbReserved = 0; 
		} 
		//**************排列图像数据适合BMP格式 
		//为了凑齐4的整数倍而添加的图像数据不做处理 
		int pointer = 0; 
		unsigned char tempc; 
		for(i=0;iG)?R:G); 
		max = ((tmp>B)?tmp:B) ; 
		tmp = ((R=0)&(H<=20)|(H==316)) 
		H=0; 
	else if ((H>=21)&(H<=40)) 
        H=1; 
	else if ((H>=41)&(H<=75)) 
        H=2;  
	else if ((H>=76)&(H<=155)) 
        H=3; 
	else if ((H>=156)&(H<=190)) 
        H=4;  
	else if ((H>=191)&(H<=270)) 
        H=5; 
	else if ((H>=271)&(H<=295)) 
        H=6; 
	else  
        H=7; 
	if ((S>0)&(S<=0.2)) 
		S=0; 
	else if ((S>0.2)&(S<=0.7)) 
		S=1; 
	else  
		S=2; 
	if ((V>0)&(V<=0.2)) 
		V=0; 
	else if ((V>0.2)&(V<=0.7)) 
		V=1; 
	else  
		V=2; 
	return ( 9*H+3*S+V ) ; 
} 
int MyBmp::value1(float H , float S , float V) 
{ 
	if ((H>0.05)&(H<=0.15+infi)) 
		H=1; 
	else if ((H>0.15)&(H<=0.25+infi)) 
        H=2; 
	else if ((H>0.25)&(H<=0.35+infi)) 
        H=3;  
	else if ((H>0.35)&(H<=0.45+infi)) 
        H=4; 
	else if ((H>0.45)&(H<=0.55+infi)) 
        H=5;  
	else if ((H>0.55)&(H<=0.65+infi)) 
        H=6; 
	else if ((H>0.65)&(H<=0.75+infi)) 
        H=7; 
	else  if((H>0.75)&(H<=0.85+infi)) 
        H=8; 
	else  if((H>0.85)&(H<=0.95+infi)) 
        H=9; 
    else 
        H=10; 
	if ((S>=0.0)&&(S<=0.25+infi)) 
		S=1; 
	else if ((S>0.25)&(S<=0.5+infi)) 
		S=2; 
    else if ((S>0.5)&(S<=0.75+infi)) 
		S=3; 
	else  
		S=4; 
	if ((V>=0.0)&(V<=0.2+infi)) 
		V=1; 
	else if ((V>0.2)&(V<=0.4+infi)) 
		V=2; 
     else if ((V>0.4)&(V<=0.6+infi)) 
		V=3; 
     else if ((V>0.6)&(V<=0.8+infi)) 
		V=4; 
	else  
		V=5; 
	return ( 20*H+5*S+V-25 ) ; 
} 
/**************************************************************** 
***  
此函数运用X2直方图算法检测突变,隔帧差检测渐变  
然后提取图像特征向量进行聚类提取关键帧 
*** 
****************************************************************/ 
void MyBmp::FrameExaction(float * TepImg , int * Hist_hsv , int * result , int sframe , int eframe , int Width, int Height) 
{ 
	MyBmp bmpInstance; 
	int len = eframe - sframe + 2 ; 
	int Window = 15 ; 
	float * D ; 
	D = new float[len] ; 
	memset(D, 0, len*sizeof(float)) ; 
	float * FD ; 
	float MAX = infi ; 
	FD = new float[len] ; 
	memset(FD, 0, len*sizeof(float)) ; 
	for (int loop = sframe ; loop < eframe ; loop ++) 
	{ 
		for( int k = 0 ; k < 72 ; k++) 
		{ 
			//Output+=  "loop+1"; 
			///////////////////////////////////////////////// 
			int interval = 6 ;                   //求取隔帧差 
			if( (loop + 6) < eframe) 
			{ 
				FD[loop - sframe + 1] += fabs(Hist_hsv[loop * 72 + k] - Hist_hsv[(loop + interval) * 72 + k]); 
				if (FD[loop - sframe + 1] > MAX)           //求得全局最大的FD 
				{ 
					MAX = FD[loop - sframe + 1] ; 
				} 
			} 
			if ( Hist_hsv[(loop + 1) * 72 + k] > Hist_hsv[loop * 72 + k] ) 
				D[loop - sframe + 1] += sqr( Hist_hsv[(loop + 1) * 72 + k] - Hist_hsv[loop * 72 + k] )/(float)(Hist_hsv[(loop + 1) * 72 + k] + 1); 
			else 
				D[ loop - sframe + 1] += sqr( Hist_hsv[(loop+1) * 72 + k] - Hist_hsv[loop * 72 + k] )/(float)(Hist_hsv[loop * 72 + k] + 1); 
			 
		} 
	} 
// 	FILE *fpX; 
// 	fpX=fopen("X2.txt","w"); 
// 	for(int w=1;w < eframe - sframe  ;w++) 
// 	{ 
// 		fprintf(fpX,"%f ",D[w]); 
// 		if(w%5 == 0)fprintf(fpX,"\n"); 
// 	} 
// 	fclose(fpX); 
	for( loop = 0 ; loop < len - 4 ; loop++)    //开窗检测 
	{ 
			int l = 0 ; 
			int g = 0 ; 
			for ( int k = ((loop-4 > 0)?(loop-4) : -1) ;k <=((loop+4 < len)?(loop+4) : (len-2)) ; k++ ) 
		{ 
			if ( D[loop+1] > 4 * D[k+1] )    //   4可作为参数调整 
			{		 
				l++ ;	 
			} 
			else if( D[loop+1] > 2 * D[k+1] && D[loop+1] < 3 * D[k+1]) 
			{ 
				g++ ; 
			} 
		} 
		if ( (l == 8 )||(l >= 7 && g <= 1)) 
		{ 
			for (int i = ((sframe + loop - 10 < sframe)? sframe : (sframe + loop - 10)); i < ((sframe + loop + 5 >= eframe)? eframe : (sframe + loop + 5)); i ++)   //切变处前后15帧在检测渐变时应跳过检测 
			{ 
				result[i] = 2 ; 
			} 
			result[sframe + loop + 1] = 1; 
		} 
	} 
	//	else if ( l >= 6 ) 
	//	{ 
	//		t.Format("%d\n",loop+1); 
	//		Output+=t; 
	//	} 
// 	FILE *fpF; 
// 	fpF=fopen("FD.txt","w"); 
// 	for( w=1;w < eframe - sframe - 6 ;w++) 
// 	{ 
// 		fprintf(fpF,"%f ",FD[w]); 
// 		if(w%5 == 0)fprintf(fpF,"\n"); 
// 	} 
// 	fclose(fpF); 
	int Paticalmaxlabel = 0 ; 
	//以下为处理隔帧差的曲线FD以提取出峰值区所在的潜在渐变区间 
	int Th = 2.0 * MAX / 3.0 ;      //设定双重阈值 
	int Tl = MAX / 3.0 ; 
	int PaticalMAX = infi ; 
// 	for (loop = 1 ; loop < eframe - 6 ; loop ++) 
// 	{ 
// 		int PaticalMAX = infi ; 
// 		for (int i = loop ; i <= loop + Window ; i ++) 
// 		{ 
// 			if (FD[i] > PaticalMAX) 
// 			{ 
// 				PaticalMAX = FD[i] ; 
// 				Paticalmaxlabel = i ; 
// 			} 
// 		} 
// 		if((FD[Paticalmaxlabel] - MAX/3.0 > infi)&&(FD[Paticalmaxlabel] > FD[Paticalmaxlabel + 1])&&(FD[Paticalmaxlabel] > FD[Paticalmaxlabel - 1]))  
// 		{ 
// 			result[Paticalmaxlabel] = 1 ;		 
// 		} 
// 	} 
 	int gradstart = -1 ;     //渐变起始帧号 
	int gradend = -1 ; 
	//int Win = 10 ;	 
	for (int i = sframe ; i <= eframe ; i++) 
	{ 
		if ((result[i] == 0)&&(FD[i] > Tl)) 
		{ 
			if (gradstart == -1) 
			{ 
				gradstart = i + 6 ; 
				while ((result[i] == 0)&&(FD[i] > Tl)) 
				{ 
					if (FD[i] > PaticalMAX) 
					{ 
						PaticalMAX = FD[i] ; 
					} 
					i++ ; 
				} 
				gradend = i ; 
				if (PaticalMAX > Th) 
				{ 
					while (gradend >= gradstart) 
					{ 
						result[gradend] = 1 ;    //渐变标记 
						gradend -- ; 
					} 
					gradstart = -1 ; 
					gradend = -1 ; 
				} 
			} 
		} 
	} 
	for(  i = sframe ; i <= eframe ; i++) 
	{ 
		if (result[i] != 1) 
		{ 
			bmpInstance.cluster(TepImg , result , i , eframe , Width , Height , Hist_hsv) ; 
		} 
	} 
	delete [] D ; 
	D = NULL ; 
	delete [] FD ; 
	FD = NULL ; 
 
} 
/************************************************************************ 
**** 
void cluster(float * TepImg , int * result , int i , int ed , int Width, int Height):聚类函数,用来将从第i帧开始的镜头进行镜头内的聚类 
************************************************************************/ 
void MyBmp::cluster(float * TepImg , int * result , int &i , int ed , int Width, int Height , int * Hist_hsv)  
{ 
	MyBmp bmpInstance; 
	Childshot *pcshot , *qshot , *head; 
	float distance = 0.0 ; 
	float *vector ; 
	vector = new float[12]; 
	memset(vector, 0.0, 12*sizeof(float)); 
	float *vector1 ; 
	vector1 = new float[12]; 
	memset(vector1, 0.0, 12*sizeof(float)); 
	pcshot = (Childshot *)malloc(sizeof(Childshot)) ; 
	head = pcshot ; 
	pcshot->entropyMax = 0.0 ; 
	pcshot->keynum = i ; 
	bmpInstance.Feature(TepImg + i * 3 * Width * Height , Width , Height , vector); 
	bmpInstance.Entropy(Hist_hsv + i * 72 , pcshot->entropyMax , pcshot->keynum , Width , Height , i) ; 
	FILE *fpX; 
	fpX=fopen("Feature.txt","w"); 
	pcshot->center = vector ; 
	pcshot->lenth = 1 ; 
	pcshot->start = i ; 
	pcshot->next = NULL ; 
	i ++ ; 
	do  
	{ 
		bmpInstance.Feature(TepImg + i * 3 * Width * Height , Width , Height , vector1); 
		bmpInstance.Distance(vector1 , pcshot->center , distance) ; 
		fprintf(fpX,"%f   ",distance); 
		if ((distance > thresh)&&(pcshot->lenth >= 5))             //若大于阈值则子镜头长大于5则新建一个子镜头 
		{ 
			qshot = (Childshot *)malloc(sizeof(Childshot)) ; 
			for(int w = 0 ;w < 12  ; w ++)     //注意:赋值与赋地址在此处同时出现 
			{ 
				vector[w] = vector1[w] ; 
			} 
			qshot->center = vector ; 
			qshot->lenth = 1 ; 
			qshot->start = i ; 
			qshot->keynum = i ; 
			qshot->entropyMax = 0.0 ; 
			bmpInstance.Entropy(Hist_hsv + i * 72 , pcshot->entropyMax , pcshot->keynum , Width , Height , i) ; 
			qshot->next = NULL ; 
			pcshot->next = qshot ; 
			pcshot = pcshot->next ; 
		} 
		else                             //否则将下一帧归入原先的子镜头类 
		{ 
				if (i == 668) 
			{ 
				i = 668 ; 
			} 
			bmpInstance.Entropy(Hist_hsv + i * 72 , pcshot->entropyMax , pcshot->keynum , Width , Height , i) ; 
			for (int k = 0 ; k < 12 ; k++) 
			{ 
				pcshot->center[k] = (pcshot->center[k] * pcshot->lenth + vector1[k]) / (float)(pcshot->lenth + 1) ; 
			} 
			pcshot->lenth ++ ; 
		} 
		i ++ ; 
	} while((result[i] != 1)&&(i <= ed)); 
	pcshot = head ; 
	while (pcshot != NULL) 
	{ 
		result[pcshot->keynum] = 10 ;           //result数组值为10的为关键帧提取出来 
		pcshot = pcshot->next ; 
	} 
 
	delete [] vector ; 
	vector = NULL ; 
	delete [] vector1 ; 
	vector1 = NULL ; 
	fclose(fpX) ; 
} 
/***************************************************************** 
*** 
Feature函数用来提取一幅图像的12维特征向量,返回float数组指针 
******************************************************************/ 
void MyBmp::Feature(float * TepImg , int Width, int Height , float *vector) 
{ 
	double c[8][8] ; 
	double block_H[64] , block_S[64] , block_V[64] ; 
	int i , j , k ; 
	int Winwid ; 
	int Winhei ; 
	double H = 0.0 ; 
	double S = 0.0 ; 
	double V = 0.0 ; 
	double s_H , s_S , s_V; 
	double tmp_H[64]; 
	double tmp_S[64]; 
	double tmp_V[64]; 
	int chWidth = Width / 8 ;          //将图像分为8×8的块  
	int chHeight = Height / 8 ; 
	for(Winwid = 0 ; Winwid < 8 ; Winwid ++) 
	{ 
		for(Winhei = 0 ; Winhei < 8 ; Winhei ++) 
		{ 
				k = 0 ; 
				for (i = 0 ; i < ((Winwid == 7) ? (Width - 7 * chWidth) : chWidth) ; i ++) 
				for (j = 0 ; j < ((Winhei == 7) ? (Height - 7 * chHeight) : chHeight) ; j ++) 
				{ 
					H += TepImg[((Winhei * chHeight + j) * Width + Winwid * chWidth + i) * 3] ; 
					S += TepImg[((Winhei * chHeight + j) * Width + Winwid * chWidth + i) * 3 + 1] ; 
					V += TepImg[((Winhei * chHeight + j) * Width + Winwid * chWidth + i) * 3 + 2] ; 
					k ++ ; 
				} 
				block_H[Winhei * 8 + Winwid] = H /(double) k ; 
				block_S[Winhei * 8 + Winwid] = S /(double) k ; 
				block_V[Winhei * 8 + Winwid] = V /(double) k ; 
			 
		} 
	} 
//对前向DCT变换进行初始化 
	for (i = 0 ; i < 8 ;i++) 
	{ 
		s_H = (i == 0) ? sqrt(0.125) : 0.5 ; 
		for (j = 0 ; j < 8 ; j++) 
		{ 
			c[i][j] = s_H * cos((PI/8.0) * i * (j + 0.5)) ; 
		} 
	} 
//开始进行前向DCT变化 
	for (i = 0 ; i < 8 ; i ++) 
		for(j = 0 ; j < 8 ; j ++) 
	{ 
		s_H = 0.0 ; 
		s_S = 0.0 ; 
		s_V = 0.0 ; 
		for (k = 0 ;k < 8 ; k ++) 
		{ 
			s_H += c[j][k] * block_H[8 * i + k] ; 
			s_S += c[j][k] * block_S[8 * i + k] ; 
			s_V += c[j][k] * block_V[8 * i + k] ; 
		} 
		tmp_H[8 * i + j] = s_H ; 
		tmp_S[8 * i + j] = s_S ; 
		tmp_V[8 * i + j] = s_V ; 
	} 
	for(j = 0 ; j < 8 ; j ++) 
		for(i = 0 ; i < 8 ; i ++) 
		{ 
			s_H = 0.0 ; 
			s_S = 0.0 ; 
			s_V = 0.0 ; 
			for (k = 0 ;k < 8 ; k ++) 
			{ 
				s_H += c[i][k] * tmp_H[8 * k + j] ; 
				s_S += c[i][k] * tmp_S[8 * k + j] ; 
				s_V += c[i][k] * tmp_V[8 * k + j] ; 
			} 
			block_H[8 * i + j] = (int)floor(s_H + 0.499999) ; 
			block_S[8 * i + j] = (int)floor(s_S + 0.499999) ; 
			block_V[8 * i + j] = (int)floor(s_V + 0.499999) ; 
		} 
	vector[0] = block_H[0] ; 
	vector[1] = block_H[1] ; 
	vector[2] = block_H[8] ; 
	vector[3] = block_H[9] ; 
	vector[4] = block_S[0] ; 
	vector[5] = block_S[1] ; 
	vector[6] = block_S[8] ; 
	vector[7] = block_S[9] ; 
	vector[8] = block_V[0] ; 
	vector[9] = block_V[1] ; 
	vector[10] = block_V[8] ; 
	vector[11] = block_V[9] ; 
} 
/******************************************************************************* 
*** 
Distance函数用来求vector1和vector2两个12维向量的距离 
*******************************************************************************/ 
void MyBmp::Distance(float *vector1 , float *vector2 , float &distance) 
{ 
	int i ; 
	distance = 0.0 ; 
	for (i = 0 ; i < 12 ; i++) 
	{ 
		distance += sqr(vector1[i] - vector2[i]) ;	 
	} 
	distance = sqrt(distance) ; 
} 
/******************************************************************************* 
*** 
Entropy函数用来得到子镜头中熵值最大的帧作为关键帧 
*******************************************************************************/ 
void MyBmp::Entropy(int * Hist_hsv , float &entropyMax , int &keynum , int Width, int Height , int i) 
{ 
	float entropy = 0.0 ; 
	float rate ; 
	for (int w = 0 ; w < 72 ; w ++) 
	{ 
		rate = Hist_hsv[w] / (float)(Width * Height) ; 
		if (rate != 0) 
		{ 
			entropy -= rate * log(rate) / log(2) ; 
		}	 
	} 
	if (entropy >= entropyMax) 
	{ 
		entropyMax = entropy ; 
		keynum = i ; 
	} 
} 
void MyBmp::conv(int * Hist_hsv1 , int * result , int sframe , int eframe , int m)  
{ 
	int i = eframe - sframe + 2 ; 
	float *V ; 
	V = new float[i]; 
	memset(V, 0, i*sizeof(float)) ; 
	float *V1 ; 
	V1 = new float[i]; 
	memset(V1, 0, i*sizeof(float)) ; 
	float *D ; 
	D = new float[i]; 
	memset(D, 0, i*sizeof(float)) ; 
	int n = 5 ; 
	int Window = 15 ; 
	int beta = 15 ; 
	int gama = 20 ; 
	for (int loop = sframe ; loop <= eframe  ; loop++) 
	{ 
	/*	if(loop == 460) 
		{ 
			loop = 460 ; 
		}*/ 
		for( int k = 0 ; k < 200 ; k++) 
		{  
			V[loop - sframe + 1] += 1.0*(Hist_hsv1[loop*200+k] - m)*(Hist_hsv1[loop*200+k] - m)/199.0; 
		} 
			//V[loop - sframe + 1] /=  ; 
	} 
	/*	FILE *fp; 
	fp=fopen("v.txt","w"); 
	for( int w=0;w<200;w++) 
	{ 
		fprintf(fp,"%f ",V[w]); 
		if(w%5 == 0)fprintf(fp,"\n"); 
	} 
	fclose(fp);*/ 
	float aver = 0.001; 
	int num = 0 ; 
	for (loop = sframe ; loop <= eframe  ; loop++) 
	{ 
		/*if(loop == 456) 
		{ 
			loop = 456; 
		} 
		*/ 
		if ((loop >= sframe)&(loop <= eframe - n)) 
		{ 
			for (int j = loop ; j <= loop+n-1 ; j++) 
			{ 
				V1[loop - sframe + 1] += V[j - sframe + 1] ; 
			} 
				V1[loop - sframe + 1] /= (float) n ; 
		} 
		else 
		{ 
			for (int j = loop ; j <= eframe ; j++) 
			{ 
				V1[loop - sframe + 1] += V[j - sframe + 1] ; 
			} 
				V1[loop - sframe + 1] /= (float) (eframe-loop+1) ; 
		} 
		if (loop > sframe) 
		{ 
			D[loop - sframe] = V1[loop - sframe + 1] - V1[loop - sframe ] ; 
			if(D[loop - sframe] > 0.0001) 
			{ 
				aver += D[loop - sframe] ; 
				num ++ ; 
			} 
		} 
	} 
	aver /= float(num) ; 
	FILE *fp1; 
	fp1=fopen("v1.txt","w"); 
	for(int w=1;w < eframe - sframe ;w++) 
	{ 
		fprintf(fp1,"%f ",D[w]); 
		if(w%5 == 0)fprintf(fp1,"\n"); 
	} 
	fclose(fp1); 
	int Paticalmaxlabel = 0 ; 
	int Paticalminlabel = 0 ; 
	float MAX ; 
	float MIN ; 
	for (loop = 2 ; loop <= eframe - Window + 1 ; loop++)   //开窗检验 
	{ 
		if(loop == eframe - Window + 1) 
		{ 
			loop = eframe - Window + 1 ; 
		} 
		MAX = infi ; 
		MIN = -infi ; 
		for(int j = loop ; j <= loop + Window ; j++) 
		{ 
			if((D[j] > infi)&&(D[j] > D[j + 1])&&(D[j] > D[j - 1])) 
			{ 
				if(D[j] > MAX) 
				{ 
					MAX = D[j] ; 
					Paticalmaxlabel = j ; 
				} 
			} 
			else if((D[j] < - infi)&&(D[j] < D[j + 1])&&(D[j] < D[j - 1])) 
			{ 
				if(D[j] < MIN) 
				{ 
					MIN = D[j] ; 
					Paticalminlabel = j ; 
				} 
			} 
		} 
		float absMax = ((fabs(MAX) >= fabs(MIN))?  fabs(MAX) : fabs(MIN)) ; 
		float absMin = ((fabs(MAX) <= fabs(MIN))?  fabs(MAX) : fabs(MIN)) ; 
		int maxlabel = ((Paticalmaxlabel > Paticalminlabel)? Paticalmaxlabel : Paticalminlabel) ; 
		int minlabel = ((Paticalmaxlabel < Paticalminlabel)? Paticalmaxlabel : Paticalminlabel) ; 
		if((MAX > 10.0 * aver)&&(MIN != - infi))    //局部最大值相当的大时确定为渐变区 
		{ 
			for(w = minlabel ; w <= maxlabel ; w++) 
			{ 
				result[w +sframe + n/2] = 1 ;		//移位复原 
			} 
			while(fabs(D[w]) >= fabs(absMin/3.0))      //选择该区域附近的渐变帧 
			{ 
				result[w +sframe + n/2] = 1 ;      
				w ++ ; 
			} 
			w = minlabel ; 
			while(fabs(D[w]) >= fabs(absMin/3.0))      //选择该区域附近的渐变帧 
			{ 
				result[w +sframe + n/2] = 1 ;      
				w -- ; 
			} 
			loop = (((maxlabel + 20) <= (eframe - Window + 1))?(maxlabel + 20) : (eframe - Window + 1));							//避免重复设置,将loop直接加20 
		} 
		else if((MIN < -aver) && (MAX > aver)) 
		{ 
			if((abs(Paticalmaxlabel - Paticalminlabel) >= 4)&&(fabs(MAX + MIN) < absMax / 4.0)) 
			{ 
				for(w = minlabel ; w <= maxlabel ; w++) 
				{ 
					result[w +sframe + n/2] = 1 ;		//移位复原 
				} 
				while(fabs(D[w]) >= fabs(absMin/3.0)&&(D[w] * D[maxlabel] > 0))      //选择该区域附近的渐变帧 
				{ 
					result[w +sframe + n/2] = 1 ;      
					w ++ ; 
				} 
				result[w +sframe + n/2] = 1 ;				//自定义扩大渐变区域以使镜头的划分覆盖更广 
				w = minlabel ; 
				while(fabs(D[w]) >= fabs(absMin/3.0)&&(D[w] * D[minlabel] > 0))      //选择该区域附近的渐变帧 
				{ 
					result[w +sframe + n/2] = 1 ;      
					w -- ; 
				} 
				result[w +sframe + n/2] = 1 ;              //自定义扩大渐变区域以使镜头的划分覆盖更广 
				loop = (((maxlabel + 20) <= (eframe - Window + 1))?(maxlabel+20) : (eframe - Window + 1)); 
			} 
		} 
	} 
	 
	/*for (loop = sframe ; loop < eframe  ; loop++) 
	{	 
		D[loop - sframe] = V1[loop - sframe + 2] - V1[loop - sframe + 1] ; 
		if (loop == sframe) 
			lenth = 1 ; 
		else if (D[loop - sframe] * D[loop - sframe - 1] > 0) 
		{ 
			lenth ++ ; 
		} 
		else 
			lenth = 1; 
		if (lenth == alfa) 
		{ 
			for (int j = loop - alfa + 1 ;j <= loop ; j++) 
			{ 
					result[j] = 1 ; 
			} 
		} 
		else if (lenth > alfa) 
		{ 
				result[loop] = 1 ; 
		} 
	} 
	float head = 0.0 ; 
	float tail = 0.0 ; 
	//以下循环用来丢弃平滑区域 
	for(loop = sframe ; loop <= eframe  ; loop++) 
	{ 
		if(loop > sframe) 
		{ 
			if((result[loop] == 1)&&(result[loop - 1] == 0)) 
			{ 
				head = V1[sframe - loop + 1] ; 
			} 
			else if((result[loop] == 1)&&(result[loop + 1] == 0)) 
			{ 
				tail = V1[sframe - loop + 1] ; 
			} 
			if(head != 0 && tail != 0) 
			{ 
				int min = ((head < tail)? head : tail) ; 
				if(abs(head - tail) < min / 3.0) 
				{ 
					int j = loop ; 
					while(result[j] != 0) 
					{ 
						result[j] = 0 ; 
						j -- ; 
					} 
				} 
				head = 0 ; 
				tail = 0 ; 
			} 
		} 
		else 
		{ 
			if(result[loop] == 1) 
			{ 
				head = V1[sframe - loop + 1] ; 
			} 
		} 
	} 
	//用于合并间隔小于beta的两端区间 
	lenth = 0 ; 
	for(loop = sframe ; loop <= eframe  ; loop++) 
	{ 
		if(loop == sframe) 
		{ 
				do{ 
					loop ++ ; 
				}while(result[loop] == 0 && loop <= eframe && result[loop - 1] == 1); 
				lenth ++ ; 
		} 
		else 
		{ 
			if(result[loop] == 0) 
			{ 
				lenth ++ ; 
			} 
			else if(result[loop] == 1 &&  result[loop - 1] == 0) 
			{ 
				if(lenth < beta) 
				{ 
					int j = loop - 1 ; 
					do{ 
						result[j] = 1 ; 
						j --; 
					}while(result[j] == 0); 
				} 
				lenth = 0 ; 
			} 
		} 
	} 
//以下统计区间长度,剔除长度小于gama的区间 
	for(loop = sframe ; loop <= eframe  ; loop++) 
	{ 
		if(loop == sframe) 
		{ 
			if(result[loop] == 1) 
			{ 
				head = loop ; 
			} 
		} 
		else 
		{ 
			if((result[loop] == 1)&&(result[loop - 1] == 0)) 
			{ 
				head = loop ; 
			} 
			else if((result[loop] == 1)&&(result[loop + 1] == 0)) 
			{ 
				tail = loop ; 
				if(tail - head + 1 <= gama) 
				{ 
					for(int j = head ; j <= tail ; j++) 
					{ 
						result[j] = 0 ; 
					} 
				} 
			} 
		} 
	}*/ 
}