main.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:11k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include "main.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <AR/param.h>
  5. #include <AR/ar.h>
  6. #include <AR/arMulti.h>
  7. #include <AR/video.h>
  8. #include "gsub.h"
  9. #include "sdlut.h"
  10. //#include "util.h"
  11. #include "callbacks.h"
  12. //#include "video.h"
  13. //#include "image.h"
  14. #include "hv_ARtk_demo.h"
  15. #include <sys/stat.h>
  16. #include <errno.h>
  17. using namespace std;
  18. void EXIT_WITH_ERROR ( char *msg );
  19. //-------------------------------------------------------------------------
  20. // global variables
  21. //-------------------------------------------------------------------------
  22. char *programName = "arwin";
  23. static char *single_filename  = "data/single.dat";
  24. static char *multi_filename   = "data/ARmulti.dat";
  25. //static char *multi_filename   = "data/multi.dat";
  26. static char *cparam_filename  = "data/camera_para.dat";
  27. //static char *startup_filename = "data/startup.dat";
  28. #ifdef USE_CG
  29. CGcontext cgContext;
  30. #endif
  31. #ifdef V4L
  32. static char *vconf = "";
  33. #else
  34. static char *vconf = "-mode=640x480_YUV411 -rate=30";
  35. #endif
  36. vector< Marker * > floater_markers;
  37. ARMultiMarkerInfoT *multi_markers;
  38. Marker *current_marker = NULL;
  39. ARParam cparam;
  40. int threshold = 150;
  41. int xsize, ysize;
  42. int windowx, windowy;
  43. double aspectRatio;
  44. GLint viewport[ 4 ];
  45. GLdouble projectionMatrix[ 16 ];
  46. int videopassthrough = 1;
  47. int fullscreen = 0;
  48. int grabinput = 0;
  49. char *displaystr = ":0";
  50. bool fsaa = true;
  51. bool take_snapshots = false;
  52. bool fullsize_snapshots = false;
  53. bool fixed_world = false;
  54. bool reset_world_once = true;
  55. char* conductor_fname = "../config/ARtk.conductor";
  56. char* save_fname_root = NULL;
  57. extern int hv_pointer_dist;
  58. //-------------------------------------------------------------------------
  59. // function prototypes
  60. //-------------------------------------------------------------------------
  61. int main( int, char ** );
  62. static void parseArgs( int, char ** );
  63. static void usage();
  64. static void init();
  65. static void contextInit();
  66. static void displayInit();
  67. static void readFloaters( const char * );
  68. //static void readStartupConfig( const char * );
  69. // dragging
  70. void initObjs();
  71. void ResetWorld();
  72. #ifdef USE_CG
  73. static void cgErrorCallback();
  74. #endif
  75. //-------------------------------------------------------------------------
  76. // startup and init functions
  77. //-------------------------------------------------------------------------
  78. int main( int argc, char **argv )
  79. {
  80.   parseArgs( argc, argv );
  81.   init();
  82.   sdlutDisplayFunc( displayInit );
  83.   sdlutMainLoop();
  84.   cleanup();
  85.   return 0;
  86. }
  87. void parseArgs( int argc, char **argv )
  88. {
  89.   int i = 1;
  90.   while( i < argc )
  91.   {
  92.     if( strncmp( argv[i], "--fullscreen", 13 ) == 0 )
  93.     {
  94.       fullscreen = 1;
  95.       ++i;
  96.     }
  97.     else if( strncmp( argv[i], "--nofullscreen", 15 ) == 0 )
  98.     {
  99.       fullscreen = 0;
  100.       ++i;
  101.     }
  102.     else if( strncmp( argv[i], "--grabinput", 12 ) == 0 )
  103.     {
  104.       grabinput = 1;
  105.       ++i;
  106.     }
  107.     else if( strncmp( argv[i], "--nograbinput", 14 ) == 0 )
  108.     {
  109.       grabinput = 0;
  110.       ++i;
  111.     }
  112.     else if( strncmp( argv[i], "--videopassthrough", 19 ) == 0 )
  113.     {
  114.       videopassthrough = 1;
  115.       ++i;
  116.     }
  117.     else if( strncmp( argv[i], "--novideopassthrough", 19 ) == 0 )
  118.     {
  119.       videopassthrough = 0;
  120.       ++i;
  121.     }
  122.     else if( strncmp( argv[i], "--display", 10 ) == 0 )
  123.     {
  124.       ++i;
  125.       displaystr = argv[i];
  126.       ++i;
  127.     }
  128.     else if( strncmp( argv[i], "--conductor", 12 ) == 0 )
  129.     {
  130.       ++i;
  131.       conductor_fname = argv[i];
  132.       ++i;
  133.     }
  134.     else if( strncmp( argv[i], "--pointerdist", 14 ) == 0 )
  135.     {
  136.       ++i;
  137.       hv_pointer_dist = atoi( argv[i] );
  138.       ++i;
  139.     }
  140.     else if( strncmp( argv[i], "--snapshots", 14 ) == 0 )
  141.     {
  142.       ++i;
  143.       take_snapshots = true;
  144.     }
  145.     else if( strncmp( argv[i], "--fullsnaps", 14 ) == 0 )
  146.     {
  147.       ++i;
  148.       fullsize_snapshots = true;
  149.     }
  150.     else if( strncmp( argv[i], "--fixedworld", 13 ) == 0 )
  151.     {
  152.       ++i;
  153.       fixed_world = true;
  154.       reset_world_once = true;
  155.     }
  156.     else if( strncmp( argv[i], "--threshold", 12 ) == 0 )
  157.     {
  158.       ++i;
  159.       threshold = atoi( argv[i] );
  160.       ++i;
  161.     }
  162.     else if( strncmp( argv[i], "--nofsaa", 9 ) == 0 )
  163.     {
  164.       ++i;
  165.       fsaa = false;
  166.     }
  167.     else
  168.     {
  169.       fprintf( stderr, "ERROR: unrecognized option: %sn", argv[i] );
  170.       fflush( stderr );
  171.       usage();
  172.       exit( 1 );
  173.     }
  174.   }
  175. }
  176. void usage()
  177. {
  178.   fprintf( stderr, "usage: ./hv_ARtk [ --fullscreen ] [ --conductor filename ]" );
  179.   fprintf( stderr, " [ --display :<id> ] [ --nofsaa ] [ --fixedword ] [ --pointerdist n ] [ --threshod n ]n" );
  180.   fflush( stderr );
  181. }
  182. void init()
  183. {
  184.   ARParam wparam;
  185.   if( arVideoOpen( vconf ) < 0 )
  186.     EXIT_WITH_ERROR( "arVdeoOpen" );
  187.   
  188.   if( arVideoInqSize( &xsize, &ysize ) < 0 )
  189.     EXIT_WITH_ERROR( "arVideoInqSize" );
  190.   if( arParamLoad( cparam_filename, 1, &wparam ) < 0 )
  191.     EXIT_WITH_ERROR( "arParamLoad" );
  192.   arParamChangeSize( &wparam, xsize, ysize, &cparam );
  193.   arInitCparam( &cparam );
  194.   // load floaters
  195.   readFloaters( single_filename );
  196.   if( floater_markers.size() == 0 )
  197.     EXIT_WITH_ERROR( "readSingles" );
  198.   // load space registers
  199.   multi_markers = arMultiReadConfigFile( multi_filename );
  200.   if( multi_markers == NULL )
  201.     EXIT_WITH_ERROR( "arMultiReadConfigFile" );
  202.   // for take_snapshots, which can be turned on dynamically
  203.   framePixels = new unsigned char[ xsize * ysize * 3 ];
  204.   contextInit();
  205. #ifdef USE_CG
  206.   // initialize Cg context
  207.   cgSetErrorCallback( cgErrorCallback );
  208.   cgContext = cgCreateContext();
  209. #endif
  210. //  readStartupConfig( startup_filename );
  211.   
  212.   //
  213.   // directory to save snapshots in
  214.   //
  215.   if (save_fname_root==NULL) {
  216.     const char *home = getenv("HOME");
  217.     if (home==NULL) {
  218.       save_fname_root = (char*) alloca(20);
  219.       sprintf(save_fname_root, "/tmp/hv_pics/");
  220.     } else {
  221.       save_fname_root = (char*) alloca(strlen(home)+20);
  222.       sprintf(save_fname_root, "%s/hv_pics", home);
  223.     }
  224.   }
  225.   // create it if it doesn't exist
  226.   struct stat st;
  227.   int error = stat(save_fname_root, &st);
  228. #ifdef HAVE_STAT_EMPTY_STRING_BUG
  229.   if (strlen(save_fname_root)==0) {
  230.     error = -1;
  231.     errno = ENOENT;
  232.   }
  233. #endif
  234.  if (error!=0 && errno==ENOENT || !S_ISDIR(st.st_mode)) {
  235. #if defined(HAVE_MKDIR)
  236.     mode_t mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
  237.     error = mkdir(save_fname_root, mode);
  238.     if (error) {
  239.       fprintf(stderr, "can not create directory %sn", save_fname_root);
  240.       exit(-1);
  241.     }
  242.     fprintf(stderr, "created directory for snapshots: %sn", save_fname_root);
  243. #else
  244.     fprintf(stderr, "please create the following directory: %sn", 
  245.     save_fname_root);
  246.     exit(-1);
  247. #endif
  248.   }
  249.   hv_init(conductor_fname, save_fname_root, xsize, ysize);
  250.   initObjs();
  251.   if (reset_world_once) {
  252.     ResetWorld();
  253.   }
  254. }
  255. void contextInit()
  256. {
  257.   argInit( &cparam, 1.0, 0, 0, 0 );
  258.   argInitContext( fullscreen, fsaa );
  259.   SDL_EnableKeyRepeat( 250, 10 );
  260.   if( grabinput )
  261.     SDL_WM_GrabInput( SDL_GRAB_ON );
  262.   // two-sided lighting, use both sides of the polgyons
  263.   glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
  264.   // use infinite viewer for specular lighting - looks good, speedy
  265.   glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );
  266. }
  267. void displayInit()
  268. {
  269.   arVideoCapStart();
  270.   arUtilSleep( 500 );
  271.   argDrawMode2D();
  272.   argDrawMode3D();
  273.   argDraw3dCamera( 0, 0 );
  274.   
  275.   glGetIntegerv( GL_VIEWPORT, viewport );
  276.   glGetDoublev( GL_PROJECTION_MATRIX, projectionMatrix );
  277.   glClearColor( 0.0, 0.0, 0.0, 0.0 );
  278.   glClear( GL_COLOR_BUFFER_BIT );
  279.   sdlutSwapBuffers();
  280.   glClear( GL_COLOR_BUFFER_BIT );
  281.   sdlutSwapBuffers();
  282.   sdlutKeyboardFunc( keyboardFunc );
  283.   sdlutMouseFunc( mouseFunc );
  284.   sdlutMotionFunc( motionFunc );
  285.   sdlutIdleFunc( idleFunc );
  286.   sdlutDisplayFunc( displayFunc );
  287.   if( fsaa )
  288.   {
  289.     glEnable( GL_MULTISAMPLE_ARB );
  290.     glHint( GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST );
  291.   }
  292. }
  293. //-------------------------------------------------------------------------
  294. // cleanup functions
  295. //-------------------------------------------------------------------------
  296. void cleanup()
  297. {
  298.   for( vector< Marker * >::iterator i = floater_markers.begin() ;
  299.        i != floater_markers.end() ; ++i )
  300.   {
  301.     arFreePatt( ( *i )->id );
  302.     delete *i;
  303.   }
  304.   if( multi_markers )
  305.   {
  306.     if( multi_markers->marker )
  307.       free( multi_markers->marker );
  308.     free( multi_markers );
  309.   }
  310.   // destroy cg context?
  311.   arVideoCapStop();
  312.   arVideoClose();
  313.   argCleanup();
  314.   sdlutDestroyWindow();
  315. }
  316. void quit()
  317. {
  318.   cleanup();
  319.   exit( 0 );
  320. }
  321. void reload()
  322. {
  323.   EXIT_WITH_ERROR( "reload" );
  324. }
  325. //-------------------------------------------------------------------------
  326. // marker functions
  327. //-------------------------------------------------------------------------
  328. Marker * findMarker( const char *patt )
  329. {
  330.   for( vector< Marker * >::iterator i = floater_markers.begin() ;
  331.        i != floater_markers.end() ; ++i )
  332.   {
  333.     if( ( *i )->name == string( patt ) )
  334.       return *i;
  335.   }
  336.   return NULL;
  337. }
  338. #ifdef USE_CG
  339. void cgErrorCallback ()
  340. {
  341.   CGerror error = cgGetError();
  342.   if( error ) 
  343.   {
  344.     const char *listing = cgGetLastListing( cgContext );
  345.     fprintf( stderr, "--------------------------------------------------------------------------n" );
  346.     fprintf( stderr, "ERROR: Cg errorn" );
  347.     fprintf( stderr, "%snn", cgGetErrorString( error ) );
  348.     fprintf( stderr, "%sn", listing );
  349.     fprintf( stderr, "--------------------------------------------------------------------------n" );
  350.     exit( 1 );
  351.   }
  352. }
  353. #endif // USE_CG
  354. //-------------------------------------------------------------------------
  355. // config file functions
  356. //-------------------------------------------------------------------------
  357. char * getNextLine( char *line, int size, FILE *fp )
  358. {
  359.   char *retval;
  360.   while( 1 )
  361.   {
  362.     retval = fgets( line, size, fp );
  363.     if( retval == NULL )
  364.       return NULL;
  365.     if( line[0] != 'n' && line[0] != '#' )
  366.       return retval;
  367.   }
  368. }
  369. void readFloaters( const char *filename )
  370. {
  371. #undef CLOSE_AND_RETURN
  372. #define CLOSE_AND_RETURN { floater_markers.clear(); fclose( fp ); return; }
  373.   FILE *fp = fopen( filename, "r" );
  374.   if( fp == NULL )
  375.     CLOSE_AND_RETURN;
  376.   char pattern_filename[1024];
  377.   char line[1024];
  378.   getNextLine( line, 1024, fp );
  379.   int num;
  380.   if( sscanf( line, "%d", &num ) != 1 )
  381.     CLOSE_AND_RETURN;
  382.   if( num < 1 )
  383.     CLOSE_AND_RETURN;
  384.   floater_markers.clear();
  385.   floater_markers.reserve( num );
  386.   for( int i = 0 ; i < num ; ++i )
  387.   {
  388.     Marker *m = new Marker();
  389.     floater_markers.push_back( m );
  390.     getNextLine( line, 1024, fp );
  391.     if( sscanf( line, "%s", pattern_filename ) != 1 )
  392.       CLOSE_AND_RETURN;
  393.     string temp = pattern_filename;
  394.     m->name = temp.substr( temp.find_last_of( '.' ) + 1 );
  395.     m->id = arLoadPatt( pattern_filename );
  396.     if( m->id < 0 )
  397.       CLOSE_AND_RETURN;
  398.     m->visible = false;
  399.     getNextLine( line, 1024, fp );
  400.     if( sscanf( line, "%lf", &m->width ) != 1 )
  401.       CLOSE_AND_RETURN;
  402.     getNextLine( line, 1024, fp );
  403.     if( sscanf( line, "%lf %lf", &m->center[0], &m->center[1] ) != 2 )
  404.       CLOSE_AND_RETURN;
  405.   }
  406.   fclose( fp );
  407. }
  408. inline void EXIT_WITH_ERROR ( char *msg )
  409. {
  410.   fprintf( stderr, "ERROR: %sn", msg );
  411.   fflush( stderr );
  412.   exit( 1 );
  413. }