⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 tracciatore di mani con webcam
💻 CPP
字号:
#include "main.h"#include <stdio.h>#include <stdlib.h>#include <AR/param.h>#include <AR/ar.h>#include <AR/arMulti.h>#include <AR/video.h>#include "gsub.h"#include "sdlut.h"//#include "util.h"#include "callbacks.h"//#include "video.h"//#include "image.h"#include "hv_ARtk_demo.h"#include <sys/stat.h>#include <errno.h>using namespace std;void EXIT_WITH_ERROR ( char *msg );//-------------------------------------------------------------------------// global variables//-------------------------------------------------------------------------char *programName = "arwin";static char *single_filename  = "data/single.dat";static char *multi_filename   = "data/ARmulti.dat";//static char *multi_filename   = "data/multi.dat";static char *cparam_filename  = "data/camera_para.dat";//static char *startup_filename = "data/startup.dat";#ifdef USE_CGCGcontext cgContext;#endif#ifdef V4Lstatic char *vconf = "";#elsestatic char *vconf = "-mode=640x480_YUV411 -rate=30";#endifvector< Marker * > floater_markers;ARMultiMarkerInfoT *multi_markers;Marker *current_marker = NULL;ARParam cparam;int threshold = 150;int xsize, ysize;int windowx, windowy;double aspectRatio;GLint viewport[ 4 ];GLdouble projectionMatrix[ 16 ];int videopassthrough = 1;int fullscreen = 0;int grabinput = 0;char *displaystr = ":0";bool fsaa = true;bool take_snapshots = false;bool fullsize_snapshots = false;bool fixed_world = false;bool reset_world_once = true;char* conductor_fname = "../config/ARtk.conductor";char* save_fname_root = NULL;extern int hv_pointer_dist;//-------------------------------------------------------------------------// function prototypes//-------------------------------------------------------------------------int main( int, char ** );static void parseArgs( int, char ** );static void usage();static void init();static void contextInit();static void displayInit();static void readFloaters( const char * );//static void readStartupConfig( const char * );// draggingvoid initObjs();void ResetWorld();#ifdef USE_CGstatic void cgErrorCallback();#endif//-------------------------------------------------------------------------// startup and init functions//-------------------------------------------------------------------------int main( int argc, char **argv ){  parseArgs( argc, argv );  init();  sdlutDisplayFunc( displayInit );  sdlutMainLoop();  cleanup();  return 0;}void parseArgs( int argc, char **argv ){  int i = 1;  while( i < argc )  {    if( strncmp( argv[i], "--fullscreen", 13 ) == 0 )    {      fullscreen = 1;      ++i;    }    else if( strncmp( argv[i], "--nofullscreen", 15 ) == 0 )    {      fullscreen = 0;      ++i;    }    else if( strncmp( argv[i], "--grabinput", 12 ) == 0 )    {      grabinput = 1;      ++i;    }    else if( strncmp( argv[i], "--nograbinput", 14 ) == 0 )    {      grabinput = 0;      ++i;    }    else if( strncmp( argv[i], "--videopassthrough", 19 ) == 0 )    {      videopassthrough = 1;      ++i;    }    else if( strncmp( argv[i], "--novideopassthrough", 19 ) == 0 )    {      videopassthrough = 0;      ++i;    }    else if( strncmp( argv[i], "--display", 10 ) == 0 )    {      ++i;      displaystr = argv[i];      ++i;    }    else if( strncmp( argv[i], "--conductor", 12 ) == 0 )    {      ++i;      conductor_fname = argv[i];      ++i;    }    else if( strncmp( argv[i], "--pointerdist", 14 ) == 0 )    {      ++i;      hv_pointer_dist = atoi( argv[i] );      ++i;    }    else if( strncmp( argv[i], "--snapshots", 14 ) == 0 )    {      ++i;      take_snapshots = true;    }    else if( strncmp( argv[i], "--fullsnaps", 14 ) == 0 )    {      ++i;      fullsize_snapshots = true;    }    else if( strncmp( argv[i], "--fixedworld", 13 ) == 0 )    {      ++i;      fixed_world = true;      reset_world_once = true;    }    else if( strncmp( argv[i], "--threshold", 12 ) == 0 )    {      ++i;      threshold = atoi( argv[i] );      ++i;    }    else if( strncmp( argv[i], "--nofsaa", 9 ) == 0 )    {      ++i;      fsaa = false;    }    else    {      fprintf( stderr, "ERROR: unrecognized option: %s\n", argv[i] );      fflush( stderr );      usage();      exit( 1 );    }  }}void usage(){  fprintf( stderr, "usage: ./hv_ARtk [ --fullscreen ] [ --conductor filename ]" );  fprintf( stderr, " [ --display :<id> ] [ --nofsaa ] [ --fixedword ] [ --pointerdist n ] [ --threshod n ]\n" );  fflush( stderr );}void init(){  ARParam wparam;  if( arVideoOpen( vconf ) < 0 )    EXIT_WITH_ERROR( "arVdeoOpen" );    if( arVideoInqSize( &xsize, &ysize ) < 0 )    EXIT_WITH_ERROR( "arVideoInqSize" );  if( arParamLoad( cparam_filename, 1, &wparam ) < 0 )    EXIT_WITH_ERROR( "arParamLoad" );  arParamChangeSize( &wparam, xsize, ysize, &cparam );  arInitCparam( &cparam );  // load floaters  readFloaters( single_filename );  if( floater_markers.size() == 0 )    EXIT_WITH_ERROR( "readSingles" );  // load space registers  multi_markers = arMultiReadConfigFile( multi_filename );  if( multi_markers == NULL )    EXIT_WITH_ERROR( "arMultiReadConfigFile" );  // for take_snapshots, which can be turned on dynamically  framePixels = new unsigned char[ xsize * ysize * 3 ];  contextInit();#ifdef USE_CG  // initialize Cg context  cgSetErrorCallback( cgErrorCallback );  cgContext = cgCreateContext();#endif//  readStartupConfig( startup_filename );    //  // directory to save snapshots in  //  if (save_fname_root==NULL) {    const char *home = getenv("HOME");    if (home==NULL) {      save_fname_root = (char*) alloca(20);      sprintf(save_fname_root, "/tmp/hv_pics/");    } else {      save_fname_root = (char*) alloca(strlen(home)+20);      sprintf(save_fname_root, "%s/hv_pics", home);    }  }  // create it if it doesn't exist  struct stat st;  int error = stat(save_fname_root, &st);#ifdef HAVE_STAT_EMPTY_STRING_BUG  if (strlen(save_fname_root)==0) {    error = -1;    errno = ENOENT;  }#endif if (error!=0 && errno==ENOENT || !S_ISDIR(st.st_mode)) {#if defined(HAVE_MKDIR)    mode_t mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;    error = mkdir(save_fname_root, mode);    if (error) {      fprintf(stderr, "can not create directory %s\n", save_fname_root);      exit(-1);    }    fprintf(stderr, "created directory for snapshots: %s\n", save_fname_root);#else    fprintf(stderr, "please create the following directory: %s\n", 	    save_fname_root);    exit(-1);#endif  }  hv_init(conductor_fname, save_fname_root, xsize, ysize);  initObjs();  if (reset_world_once) {    ResetWorld();  }}void contextInit(){  argInit( &cparam, 1.0, 0, 0, 0 );  argInitContext( fullscreen, fsaa );  SDL_EnableKeyRepeat( 250, 10 );  if( grabinput )    SDL_WM_GrabInput( SDL_GRAB_ON );  // two-sided lighting, use both sides of the polgyons  glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );  // use infinite viewer for specular lighting - looks good, speedy  glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );}void displayInit(){  arVideoCapStart();  arUtilSleep( 500 );  argDrawMode2D();  argDrawMode3D();  argDraw3dCamera( 0, 0 );    glGetIntegerv( GL_VIEWPORT, viewport );  glGetDoublev( GL_PROJECTION_MATRIX, projectionMatrix );  glClearColor( 0.0, 0.0, 0.0, 0.0 );  glClear( GL_COLOR_BUFFER_BIT );  sdlutSwapBuffers();  glClear( GL_COLOR_BUFFER_BIT );  sdlutSwapBuffers();  sdlutKeyboardFunc( keyboardFunc );  sdlutMouseFunc( mouseFunc );  sdlutMotionFunc( motionFunc );  sdlutIdleFunc( idleFunc );  sdlutDisplayFunc( displayFunc );  if( fsaa )  {    glEnable( GL_MULTISAMPLE_ARB );    glHint( GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST );  }}//-------------------------------------------------------------------------// cleanup functions//-------------------------------------------------------------------------void cleanup(){  for( vector< Marker * >::iterator i = floater_markers.begin() ;       i != floater_markers.end() ; ++i )  {    arFreePatt( ( *i )->id );    delete *i;  }  if( multi_markers )  {    if( multi_markers->marker )      free( multi_markers->marker );    free( multi_markers );  }  // destroy cg context?  arVideoCapStop();  arVideoClose();  argCleanup();  sdlutDestroyWindow();}void quit(){  cleanup();  exit( 0 );}void reload(){  EXIT_WITH_ERROR( "reload" );}//-------------------------------------------------------------------------// marker functions//-------------------------------------------------------------------------Marker * findMarker( const char *patt ){  for( vector< Marker * >::iterator i = floater_markers.begin() ;       i != floater_markers.end() ; ++i )  {    if( ( *i )->name == string( patt ) )      return *i;  }  return NULL;}#ifdef USE_CGvoid cgErrorCallback (){  CGerror error = cgGetError();  if( error )   {    const char *listing = cgGetLastListing( cgContext );    fprintf( stderr, "--------------------------------------------------------------------------\n" );    fprintf( stderr, "ERROR: Cg error\n" );    fprintf( stderr, "%s\n\n", cgGetErrorString( error ) );    fprintf( stderr, "%s\n", listing );    fprintf( stderr, "--------------------------------------------------------------------------\n" );    exit( 1 );  }}#endif // USE_CG//-------------------------------------------------------------------------// config file functions//-------------------------------------------------------------------------char * getNextLine( char *line, int size, FILE *fp ){  char *retval;  while( 1 )  {    retval = fgets( line, size, fp );    if( retval == NULL )      return NULL;    if( line[0] != '\n' && line[0] != '#' )      return retval;  }}void readFloaters( const char *filename ){#undef CLOSE_AND_RETURN#define CLOSE_AND_RETURN { floater_markers.clear(); fclose( fp ); return; }  FILE *fp = fopen( filename, "r" );  if( fp == NULL )    CLOSE_AND_RETURN;  char pattern_filename[1024];  char line[1024];  getNextLine( line, 1024, fp );  int num;  if( sscanf( line, "%d", &num ) != 1 )    CLOSE_AND_RETURN;  if( num < 1 )    CLOSE_AND_RETURN;  floater_markers.clear();  floater_markers.reserve( num );  for( int i = 0 ; i < num ; ++i )  {    Marker *m = new Marker();    floater_markers.push_back( m );    getNextLine( line, 1024, fp );    if( sscanf( line, "%s", pattern_filename ) != 1 )      CLOSE_AND_RETURN;    string temp = pattern_filename;    m->name = temp.substr( temp.find_last_of( '.' ) + 1 );    m->id = arLoadPatt( pattern_filename );    if( m->id < 0 )      CLOSE_AND_RETURN;    m->visible = false;    getNextLine( line, 1024, fp );    if( sscanf( line, "%lf", &m->width ) != 1 )      CLOSE_AND_RETURN;    getNextLine( line, 1024, fp );    if( sscanf( line, "%lf %lf", &m->center[0], &m->center[1] ) != 2 )      CLOSE_AND_RETURN;  }  fclose( fp );}inline void EXIT_WITH_ERROR ( char *msg ){  fprintf( stderr, "ERROR: %s\n", msg );  fflush( stderr );  exit( 1 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -