⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lgmm.cpp

📁 动态场景中运动目标检测提取与跟踪 对新手很有用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			value[2]=float(BYTEvalue_hsv[2]);
			bgModel[i * m_imageHeight + j].Init_Process(value);
		}
		numb.Format("%d",k); 
//		pMain->m_wndStatusBar.SetPaneText(0,numb,true);
		if( c == 27 )break;			//按下Esc键
	}
	ideta=GetTickCount()-i1;
	isum=(float)(ideta/(k-1));
	numb.Format("%7.0fms,k=%7.0d",isum,k-1); 
//	pMain->m_wndStatusBar.SetPaneText(1,numb,true);
//	cvReleaseImage(&hsvcur_frame);	//下面用hsvcur_frame暂存、翻转显示
	cvDestroyWindow( "cur_Image" );

/************************************************************************/
	//显示并保存背景模型图像	
	IplImage *hsvcur_frame1;
	IplImage *hsvcur_frame2;
	IplImage *bgImage;
	IplImage *bgImage1;
	IplImage *bgImage2;
	float value1[3];
	float value2[3];
	hsvcur_frame1 = cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
	hsvcur_frame2 = cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
	cvCopy(hsvcur_frame,hsvcur_frame2,NULL);
	cvCopy(hsvcur_frame,hsvcur_frame1,NULL);

	long count = 0;
	for(j=0; j<m_imageHeight; j++)	//显示并保存背景模型图像
	{
		for(i=0; i<m_imageWidth; i++)
		{
			bgModel[i * m_imageHeight + j].Norm();
			LGMM *temp = bgModel + i * m_imageHeight + j;
			memcpy(value, temp->m_ptr[0]->m_mean, sizeof(float)*3);
			memcpy(value1, temp->m_ptr[1]->m_mean, sizeof(float)*3);
			memcpy(value2, temp->m_ptr[2]->m_mean, sizeof(float)*3);
			cvSetPixelHSV(hsvcur_frame,i,j,int(value[0]),int(value[1]),int(value[2]));
			cvSetPixelHSV(hsvcur_frame1,i,j,int(value1[0]),int(value1[1]),int(value1[2]));
			cvSetPixelHSV(hsvcur_frame2,i,j,int(value2[0]),int(value2[1]),int(value2[2]));
			if(temp->m_ptr[0]->m_weight>0.9) count++;
		}
	}
	numb.Format(numb+",weight numb=%ld",count); 
//	pMain->m_wndStatusBar.SetPaneText(0,numb,true);
	bgImage = cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
    cvCvtColor( hsvcur_frame, bgImage, CV_HSV2BGR );
	cvConvertImage( bgImage, hsvcur_frame, CV_CVTIMG_FLIP);	//临时用hsvcur_frame翻转图像显示
	cvSaveImage( directoryname+"\\bg.bmp", hsvcur_frame);
	cvNamedWindow("bg_Image", CV_WINDOW_AUTOSIZE);
	cvShowImage("bg_Image", hsvcur_frame);
		cvWaitKey(1);
	cvReleaseImage(&hsvcur_frame);
	cvReleaseImage(&bgImage);

	bgImage1 = cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
    cvCvtColor( hsvcur_frame1, bgImage1, CV_HSV2BGR );
	cvConvertImage( bgImage1, hsvcur_frame1, CV_CVTIMG_FLIP);
	cvSaveImage( directoryname+"\\bg1.bmp", hsvcur_frame1);
	cvNamedWindow("bg_Image1", CV_WINDOW_AUTOSIZE);
	cvShowImage("bg_Image1", hsvcur_frame1);
		cvWaitKey(1);
	cvReleaseImage(&hsvcur_frame1);
	cvReleaseImage(&bgImage1);

	bgImage2 = cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
    cvCvtColor( hsvcur_frame2, bgImage2, CV_HSV2BGR );
	cvConvertImage( bgImage2, hsvcur_frame2, CV_CVTIMG_FLIP);
	cvSaveImage( directoryname+"\\bg2.bmp", hsvcur_frame2);
	cvNamedWindow("bg_Image2", CV_WINDOW_AUTOSIZE);
	cvShowImage("bg_Image2", hsvcur_frame2);
		cvWaitKey(1);
	cvReleaseImage(&hsvcur_frame2);
	cvReleaseImage(&bgImage2);
}

BOOL CCameraVideo::fast_segment_runGmmCut_video()
//动态Gmm Graph cut,被OnFileOpenVideo调用
{
	int x, y, index_i;
	float gmm_bg,shadow;
	float eval,rc,gc,bc,rb,gb,bb;//,curGrey,bgGrey;	//rgb分别对应hsv
	uchar* BYTEvalue_hsv;
//	CString numb;
	long i1, ideta, c;
	float  isum=0;
	IplImage* cur_Image=NULL;
//	CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
	CString Sindex;

//	"D:\\bg1\\fg1(NEW1).AVI"
	GetParameters();
	gmmCut_video(0,0);	//为动态graph cut作准备,初始化graph weight
// 	cvDestroyAllWindows();
	cvNamedWindow("raw_Image", CV_WINDOW_AUTOSIZE);
	GetParameters();
	cvSetCaptureProperty( m_videocapture, CV_CAP_PROP_POS_FRAMES, 0 );	//从第0帧开始
	hsvcurImage= cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
	curImage= cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
	i1=GetTickCount();
	for(index_i=0; ; index_i++)
	{
//		if(runGmmCut(index_i) < 0) break;
		cur_Image=NULL;
		cur_Image = cvQueryFrame( m_videocapture );
		if( !cur_Image )break;
		cvCvtColor( cur_Image, hsvcurImage, CV_BGR2HSV );

		for(x = 0; x < m_imageWidth; x++)
		for(y = 0; y < m_imageHeight; y++)
		{
//			BYTEvalue_hsv=cvGetpixelHSV(hsvcurImage,x,y);
			BYTEvalue_hsv=&((uchar*)(hsvcurImage->imageData + hsvcurImage->widthStep*y))[x*3];
//			rc=float(BYTEvalue_hsv[0]*2);	//rgb分别对应hsv
			rc=float(BYTEvalue_hsv[0]<<1);	//rgb分别对应hsv
			gc=float(BYTEvalue_hsv[1]);
			bc=float(BYTEvalue_hsv[2]);

// 			bgModel_S[i * m_imageHeight + j].Norm();
// 			GMM *temp = bgModel_S + i * m_imageHeight + j;
			
			gmm_bg = FLT_MAX;
			int which;//which Gaussian is the best one
			LGMM *pGMM = bgModel + x * m_imageHeight + y;
			LGMM *pGMM_S = bgModel_S + x * m_imageHeight + y;
			for(int i=0;i<pGMM->m_num;i++)
			{
				LGM *pGM = pGMM->m_ptr[i];
				if(pGM->m_background)//Is a background component
				{
					rb = pGM->m_mean[0];
					gb = pGM->m_mean[1];
					bb = pGM->m_mean[2];
					eval =(float) (Habs(rc,rb)*rhmin(gc,gb)/255+fabs(gc-gb)+fabs(bc-bb));
					if(eval<gmm_bg)
					{
						gmm_bg = eval;
						which = i;
					}
				}
				else break;
			}
			LGM *pGM = pGMM->m_ptr[which];
			rb = pGM->m_mean[0];
			gb = pGM->m_mean[1];
			bb = pGM->m_mean[2];

			shadow = 0.0;
			if(bc<=bb)
			{
				shadow = (float)((1.0-(bb-bc)/255.0)*(1.0-fabs(gc-gb)/255.0)
					*(1.0-Habs(rc,rb)*rhmin(gc,gb)/255.0/360.0));
			}
			g->edit_tweights_tree(node[x][y],P1+P5*shadow,P2*gmm_bg);
		}

		float term;
		float delta;
		BYTE *bytepixel1,*bytepixel2;
		for(x = 0; x < m_imageWidth-1; x++)
		for(y = 0; y < m_imageHeight; y++)
		{
// 			bytepixel1=cvGetpixel(cur_Image,x,y);
// 			bytepixel2=cvGetpixel(cur_Image,x+1,y);
			bytepixel1=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*y))[x*3];
			bytepixel2=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*y))[x*3+3];

			delta =(float) ((abs(bytepixel1[0]-bytepixel2[0])+
				abs(bytepixel1[1]-bytepixel2[1])+abs(bytepixel1[2]-bytepixel2[2]))/3.0);
			term =(float) (P3*(1.0-atan(delta)/1.57)+P4);
//			term = P3*exp(delta)+P4;
//			term = P3*delta+P4;
			g->edit_edge_tree(node[x][y],node[x+1][y],term,term);
		}

		for(x = 0; x < m_imageWidth; x++)
		for(y = 0; y < m_imageHeight-1; y++)
		{
// 			bytepixel1=cvGetpixel(cur_Image,x,y);
// 			bytepixel2=cvGetpixel(cur_Image,x,y+1);
			bytepixel1=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*y))[x*3];
			bytepixel2=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*(y+1)))[x*3];

			delta = (float)((abs(bytepixel1[0]-bytepixel2[0])+
				abs(bytepixel1[1]-bytepixel2[1])+abs(bytepixel1[2]-bytepixel2[2]))/3.0);
			term =(float) (P3*(1.0-atan(delta)/1.57)+P4);
//			term = P3*exp(delta)+P4;
//			term = P3*delta+P4;
			g->edit_edge_tree(node[x][y],node[x][y+1],term,term);
		}
		float energy = g->revised_maxflow();

		cvCopy(cur_Image,hsvcurImage,NULL);	//临时用hsvcurImage显示图像,这里的cur_Image由cvQueryFrame获得不可更改
		for(x = 0; x < m_imageWidth; x++)
		for(y = 0; y < m_imageHeight; y++)
		{    
			if(g->what_segment(node[x][y]) == LGraph::SOURCE) 
			{
				cvSetPixel(hsvcurImage, x, y, 255, 255, 255);
				//resImage->setPixel(x,y,qRgb(0,0,255));
			}
		}
// 		sprintf(fileNameStr,"%s/seg_reslut/%03d.bmp",seqbmpfilenamehead,index_i);
// 		cvSaveImage(fileNameStr, cur_Image);
		cvConvertImage( hsvcurImage, curImage, CV_CVTIMG_FLIP);
		cvShowImage("runseg_Image", curImage);
		cvShowImage("raw_Image", cur_Image);
/// 		Sindex.Format("%4d",index_i);
/// 		cvSaveImage( directoryname + "//seg_reslut//" + Sindex + ".bmp", curImage);
		c=cvWaitKey(1);

//		numb.Format("%d The energy given by dynamic gmmCut: E=%ld",index_i,energy); 
//		numb.Format("%d The energy given by dynamic gmmCut: E=%ld,%d,%d,%d,%d,%d,%d",index_i,energy,P1,P2,P3,P4,P5,P6); 
	//	pMain->m_wndStatusBar.SetPaneText(0,numb,true);
		if( c == 27 )	//按下Esc键
		{
			while (1)
			{
				c=cvWaitKey(10);
				if (c == 97)break;	//按下a键
			}
		}
	}
	ideta=GetTickCount()-i1;
	isum=(float)ideta/index_i;
//	numb.Format("%7.0fms,index_i=%5.0d",isum,index_i); 
//	pMain->m_wndStatusBar.SetPaneText(0,numb,true);
	cvReleaseImage(&cur_Image);
	cvReleaseImage(&curImage);
	cvReleaseImage(&hsvcurImage);
	destructGraph();
	return true;
}

void CCameraVideo::destructGraph()
{
	delete2DArray(node,m_imageWidth);
	delete g;
}



void CCameraVideo::gmmCut_video( const int index,const int index_nmb)
//单步静态的Gmm Graph cut,在runGmmCut()动态Gmm Graph cut的前初始化graph,还有被按钮OnGMMGraph调用
{
	uchar* BYTEvalue_hsv;
	IplImage* cur_Image=NULL;
	cvSetCaptureProperty( m_videocapture, CV_CAP_PROP_POS_FRAMES, index );
	cur_Image=NULL;
	cur_Image = cvQueryFrame( m_videocapture );
	if( !cur_Image )
	{
		AfxMessageBox("从文件抓图像出错!");
		return;
	}

	int x, y;
	node = make2DArray<LGraph::node_id>(m_imageWidth,m_imageHeight);
	g = new LGraph();
	for(x = 0; x < m_imageWidth; x++)
	for(y = 0; y < m_imageHeight; y++)
	{
		node[x][y] = g->add_node();
	}

	float gmm_bg,shadow;
	float eval,rc,gc,bc,rb,gb,bb;//,curGrey,bgGrey;
	hsvcurImage= cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
	curImage= cvCreateImage(cvSize(m_imageWidth, m_imageHeight), IPL_DEPTH_8U, 3 );
    cvCvtColor( cur_Image, hsvcurImage, CV_BGR2HSV );

	for(y = 0; y < m_imageHeight; y++)
	{
	for(x = 0; x < m_imageWidth; x++)
	{
		BYTEvalue_hsv=&((uchar*)(hsvcurImage->imageData + hsvcurImage->widthStep*y))[x*3];
		rc=float(BYTEvalue_hsv[0]<<1);	//rgb分别对应hsv
		gc=float(BYTEvalue_hsv[1]);
		bc=float(BYTEvalue_hsv[2]);
		LGMM *pGMM = bgModel + x * m_imageHeight + y;
//07.10 		GMM *pGMM_S = bgModel_S + x * m_imageHeight + y;
		//wsum1 = wsum2 = 0.0;
		//gmm_bg = 0.0;
		gmm_bg=FLT_MAX;
		int which;//which Gaussian is the best one
		for(int i=0;i<pGMM->m_num;i++)
		{
			LGM *pGM = pGMM->m_ptr[i];
			if(pGM->m_background)//Is a background component
			{
				rb = pGM->m_mean[0];
				gb = pGM->m_mean[1];
				bb = pGM->m_mean[2];
				eval =(float) (Habs(rc,rb)*rhmin(gc,gb)/255+fabs(gc-gb)+fabs(bc-bb));
				//eval = (Habs(rc,rb)*rhmin(gc,gb)/255/pGM->m_variance[0]+fabs(gc-gb)/pGM->m_variance[1]+fabs(bc-bb)/pGM->m_variance[2]);
				//eval = 0.5*(pow(Habs(rc,rb)*rhmin(gc,gb)/255/pGM->m_variance[0],2)+pow((gc-gb)/pGM->m_variance[1],2)+pow((bc-bb)/pGM->m_variance[2],2))+log(pGM->m_variance[0]*pGM->m_variance[1]*pGM->m_variance[2]);
				if(eval<gmm_bg)
				{
					gmm_bg = eval;
					which = i;
				}
				//gmm_bg += pGM->m_weight*eval;
				//wsum1 += pGM->m_weight;
			}
			else break;
		}
		LGM *pGM = pGMM->m_ptr[which];
		rb = pGM->m_mean[0];
		gb = pGM->m_mean[1];
		bb = pGM->m_mean[2];
/*07.10
		GM *pGM_S = pGMM_S->m_ptr[0];
		if(pGM_S->m_background)//Is a background_S component
		{
			rb = pGM_S->m_mean[0];
			gb = pGM_S->m_mean[1];
			bb = pGM_S->m_mean[2];
			eval = Habs(rc,rb)*rhmin(gc,gb)/255+fabs(gc-gb)+fabs(bc-bb);
			if(eval<gmm_bg)
			{
				gmm_bg = eval;
				rb = pGM_S->m_mean[0];
				gb = pGM_S->m_mean[1];
				bb = pGM_S->m_mean[2];
			}
		}
07.10*/
		shadow = 0.0;
		if(bc<=bb)
		{
			shadow =(float) ((1.0-(bb-bc)/255.0)*(1.0-fabs(gc-gb)/255.0)*
				(1.0-Habs(rc,rb)*rhmin(gc,gb)/255.0/360.0));
			//shadow += pGM->m_weight*(1.0-(bb-bc)/255.0)*(1.0-fabs(gc-gb)/255.0)*(1.0-Habs(rc,rb)*rhmin(gc,gb)/255.0/360.0);
			//wsum2 += pGM->m_weight;
		}
		//if(wsum1>0.0) gmm_bg /= wsum1;
		//if(wsum2>0.0) shadow /= wsum2;
		g->set_tweights(node[x][y],P1+P5*shadow,P2*gmm_bg);
		//fprintf(fout,"%f ",gmm_bg);
	}
	}


	float term;
	float delta;
	BYTE *bytepixel1,*bytepixel2;
	for(x = 0; x < m_imageWidth-1; x++)
	for(y = 0; y < m_imageHeight; y++)
	{
		bytepixel1=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*y))[x*3];
		bytepixel2=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*(y+1)))[x*3];
// 		bytepixel1=cvGetpixel(cur_Image,x,y);
// 		bytepixel2=cvGetpixel(cur_Image,x+1,y);
		delta =(float) ((abs(bytepixel1[0]-bytepixel2[0])+
			abs(bytepixel1[1]-bytepixel2[1])+abs(bytepixel1[2]-bytepixel2[2]))/3.0);
		term =(float) (P3*(1.0-atan(delta)/1.57)+P4);
		g->add_edge(node[x][y],node[x+1][y],term,term);
	}

	for(x = 0; x < m_imageWidth; x++)
	for(y = 0; y < m_imageHeight-1; y++)
	{
		bytepixel1=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*y))[x*3];
		bytepixel2=&((uchar*)(cur_Image->imageData + cur_Image->widthStep*(y+1)))[x*3];
// 		bytepixel1=cvGetpixel(cur_Image,x,y);
// 		bytepixel2=cvGetpixel(cur_Image,x,y+1);
		delta =(float) ((abs(bytepixel1[0]-bytepixel2[0])+
			abs(bytepixel1[1]-bytepixel2[1])+abs(bytepixel1[2]-bytepixel2[2]))/3.0);
		term =(float) (P3*(1.0-atan(delta)/1.57)+P4);
		g->add_edge(node[x][y],node[x][y+1],term,term);
	}

	CString numb;
//	CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
	float energy = g->maxflow();
//	long energy = g->revised_maxflow();
	numb.Format("%d The energy given by dynamic gmmCut: E=",index,energy); 
//	pMain->m_wndStatusBar.SetPaneText(0,numb,true);

	cvCopy(cur_Image,hsvcurImage,NULL);	//临时用hsvcurImage显示图像,这里的cur_Image由cvQueryFrame获得不可更改
	for(x = 0; x < m_imageWidth; x++)
	for(y = 0; y < m_imageHeight; y++)
	{    
		if(g->what_segment(node[x][y]) == LGraph::SOURCE) 
		{
//			cvSetPixel(cur_Image, x, y, 200, 200, 200);
			cvSetPixel(hsvcurImage, x, y, 255, 255, 255);
		}
		//if(g->what_segment(node[x][y]) == Graph::SOURCE) resImage->setPixel(x,y,qRgb(0,0,255));
	}
//	sprintf(fileNameStr,"%s/seg_reslut/%03d.bmp",directoryname,index);
	cvDestroyAllWindows();
	cvNamedWindow("runseg_Image", CV_WINDOW_AUTOSIZE);
	cvConvertImage( hsvcurImage, curImage, CV_CVTIMG_FLIP);
	CString Sindex;
	Sindex.Format("%4d",index);
//	cvSaveImage( directoryname + "//seg_reslut//" + Sindex + ".bmp", curImage);
	if (index_nmb) 
	{	cvShowImage("runseg_Image", curImage);
		cvWaitKey(1);
		cvReleaseImage(&curImage);
		cvReleaseImage(&hsvcurImage);
		destructGraph();
	}
	cvShowImage("runseg_Image", curImage);
	cvWaitKey(1);
	cvReleaseImage(&curImage);
	cvReleaseImage(&hsvcurImage);
}

BOOL CCameraVideo::cvSetPixelHSV(IplImage* img,int x,int y,int H,int S,int V)
//写入(x,y)点的HSV象素值,返回BOOL 顺序是H,S,V(when 8bit)
{	
	(img->imageData + img->widthStep*y)[x*3]=int(H/2);
	(img->imageData + img->widthStep*y)[x*3+1]=S;
	(img->imageData + img->widthStep*y)[x*3+2]=V;
	return true;
}

//写入(x,y)点的RGB象素值,返回BOOL 
BOOL CCameraVideo::cvSetPixel(IplImage* img,int x,int y,int R,int G,int B)
{	
	(img->imageData + img->widthStep*y)[x*3]=B;
	(img->imageData + img->widthStep*y)[x*3+1]=G;
	(img->imageData + img->widthStep*y)[x*3+2]=R;
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -