📄 lgmm.cpp
字号:
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 + -