graphcut.h
来自「动态场景中运动目标检测提取与跟踪 对新手很有用」· C头文件 代码 · 共 164 行
H
164 行
#ifndef GRAPHCUT_H
#define GRAPHCUT_H
#include "graph.h"
#include "math.h"
double getE2(int xr,int xs,int Ir, int Is,int bgr,int bgs);
#define K1 5
#define GAMAZ 10
void graphCuts(int height, int width, int** PV,double** w,int* bgV,bool* b)
{
typedef Graph<double,double,double> GraphType;
GraphType *g = new GraphType( width*height, (width-1)*height+(height-1)*width);
//int node_num=0;
for(int x=0;x<width;x++)
for(int y=0;y<height;y++)
{
g->add_node();
//给t-link赋值,0代表source,1 代表sink
//g->add_tweights(y*width+x,-log(w[y*width+x][0]),-log(w[y*width+x][1]));
}
for(x=0;x<width;x++)
for(int y=0;y<height;y++)
{
//g->add_node();
//给t-link赋值,0代表source,1 代表sink
g->add_tweights(y*width+x,-log(w[y*width+x][0]),-log(w[y*width+x][1]));
}
//ofstream output("e2.txt",ios::ate);
for(x=1;x<width;x++)
for(int y=1;y<height;y++)
{
int index1=y*width+x;
int index2=(y-1)*width+x;
double E2=getE2(PV[index1][0],PV[index2][0],
PV[index1][1],PV[index2][1],
bgV[index1],bgV[index2]);
if(E2<0)
{
E2=0;
}
//output<<x<<","<<y<<","<<PV[index1][1]<<","<<PV[index2][1]<<","<<E2<<",";
g -> add_edge(index1, index2, E2, E2 );//与上面的点
index2=y*width+x-1;
E2=getE2(PV[index1][0],PV[index2][0],
PV[index1][1],PV[index2][1],
bgV[index1],bgV[index2]);
if(E2<0)
{
E2=0;
}
//output<<PV[index1][1]<<","<<PV[index2][1]<<","<<E2<<endl;
g -> add_edge( index1,index2, E2, E2 );//与左面的点
}
for(x=1;x<width;x++)
{
int index2=x-1;
double E2=getE2(PV[x][0],PV[index2][0],
PV[x][1],PV[index2][1],
bgV[x],bgV[index2]);
if(E2<0)
{
E2=0;
}
g -> add_edge( x,index2, E2, E2 );//与左面的点
}
for(int y=1;y<height;y++)
{
int index1=y*width;
int index2=(y-1)*width;
double E2=getE2(PV[index1][0],PV[index2][0],
PV[index1][1],PV[index2][1],
bgV[index1],bgV[index2]);
if(E2<0)
{
E2=0;
}
g -> add_edge( index1,index2, E2, E2 );//与上面的点
}
double flow = g -> maxflow();
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
if(g->what_segment(i*width+j) == GraphType::SOURCE)
b[i*width+j]=false;
else
b[i*width+j]=true;
}
delete g;
}
double getDrs(int Irb, int Isb);
double getDrs(int Ir, int Is, int Irb, int Irs);
double getE2(int xr,int xs,int Ir, int Is,int bgr,int bgs)
{
double mm;
double beita;//=1.0/(2*(getDrs(bgr,bgs)));
if((mm=getDrs(bgr,bgs))==0)
{
beita=1;
}
else
{
beita=1.0/(2*mm);
}
//cout<<getDrs(bgr,bgs)<<endl;
//cout<<"beita"<<beita<<endl;
return fabs((abs(xr-xs)*exp(-beita*getDrs(Ir,Is,bgr,bgs))));
}
double getDrs(int Irb, int Isb)
{
Irb &=0x00ffffff;
int rred=(Irb>>16) & 0xff;
int rgreen=(Irb>>8) & 0xff;
int rblue=Irb & 0xff;
Isb &=0x00ffffff;
int sred=(Isb>>16) & 0xff;
int sgreen=(Isb>>8) & 0xff;
int sblue=Isb & 0xff;
return ((rred-sred)*(rred-sred)+(rgreen-sgreen)*(rgreen-sgreen)
+(rblue-sblue)*(rblue-sblue));
}
double getDrs(int Ir, int Is, int Irb, int Isb)
{
Ir &=0x00ffffff;
int rred=(Ir>>16) & 0xff;
int rgreen=(Ir>>8) & 0xff;
int rblue=Ir & 0xff;
Is &=0x00ffffff;
int sred=(Is>>16) & 0xff;
int sgreen=(Is>>8) & 0xff;
int sblue=Is & 0xff;
double drs= ((rred-sred)*(rred-sred)+(rgreen-sgreen)*(rgreen-sgreen)
+(rblue-sblue)*(rblue-sblue));
Irb &=0x00ffffff;
int rredb=(Irb>>16) & 0xff;
int rgreenb=(Irb>>8) & 0xff;
int rblueb=Irb & 0xff;
Isb &=0x00ffffff;
int sredb=(Isb>>16) & 0xff;
int sgreenb=(Isb>>8) & 0xff;
int sblueb=Isb & 0xff;
double drsb= ((rredb-sredb)*(rredb-sredb)+(rgreenb-sgreenb)*(rgreenb-sgreenb)
+(rblueb-sblueb)*(rblueb-sblueb));
double zrs1=((rredb-rred)*(rredb-rred)+(rgreenb-rgreen)*(rgreenb-rgreen)
+(rblueb-rblue)*(rblueb-rblue));
double zrs2=((sredb-sred)*(sredb-sred)+(sgreenb-sgreen)*(sgreenb-sgreen)
+(sblueb-sblue)*(sblueb-sblue));
double zrs= (zrs1>zrs2 ? zrs1 : zrs2);
return (drs/((1+(drsb/(K1*K1)))*exp(-zrs/GAMAZ)));
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?