📄 graphcutmex.cpp
字号:
/* set user defined labels to graph */
void SetLabels(GCoptimization *MyGraph, int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/* we need exactly 3 input arguments: gch, mode, labels */
if (nrhs != 3 )
mexErrMsgIdAndTxt("GraphCut:SetLabels","Wrong number of input arguments");
if ( mxGetClassID(prhs[2]) != mxINT32_CLASS )
mexErrMsgIdAndTxt("GraphCut:SetLabels","labels array not int32");
if ( mxGetNumberOfElements(prhs[2]) != MyGraph->GetNumPixels() )
mexErrMsgIdAndTxt("GraphCut:SetLabels","wrong number of elements in labels array");
/* verify only one output parameter */
if (nlhs != 1)
mexErrMsgIdAndTxt("GraphCut:SetLabels","wrong number of output parameters");
MyGraph->SetAllLabels( (GCoptimization::LabelType*) mxGetData(prhs[2]) );
}
/**************************************************************************************/
/* set user defined labels to graph */
void GetLabels(GCoptimization *MyGraph, int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/* exactly two input arguments */
if ( nrhs != 2 )
mexErrMsgIdAndTxt("GraphCut:GetLabels","Wrong number of input arguments");
/* we need exactly 2 output arguments: gch, labels */
if (nlhs != 2 )
mexErrMsgIdAndTxt("GraphCut:GetLabels","Wrong number of output arguments");
int dims[2];
/* transposed result */
dims[0] = MyGraph->GetWidth();
dims[1] = MyGraph->GetNumPixels() / dims[0];
plhs[1] = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
MyGraph->ExportLabels( (GCoptimization::LabelType*) mxGetData(plhs[1]) );
}
/**************************************************************************************/
/* support several kinds of a/b swaps:
* 1. defualt - swap till convergence (no extra parameters)
* 2. #iterations - performs #iterations: GraphCut(gch, mode, #iteration)
* 3. swap two labels - GraphCut(gch, mode, l1, l2)
*/
void ABswaps(GCoptimization *MyGraph, int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int max_iterations(0), li(0);
GCoptimization::LabelType label[2] = { 0, 1};
GCoptimization::PixelType *indices = NULL;
/* check inputs */
switch (nrhs) {
case 2:
/* default - expand till convergence */
MyGraph->swap();
break;
case 3:
/* number of iterations */
GetScalar(prhs[2], max_iterations);
if ( max_iterations == 1 )
MyGraph->oneSwapIteration();
else
MyGraph->swap(max_iterations);
break;
case 4:
for ( li = 2; li<4;li++) {
GetScalar(prhs[li], label[li-2]);
if ( label[li-2] < 0 || label[li-2] >= MyGraph->GetNumLabels() )
mexErrMsgIdAndTxt("GraphCut:swap","invalid label value");
}
MyGraph->alpha_beta_swap(label[0], label[1]);
break;
default:
mexErrMsgIdAndTxt("GraphCut:swap","Too many input arguments");
}
/* output: at least one (gch) can output the labels as well */
if ( nlhs > 2 )
mexErrMsgIdAndTxt("GraphCut:swap","too many output arguments");
/* output labels */
if ( nlhs >= 2 ) {
/* set the lables */
int dims[2];
/* transposed result */
dims[0] = MyGraph->GetWidth();
dims[1] = MyGraph->GetNumPixels() / dims[0];
plhs[1] = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
MyGraph->ExportLabels( (GCoptimization::LabelType*) mxGetData(plhs[1]) );
}
}
/**************************************************************************************/
/* support several kinds of expansion
* 1. default - expand untill convergence no extra parameters
* 2. #iterations - performs #iterations: GraphCut(gch, mode, #iteration)
* 3. expand label - expand specific label GraphCut(gch, mode, [], label)
* 4. expand label at specific indices GraphCut(gch, mode, [], label, indices) indices start with zero and not 1 like usuall matlab inices!!
*/
void Expand(GCoptimization *MyGraph, int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int num(0), max_iterations(0);
GCoptimization::LabelType label(0);
GCoptimization::PixelType *indices = NULL;
/* check inputs */
switch (nrhs) {
case 2:
/* default - expand till convergence */
MyGraph->expansion();
break;
case 3:
/* number of iterations */
GetScalar(prhs[2], max_iterations);
if ( max_iterations == 1 )
MyGraph->oneExpansionIteration();
else
MyGraph->expansion(max_iterations);
break;
case 5:
/* get indices */
if (mxGetClassID(prhs[4]) != mxINT32_CLASS)
mexErrMsgIdAndTxt("GraphCut:Expand","indices must be int32");
num = mxGetNumberOfElements(prhs[4]);
if (num < 0 || num > MyGraph->GetNumPixels())
mexErrMsgIdAndTxt("GraphCut:Expand","too many indices");
indices = (GCoptimization::PixelType*)mxGetData(prhs[4]);
case 4:
/* expand specific label */
if (mxGetNumberOfElements(prhs[2]) != 0)
mexErrMsgIdAndTxt("GraphCut:Expand","third argument must empty");
GetScalar(prhs[3], label);
if ( indices != NULL ) {
/* expand specific label at specific indices */
MyGraph->alpha_expansion(label, indices, num);
} else
MyGraph->alpha_expansion(label);
break;
default:
mexErrMsgIdAndTxt("GraphCut:Expand","Too many input arguments");
}
/* output: at least one (gch) can output the labels as well */
if ( nlhs > 2 )
mexErrMsgIdAndTxt("GraphCut:Expand","too many output arguments");
/* output labels */
if ( nlhs >= 2 ) {
/* set the lables */
int dims[2];
/* transposed result */
dims[0] = MyGraph->GetWidth();
dims[1] = MyGraph->GetNumPixels() / dims[0];
plhs[1] = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
MyGraph->ExportLabels( (GCoptimization::LabelType*) mxGetData(plhs[1]) );
}
}
/**************************************************************************************/
/* extract energy of labeling
* [gch se de] = GraphCut(gch, 'n');
*/
void Energy(GCoptimization *MyGraph, int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if ( nrhs != 2 )
mexErrMsgIdAndTxt("GraphCut:Energy","Too many input arguments");
if ( nlhs != 3 )
mexErrMsgIdAndTxt("GraphCut:Energy","wrong number of output arguments");
int dims[2] = {1,0};
GCoptimization::EnergyType *e;
plhs[1] = mxCreateNumericArray(1, dims, mxSINGLE_CLASS, mxREAL);
e = (GCoptimization::EnergyType *)mxGetData(plhs[1]);
*e = MyGraph->giveSmoothEnergy();
plhs[2] = mxCreateNumericArray(1, dims, mxSINGLE_CLASS, mxREAL);
e = (GCoptimization::EnergyType *)mxGetData(plhs[2]);
*e = MyGraph->giveDataEnergy();
}
/**************************************************************************************/
GCoptimization* GetGCHandle(const mxArray *x)
{
GraphHandle gch = 0;
GCoptimization* MyGraph = 0;
if ( mxGetNumberOfElements(x) != 1 ) {
mexErrMsgIdAndTxt("GraphCut:handle",
"Too many GC handles");
}
if ( mxGetClassID(x) != MATLAB_POINTER_TYPE ) {
mexErrMsgIdAndTxt("GraphCut:handle",
"GC handle argument is not of proper type");
}
gch = (GraphHandle*)mxGetData(x);
MyGraph = (GCoptimization*)(*(POINTER_CAST*)gch);
if ( MyGraph==NULL || ! MyGraph->IsClassValid() ) {
mexErrMsgIdAndTxt("GraphCut:handle",
"GC handle is not valid");
}
return MyGraph;
}
/**************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -