#include <stdio.h>
int voronoiType = -1;
int edgeThresh = 100;
static void onTrackbar( int, void* )
{
static const Scalar colors[] =
{
};
int maskSize = voronoiType >= 0 ?
DIST_MASK_5 : maskSize0;
int distType = voronoiType >= 0 ?
DIST_L2 : distType0;
Mat edge = gray >= edgeThresh, dist, labels, dist8u;
if( voronoiType < 0 )
else
if( voronoiType < 0 )
{
dist *= 5000;
Mat dist32s, dist8u1, dist8u2;
dist32s &= Scalar::all(255);
dist32s *= -1;
dist32s += Scalar::all(255);
Mat planes[] = {dist8u1, dist8u2, dist8u2};
merge(planes, 3, dist8u);
}
else
{
dist8u.create(labels.size(),
CV_8UC3);
for(
int i = 0;
i < labels.rows;
i++ )
{
const int* ll = (
const int*)labels.ptr(
i);
const float* dd = (
const float*)dist.ptr(
i);
for( int j = 0; j < labels.cols; j++ )
{
int idx = ll[j] == 0 || dd[j] == 0 ? 0 : (ll[j]-1)%8 + 1;
float scale = 1.f/(1 + dd[j]*dd[j]*0.0004f);
int b =
cvRound(colors[idx][0]*scale);
int g =
cvRound(colors[idx][1]*scale);
int r =
cvRound(colors[idx][2]*scale);
}
}
}
imshow(
"Distance Map", dist8u );
}
static void help()
{
printf("\nProgram to demonstrate the use of the distance transform function between edge images.\n"
"Usage:\n"
"./distrans [image_name -- default image is ../data/stuff.jpg]\n"
"\nHot keys: \n"
"\tESC - quit the program\n"
"\tC - use C/Inf metric\n"
"\tL1 - use L1 metric\n"
"\tL2 - use L2 metric\n"
"\t3 - use 3x3 mask\n"
"\t5 - use 5x5 mask\n"
"\t0 - use precise distance transform\n"
"\tv - switch to Voronoi diagram mode\n"
"\tp - switch to pixel-based Voronoi diagram mode\n"
"\tSPACE - loop through all the modes\n\n");
}
const char* keys =
{
"{@image |../data/stuff.jpg|input image file}"
};
int main( int argc, const char** argv )
{
help();
string filename = parser.get<string>(0);
gray =
imread(filename.c_str(), 0);
if(gray.empty())
{
printf("Cannot read image file: %s\n", filename.c_str());
help();
return -1;
}
createTrackbar(
"Brightness Threshold",
"Distance Map", &edgeThresh, 255, onTrackbar, 0);
for(;;)
{
onTrackbar(0, 0);
if( c == 27 )
break;
if( c == 'c' || c == 'C' || c == '1' || c == '2' ||
c == '3' || c == '5' || c == '0' )
voronoiType = -1;
if( c == 'c' || c == 'C' )
else if( c == '1' )
else if( c == '2' )
else if( c == '3' )
else if( c == '5' )
else if( c == '0' )
else if( c == 'v' )
voronoiType = 0;
else if( c == 'p' )
voronoiType = 1;
else if( c == ' ' )
{
if( voronoiType == 0 )
voronoiType = 1;
else if( voronoiType == 1 )
{
voronoiType = -1;
}
else if( distType0 ==
DIST_C )
voronoiType = 0;
}
}
return 0;
}