www.pudn.com > src.rar > skeleton.c


#include <stdio.h>
#include <sys/param.h>
#include <string.h>
#include <tina/sys.h>
#include <tina/sysfuncs.h>
#include <tina/math.h>
#include <tina/mathfuncs.h>
#include <tina/vision.h>
#include <tina/visionfuncs.h>
#include <tina/file.h>
#include <tina/filefuncs.h>
#include <tina/file_gen.h>
#include <tina/tv.h>
#include <tina/tvfuncs.h>
#include <tina/toolsfuncs.h>
#include <tina/tw_Xfuncs.h>


static int stereo_images = 1;

/* interactive global variables for access via dialog box */
static double sigma = 2.0;
static double precision = 0.001;

static void mono_skeleton_proc(void)
{
Tv *tv;
Imrect *im;

tv = mono_tv();
im = mono_image();
if (tv != NULL) /* get roi from tv */
im = im_subim(im, tv_get_im_roi(tv));
im = imf_grad_h(im);
mono_image_set(im);
tv_flush(tv);
}

void stereo_skeleton_proc(void)
{
Imrect *left_im=left_image_get(), *right_im=right_image_get();
Tv *tv;
Imrect *im;
Imrect *er;
Vec2 ul, lr;
Imregion *roi;
Imrect *stored_left_corners(), *stored_right_corners();

if (left_im == NULL || right_im == NULL)
return;

tv = left_tv();
im = left_image();
if (tv != NULL) /* get roi from tv */
im = im_subim(im, tv_get_im_roi(tv));
im = imf_grad_h(im);
left_image_set(im);
tv_flush(tv);

tv = right_tv();
im = right_image();
if (tv != NULL) /* get roi from tv */
im = im_subim(im, tv_get_im_roi(tv));
im = imf_grad_h(im);
right_image_set(im);
tv_flush(tv);
}

static void update_pcam(void)
{
Camera *lcam, *rcam;
Parcam *pcam_get();

lcam = left_camera();
rcam = right_camera();

if (lcam == NULL || rcam == NULL)
{
error("no camera data", non_fatal);
return;
}

pcam_set(parcam_make(lcam, rcam, CAMERA_PHYSICAL));
}

/**** Image choice callback ****/

static void image_choice_proc(int value)
{
switch (value)
{
case 0:
stereo_images = 1;
break;
case 1:
stereo_images = 0;
break;
}
}

/** Pick function callbacks **/

static void mono_pick_proc(Tv_pick(*func) ())
{
tv_set_pick(mono_tv(), (*func) ());
tv_set_activity(mono_tv(), PICK);
}

static void left_pick_proc( Tv_pick(*func) ())
{
tv_set_pick(left_tv(), (*func) ());
tv_set_activity(left_tv(), PICK);
}

static void right_pick_proc(Tv_pick(*func) ())
{
tv_set_pick(right_tv(), (*func) ());
tv_set_activity(right_tv(), PICK);
}

/** Mouse function callbacks **/

static void mono_mouse_proc(Tv_mouse(*func) ())
{
tv_set_mouse(mono_tv(), (*func) ());
tv_set_activity(mono_tv(), MOUSE);
}

static void left_mouse_proc(Tv_mouse(*func) ())
{
update_pcam();
tv_set_mouse(left_tv(), (*func) ());
tv_set_activity(left_tv(), MOUSE);
}

static void right_mouse_proc(Tv_mouse(*func) ())
{
update_pcam();
tv_set_mouse(right_tv(), (*func) ());
tv_set_activity(right_tv(), MOUSE);
}

/*** Paramter dialog callbacks ***/

static void skeleton_param_dialog(void)
{
static void *dialog = NULL;

if (dialog)
{
tw_show_dialog(dialog);
return;
}

dialog = tw_dialog("Skeleton Parameters");

tw_fglobal("sigma :", &amt;sigma, 20);
tw_newrow();
tw_fglobal("precision :", &amt;precision, 20);

tw_end_dialog();
}

/********** Tool creation **********/

void skeleton_tool(int x, int y)
{
static void *tool = NULL;

if (tool)
{
tw_show_tool(tool);
return;
}

tool = (void *)tw_tool("Skeleton Tool", x, y);

tw_menubar("Pick: ",
"mono",
"null", mono_pick_proc, null_pick,
NULL,
"left",
"null", left_pick_proc, null_pick,
NULL,
"right",
"null", right_pick_proc, null_pick,
NULL,
NULL);

tw_label(" ");
tw_help_button("skeleton");

tw_newrow();
tw_menubar("Mouse:",
"mono",
"null", mono_mouse_proc, null_mouse,
NULL,
"left",
"null", left_mouse_proc, null_mouse,
"epi", left_mouse_proc, left_epi_mouse,
"rast", left_mouse_proc, left_raster_mouse,
NULL,
"right",
"null", right_mouse_proc, null_mouse,
"epi", right_mouse_proc, right_epi_mouse,
"rast", right_mouse_proc, right_raster_mouse,
NULL,
NULL);

tw_newrow();
tw_choice("Image Select:",
image_choice_proc, 0, "stereo images", "mono image", NULL);

tw_newrow();
tw_button("mono", mono_skeleton_proc, NULL);
tw_button("stereo", stereo_skeleton_proc, NULL);
tw_newrow();
tw_button("Skeleton Params", skeleton_param_dialog, NULL);

tw_end_tool();
}