[artoolkit-commits] artoolkit/examples/paddle paddle.c,1.1,1.2 paddleTest.c,1.1,1.2
Optical marker tracking and overlay for augmented reality.
Brought to you by:
philip_lamb
From: Philip L. <phi...@us...> - 2004-12-02 00:47:46
|
Update of /cvsroot/artoolkit/artoolkit/examples/paddle In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21077 Modified Files: paddle.c paddleTest.c Log Message: Fix some build warnings. Index: paddleTest.c =================================================================== RCS file: /cvsroot/artoolkit/artoolkit/examples/paddle/paddleTest.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** paddleTest.c 22 Nov 2004 03:38:33 -0000 1.1 --- paddleTest.c 2 Dec 2004 00:47:36 -0000 1.2 *************** *** 1,340 **** ! #ifdef _WIN32 ! #include <windows.h> ! #endif ! #include <stdio.h> ! #include <stdlib.h> ! #include <string.h> ! #include <math.h> ! ! #include <GL/gl.h> ! #include <GL/glut.h> ! #include <AR/gsub.h> ! #include <AR/param.h> ! #include <AR/ar.h> ! #include <AR/video.h> ! #include <AR/arMulti.h> ! ! #include "paddle.h" ! int draw_paddle( ARPaddleInfo *paddleInfo ); ! ! int xsize, ysize; ! int thresh = 100; ! int count = 0; ! ! char *cparam_name = "Data/camera_para.dat"; ! ARParam cparam; ! ! /* set video capture configuration */ ! /*****************************************************************************/ ! // modified by Thomas Pintaric, Vienna University of Technology ! ! #ifdef _WIN32 ! char *vconf = "flipV,showDlg"; // see video.h for a list of supported parameters ! #else ! char *vconf = ""; ! #endif ! /*****************************************************************************/ ! ! char *config_name = "Data/multi/marker.dat"; ! ARMultiMarkerInfoT *config; ! ! //MB - paddle information ! int marker_flag[AR_SQUARE_MAX]; ! ARPaddleInfo *paddleInfo; ! char *paddle_name = "Data/paddle_data"; ! ! static void init(void); ! static void cleanup(void); ! static void keyEvent( unsigned char key, int x, int y); ! static void mainLoop(void); ! static void draw( double trans1[3][4], double trans2[3][4], int mode ); ! ! int main() ! { ! //initialize application ! init(); ! ! arVideoCapStart(); ! ! //start the main event loop ! argMainLoop( NULL, keyEvent, mainLoop ); ! ! return 0; ! } ! ! static void keyEvent( unsigned char key, int x, int y) ! { ! /* quit if the ESC key is pressed */ ! if( key == 0x1b ) { ! printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); ! cleanup(); ! exit(0); ! } ! ! /* turn on and off the debug mode with d key */ ! if( key == 'd' ) { ! printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); ! arDebug = 1 - arDebug; ! if( arDebug == 0 ) { ! glClearColor( 0.0, 0.0, 0.0, 0.0 ); ! glClear(GL_COLOR_BUFFER_BIT); ! argSwapBuffers(); ! glClear(GL_COLOR_BUFFER_BIT); ! argSwapBuffers(); ! } ! count = 0; ! } ! } ! ! /* main loop */ ! static void mainLoop(void) ! { ! ARUint8 *dataPtr; ! ARMarkerInfo *marker_info; ! int marker_num; ! int i; ! double err; ! ! /* grab a video frame */ ! if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { ! arUtilSleep(2); ! return; ! } ! ! if( count == 0 ) arUtilTimerReset(); ! count++; ! ! /* detect the markers in the video frame */ ! if( arDetectMarkerLite(dataPtr, thresh, &marker_info, &marker_num) < 0 ) { ! cleanup(); ! exit(0); ! } ! ! argDrawMode2D(); ! if( !arDebug ) { ! argDispImage( dataPtr, 0,0 ); ! } ! else { ! argDispImage( dataPtr, 1, 1 ); ! if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) ! argDispHalfImage( arImage, 0, 0 ); ! else ! argDispImage( arImage, 0, 0); ! ! glColor3f( 1.0, 0.0, 0.0 ); ! glLineWidth( 1.0 ); ! for( i = 0; i < marker_num; i++ ) { ! argDrawSquare( marker_info[i].vertex, 0, 0 ); ! } ! glLineWidth( 1.0 ); ! } ! ! arVideoCapNext(); ! ! //MB - multiple marker tracking ! for( i = 0; i < marker_num; i++ ) marker_flag[i] = 0; ! ! /* get the paddle position */ ! paddleGetTrans(paddleInfo, marker_info, marker_flag, ! marker_num, &cparam); ! ! /* draw the 3D models */ ! glClearDepth( 1.0 ); ! glClear(GL_DEPTH_BUFFER_BIT); ! ! /* draw the paddle */ ! if( paddleInfo->active ){ ! draw_paddle( paddleInfo); ! } ! ! /* get the translation from the multimarker pattern */ ! if( (err=arMultiGetTransMat(marker_info, marker_num, config)) < 0 ) { ! argSwapBuffers(); ! return; ! } ! ! //printf("err = %f\n", err); ! if(err > 100.0 ) { ! argSwapBuffers(); ! return; ! } ! ! /* draw the multimarker pattern */ ! for( i = 0; i < config->marker_num; i++ ) { ! if( config->marker[i].visible >= 0 ) ! draw( config->trans, config->marker[i].trans, 0 ); ! else ! draw( config->trans, config->marker[i].trans, 1 ); ! } ! ! argSwapBuffers(); ! } ! ! static void init( void ) ! { ! ARParam wparam; ! ! /* open the video path */ ! if( arVideoOpen( vconf ) < 0 ) exit(0); ! /* find the size of the window */ ! if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0); ! printf("Image size (x,y) = (%d,%d)\n", xsize, ysize); ! ! /* set the initial camera parameters */ ! if( arParamLoad(cparam_name, 1, &wparam) < 0 ) { ! printf("Camera parameter load error !!\n"); ! exit(0); ! } ! arParamChangeSize( &wparam, xsize, ysize, &cparam ); ! arInitCparam( &cparam ); ! printf("*** Camera Parameter ***\n"); ! arParamDisp( &cparam ); ! ! /* load the paddle marker file */ ! if( (paddleInfo = paddleInit(paddle_name)) == NULL ) { ! printf("paddleInit error!!\n"); ! exit(0); ! } ! printf("Loaded Paddle File\n"); ! ! if( (config = arMultiReadConfigFile(config_name)) == NULL ) { ! printf("config data load error !!\n"); ! exit(0); ! } ! printf("Loaded Multi Marker File\n"); ! ! /* open the graphics window */ ! // argInit( &cparam, 2.0, 0, 2, 1, 0 ); ! argInit( &cparam, 1.0, 0, 0, 0, 0 ); ! ! } ! ! /* cleanup function called when program exits */ ! static void cleanup(void) ! { ! arVideoCapStop(); ! arVideoClose(); ! argCleanup(); ! } ! ! static void draw( double trans1[3][4], double trans2[3][4], int mode ) ! { ! double gl_para[16]; ! GLfloat mat_ambient[] = {0.0, 0.0, 1.0, 1.0}; ! GLfloat mat_ambient1[] = {1.0, 0.0, 0.0, 1.0}; ! GLfloat mat_flash[] = {0.0, 0.0, 1.0, 1.0}; ! GLfloat mat_flash1[] = {1.0, 0.0, 0.0, 1.0}; ! GLfloat mat_flash_shiny[] = {50.0}; ! GLfloat mat_flash_shiny1[]= {50.0}; ! GLfloat light_position[] = {100.0,-200.0,200.0,0.0}; ! GLfloat ambi[] = {0.1, 0.1, 0.1, 0.1}; ! GLfloat lightZeroColor[] = {0.9, 0.9, 0.9, 0.1}; ! ! argDrawMode3D(); ! argDraw3dCamera( 0, 0 ); ! glEnable(GL_DEPTH_TEST); ! glDepthFunc(GL_LEQUAL); ! ! /* load the camera transformation matrix */ ! glMatrixMode(GL_MODELVIEW); ! argConvGlpara(trans1, gl_para); ! glLoadMatrixd( gl_para ); ! argConvGlpara(trans2, gl_para); ! glMultMatrixd( gl_para ); ! ! if( mode == 0 ) { ! glEnable(GL_LIGHTING); ! glEnable(GL_LIGHT0); ! glLightfv(GL_LIGHT0, GL_POSITION, light_position); ! glLightfv(GL_LIGHT0, GL_AMBIENT, ambi); ! glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor); ! glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash); ! glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny); ! glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); ! } ! else { ! glEnable(GL_LIGHTING); ! glEnable(GL_LIGHT0); ! glLightfv(GL_LIGHT0, GL_POSITION, light_position); ! glLightfv(GL_LIGHT0, GL_AMBIENT, ambi); ! glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor); ! glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash1); ! glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny1); ! glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1); ! } ! glMatrixMode(GL_MODELVIEW); ! glTranslatef( 0.0, 0.0, 25.0 ); ! if( !arDebug ) glutSolidCube(50.0); ! else glutWireCube(50.0); ! glDisable( GL_LIGHTING ); ! glDisable( GL_DEPTH_TEST ); ! argDrawMode2D(); ! } ! ! /* draw the paddle - using a stencil buffer */ ! int draw_paddle( ARPaddleInfo *paddleInfo ) ! { ! double gl_para[16]; ! int i; ! ! argDrawMode3D(); ! glEnable(GL_DEPTH_TEST); ! glDepthFunc(GL_LEQUAL); ! ! argDraw3dCamera( 0, 0 ); ! argConvGlpara(paddleInfo->trans, gl_para); ! ! glMatrixMode(GL_MODELVIEW); ! glLoadMatrixd( gl_para ); ! ! /* draw the paddle graphics */ ! glColor3f( 1.0, 0.0, 0.0 ); ! glLineWidth(4.0); ! glBegin(GL_LINE_LOOP); ! glVertex2f( -25.0, -25.0 ); ! glVertex2f( 25.0, -25.0 ); ! glVertex2f( 25.0, 25.0 ); ! glVertex2f( -25.0, 25.0 ); ! glEnd(); ! ! glColor3f( 0.0, 0.0, 1.0); ! glBegin(GL_LINE_LOOP); ! for( i = 0; i < 16; i++ ) { ! double x, y; ! x = PADDLE_RADIUS * cos(i*3.141592*2/16); ! y = PADDLE_RADIUS * sin(i*3.141592*2/16); ! glVertex2d( x, y ); ! } ! glEnd(); ! glBegin(GL_LINE_LOOP); ! glVertex2f( -7.5, 0.0 ); ! glVertex2f( 7.5, 0.0 ); ! glVertex2f( 7.5, -105.0 ); ! glVertex2f( -7.5, -105.0 ); ! glEnd(); ! ! /* start drawing the stencil */ ! glEnable(GL_BLEND); ! glBlendFunc(GL_ZERO,GL_ONE); ! ! glColor4f(1,1,1,0); ! glBegin(GL_POLYGON); ! for( i = 0; i < 16; i++ ) { ! double x, y; ! x = 40.0 * cos(i*3.141592*2/16); ! y = 40.0 * sin(i*3.141592*2/16); ! glVertex2d( x, y ); ! } ! glEnd(); ! glBegin(GL_POLYGON); ! glVertex2f( -7.5, 0.0 ); ! glVertex2f( 7.5, 0.0 ); ! glVertex2f( 7.5, -105.0 ); ! glVertex2f( -7.5, -105.0 ); ! glEnd(); ! glDisable(GL_BLEND); ! ! glDisable(GL_DEPTH_TEST); ! argDrawMode2D(); ! return 0; ! } --- 1,343 ---- ! #ifdef _WIN32 ! # include <windows.h> ! #endif ! #include <stdio.h> ! #include <stdlib.h> ! #include <string.h> ! #include <math.h> ! ! #ifndef __APPLE__ ! # include <GL/glut.h> ! #else ! # include <GLUT/glut.h> ! #endif ! #include <AR/gsub.h> ! #include <AR/param.h> ! #include <AR/ar.h> ! #include <AR/video.h> ! #include <AR/arMulti.h> ! ! #include "paddle.h" ! int draw_paddle( ARPaddleInfo *paddleInfo ); ! ! int xsize, ysize; ! int thresh = 100; ! int count = 0; ! ! char *cparam_name = "Data/camera_para.dat"; ! ARParam cparam; ! ! /* set video capture configuration */ ! /*****************************************************************************/ ! // modified by Thomas Pintaric, Vienna University of Technology ! ! #ifdef _WIN32 ! char *vconf = "flipV,showDlg"; // see video.h for a list of supported parameters ! #else ! char *vconf = ""; ! #endif ! /*****************************************************************************/ ! ! char *config_name = "Data/multi/marker.dat"; ! ARMultiMarkerInfoT *config; ! ! //MB - paddle information ! int marker_flag[AR_SQUARE_MAX]; ! ARPaddleInfo *paddleInfo; ! char *paddle_name = "Data/paddle_data"; ! ! static void init(void); ! static void cleanup(void); ! static void keyEvent( unsigned char key, int x, int y); ! static void mainLoop(void); ! static void draw( double trans1[3][4], double trans2[3][4], int mode ); ! ! int main() ! { ! //initialize application ! init(); ! ! arVideoCapStart(); ! ! //start the main event loop ! argMainLoop( NULL, keyEvent, mainLoop ); ! ! return 0; ! } ! ! static void keyEvent( unsigned char key, int x, int y) ! { ! /* quit if the ESC key is pressed */ ! if( key == 0x1b ) { ! printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); ! cleanup(); ! exit(0); ! } ! ! /* turn on and off the debug mode with d key */ ! if( key == 'd' ) { ! printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); ! arDebug = 1 - arDebug; ! if( arDebug == 0 ) { ! glClearColor( 0.0, 0.0, 0.0, 0.0 ); ! glClear(GL_COLOR_BUFFER_BIT); ! argSwapBuffers(); ! glClear(GL_COLOR_BUFFER_BIT); ! argSwapBuffers(); ! } ! count = 0; ! } ! } ! ! /* main loop */ ! static void mainLoop(void) ! { ! ARUint8 *dataPtr; ! ARMarkerInfo *marker_info; ! int marker_num; ! int i; ! double err; ! ! /* grab a video frame */ ! if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { ! arUtilSleep(2); ! return; ! } ! ! if( count == 0 ) arUtilTimerReset(); ! count++; ! ! /* detect the markers in the video frame */ ! if( arDetectMarkerLite(dataPtr, thresh, &marker_info, &marker_num) < 0 ) { ! cleanup(); ! exit(0); ! } ! ! argDrawMode2D(); ! if( !arDebug ) { ! argDispImage( dataPtr, 0,0 ); ! } ! else { ! argDispImage( dataPtr, 1, 1 ); ! if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) ! argDispHalfImage( arImage, 0, 0 ); ! else ! argDispImage( arImage, 0, 0); ! ! glColor3f( 1.0, 0.0, 0.0 ); ! glLineWidth( 1.0 ); ! for( i = 0; i < marker_num; i++ ) { ! argDrawSquare( marker_info[i].vertex, 0, 0 ); ! } ! glLineWidth( 1.0 ); ! } ! ! arVideoCapNext(); ! ! //MB - multiple marker tracking ! for( i = 0; i < marker_num; i++ ) marker_flag[i] = 0; ! ! /* get the paddle position */ ! paddleGetTrans(paddleInfo, marker_info, marker_flag, ! marker_num, &cparam); ! ! /* draw the 3D models */ ! glClearDepth( 1.0 ); ! glClear(GL_DEPTH_BUFFER_BIT); ! ! /* draw the paddle */ ! if( paddleInfo->active ){ ! draw_paddle( paddleInfo); ! } ! ! /* get the translation from the multimarker pattern */ ! if( (err=arMultiGetTransMat(marker_info, marker_num, config)) < 0 ) { ! argSwapBuffers(); ! return; ! } ! ! //printf("err = %f\n", err); ! if(err > 100.0 ) { ! argSwapBuffers(); ! return; ! } ! ! /* draw the multimarker pattern */ ! for( i = 0; i < config->marker_num; i++ ) { ! if( config->marker[i].visible >= 0 ) ! draw( config->trans, config->marker[i].trans, 0 ); ! else ! draw( config->trans, config->marker[i].trans, 1 ); ! } ! ! argSwapBuffers(); ! } ! ! static void init( void ) ! { ! ARParam wparam; ! ! /* open the video path */ ! if( arVideoOpen( vconf ) < 0 ) exit(0); ! /* find the size of the window */ ! if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0); ! printf("Image size (x,y) = (%d,%d)\n", xsize, ysize); ! ! /* set the initial camera parameters */ ! if( arParamLoad(cparam_name, 1, &wparam) < 0 ) { ! printf("Camera parameter load error !!\n"); ! exit(0); ! } ! arParamChangeSize( &wparam, xsize, ysize, &cparam ); ! arInitCparam( &cparam ); ! printf("*** Camera Parameter ***\n"); ! arParamDisp( &cparam ); ! ! /* load the paddle marker file */ ! if( (paddleInfo = paddleInit(paddle_name)) == NULL ) { ! printf("paddleInit error!!\n"); ! exit(0); ! } ! printf("Loaded Paddle File\n"); ! ! if( (config = arMultiReadConfigFile(config_name)) == NULL ) { ! printf("config data load error !!\n"); ! exit(0); ! } ! printf("Loaded Multi Marker File\n"); ! ! /* open the graphics window */ ! // argInit( &cparam, 2.0, 0, 2, 1, 0 ); ! argInit( &cparam, 1.0, 0, 0, 0, 0 ); ! ! } ! ! /* cleanup function called when program exits */ ! static void cleanup(void) ! { ! arVideoCapStop(); ! arVideoClose(); ! argCleanup(); ! } ! ! static void draw( double trans1[3][4], double trans2[3][4], int mode ) ! { ! double gl_para[16]; ! GLfloat mat_ambient[] = {0.0, 0.0, 1.0, 1.0}; ! GLfloat mat_ambient1[] = {1.0, 0.0, 0.0, 1.0}; ! GLfloat mat_flash[] = {0.0, 0.0, 1.0, 1.0}; ! GLfloat mat_flash1[] = {1.0, 0.0, 0.0, 1.0}; ! GLfloat mat_flash_shiny[] = {50.0}; ! GLfloat mat_flash_shiny1[]= {50.0}; ! GLfloat light_position[] = {100.0,-200.0,200.0,0.0}; ! GLfloat ambi[] = {0.1, 0.1, 0.1, 0.1}; ! GLfloat lightZeroColor[] = {0.9, 0.9, 0.9, 0.1}; ! ! argDrawMode3D(); ! argDraw3dCamera( 0, 0 ); ! glEnable(GL_DEPTH_TEST); ! glDepthFunc(GL_LEQUAL); ! ! /* load the camera transformation matrix */ ! glMatrixMode(GL_MODELVIEW); ! argConvGlpara(trans1, gl_para); ! glLoadMatrixd( gl_para ); ! argConvGlpara(trans2, gl_para); ! glMultMatrixd( gl_para ); ! ! if( mode == 0 ) { ! glEnable(GL_LIGHTING); ! glEnable(GL_LIGHT0); ! glLightfv(GL_LIGHT0, GL_POSITION, light_position); ! glLightfv(GL_LIGHT0, GL_AMBIENT, ambi); ! glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor); ! glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash); ! glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny); ! glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); ! } ! else { ! glEnable(GL_LIGHTING); ! glEnable(GL_LIGHT0); ! glLightfv(GL_LIGHT0, GL_POSITION, light_position); ! glLightfv(GL_LIGHT0, GL_AMBIENT, ambi); ! glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor); ! glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash1); ! glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny1); ! glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1); ! } ! glMatrixMode(GL_MODELVIEW); ! glTranslatef( 0.0, 0.0, 25.0 ); ! if( !arDebug ) glutSolidCube(50.0); ! else glutWireCube(50.0); ! glDisable( GL_LIGHTING ); ! glDisable( GL_DEPTH_TEST ); ! argDrawMode2D(); ! } ! ! /* draw the paddle - using a stencil buffer */ ! int draw_paddle( ARPaddleInfo *paddleInfo ) ! { ! double gl_para[16]; ! int i; ! ! argDrawMode3D(); ! glEnable(GL_DEPTH_TEST); ! glDepthFunc(GL_LEQUAL); ! ! argDraw3dCamera( 0, 0 ); ! argConvGlpara(paddleInfo->trans, gl_para); ! ! glMatrixMode(GL_MODELVIEW); ! glLoadMatrixd( gl_para ); ! ! /* draw the paddle graphics */ ! glColor3f( 1.0, 0.0, 0.0 ); ! glLineWidth(4.0); ! glBegin(GL_LINE_LOOP); ! glVertex2f( -25.0, -25.0 ); ! glVertex2f( 25.0, -25.0 ); ! glVertex2f( 25.0, 25.0 ); ! glVertex2f( -25.0, 25.0 ); ! glEnd(); ! ! glColor3f( 0.0, 0.0, 1.0); ! glBegin(GL_LINE_LOOP); ! for( i = 0; i < 16; i++ ) { ! double x, y; ! x = PADDLE_RADIUS * cos(i*3.141592*2/16); ! y = PADDLE_RADIUS * sin(i*3.141592*2/16); ! glVertex2d( x, y ); ! } ! glEnd(); ! glBegin(GL_LINE_LOOP); ! glVertex2f( -7.5, 0.0 ); ! glVertex2f( 7.5, 0.0 ); ! glVertex2f( 7.5, -105.0 ); ! glVertex2f( -7.5, -105.0 ); ! glEnd(); ! ! /* start drawing the stencil */ ! glEnable(GL_BLEND); ! glBlendFunc(GL_ZERO,GL_ONE); ! ! glColor4f(1,1,1,0); ! glBegin(GL_POLYGON); ! for( i = 0; i < 16; i++ ) { ! double x, y; ! x = 40.0 * cos(i*3.141592*2/16); ! y = 40.0 * sin(i*3.141592*2/16); ! glVertex2d( x, y ); ! } ! glEnd(); ! glBegin(GL_POLYGON); ! glVertex2f( -7.5, 0.0 ); ! glVertex2f( 7.5, 0.0 ); ! glVertex2f( 7.5, -105.0 ); ! glVertex2f( -7.5, -105.0 ); ! glEnd(); ! glDisable(GL_BLEND); ! ! glDisable(GL_DEPTH_TEST); ! argDrawMode2D(); ! return 0; ! } Index: paddle.c =================================================================== RCS file: /cvsroot/artoolkit/artoolkit/examples/paddle/paddle.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** paddle.c 22 Nov 2004 03:38:33 -0000 1.1 --- paddle.c 2 Dec 2004 00:47:36 -0000 1.2 *************** *** 1,155 **** ! #include <stdio.h> ! #include <malloc.h> ! #include <stdlib.h> ! #include <AR/ar.h> ! #include "paddle.h" ! ! static ARMarkerInfo prevInfoL; ! static ARMarkerInfo prevInfoR; ! static int pcountL = 0; ! static int pcountR = 0; ! ! static char *get_buff( char *buf, int n, FILE *fp ); ! ! static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag, ! int marker_num, int id, ! ARMarkerInfo *prevInfo, int *pcount ); ! ! ! ARPaddleInfo *paddleInit( char *name ) ! { ! FILE *fp; ! ARPaddleInfo *paddleInfo; ! char buf[256], buf1[256]; ! ! if( (fp=fopen(name, "r")) == NULL ) return(0); ! ! arMalloc( paddleInfo, ARPaddleInfo, 1 ); ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%s", paddleInfo->name) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%s", buf1) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! if( (paddleInfo->marker_id = arLoadPatt(buf1)) < 0 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%lf", &paddleInfo->width) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! paddleInfo->center[0] = 0.0; ! paddleInfo->center[1] = 0.0; ! paddleInfo->active = 0; ! paddleInfo->pcount = 0; ! paddleInfo->pcountL = 0; ! paddleInfo->pcountR = 0; ! ! fclose(fp); ! ! return paddleInfo; ! } ! ! static char *get_buff( char *buf, int n, FILE *fp ) ! { ! char *ret; ! ! for(;;) { ! ret = fgets( buf, n, fp ); ! if( ret == NULL ) return(NULL); ! if( buf[0] != '\n' && buf[0] != '#' ) return(ret); ! } ! } ! ! int paddleGetTrans( ARPaddleInfo *paddleInfo, ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, ARParam *cparam ) ! { ! int id; ! ! id = get_marker( markerInfo, markerFlag, marker_num, paddleInfo->marker_id, ! &(paddleInfo->prevInfo), &(paddleInfo->pcount) ); ! ! if( id == -1 ) { paddleInfo->active = 0; return 0; } ! ! arGetTransMat(&markerInfo[id], ! paddleInfo->center, paddleInfo->width, paddleInfo->trans); ! markerFlag[id] = 1; ! ! paddleInfo->active = 1; ! ! return 0; ! } ! ! static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, int id, ! ARMarkerInfo *prevInfo, int *pcount ) ! { ! double rlen, rlenmin, rarea, diff, diffmin; ! int cid, cdir; ! int i, j; ! ! cid = -1; ! for( i = 0; i < marker_num; i++ ) { ! if( markerInfo[i].id == id && markerFlag[i] == 0 ) { ! if( cid == -1 ) cid = i; ! else { ! if( markerInfo[cid].cf < markerInfo[i].cf ) cid = i; ! } ! } ! } ! if( cid == -1 ) { ! if( *pcount == 0 ) return -1; ! ! rlenmin = 10.0; ! for( i = 0; i < marker_num; i++ ) { ! if( markerFlag[i] ) continue; ! rarea = (double)prevInfo->area / (double)markerInfo[i].area; ! if( rarea < 0.7 || rarea > 1.43 ) continue; ! rlen = ( (markerInfo[i].pos[0] - prevInfo->pos[0]) ! * (markerInfo[i].pos[0] - prevInfo->pos[0]) ! + (markerInfo[i].pos[1] - prevInfo->pos[1]) ! * (markerInfo[i].pos[1] - prevInfo->pos[1]) ) / markerInfo[i].area; ! if( rlen < 0.5 && rlen < rlenmin ) { ! rlenmin = rlen; ! cid = i; ! } ! } ! if( cid >= 0 && markerInfo[cid].cf < prevInfo->cf ) { ! markerInfo[cid].cf = prevInfo->cf; ! markerInfo[cid].id = prevInfo->id; ! diffmin = 10000.0 * 10000.0; ! cdir = -1; ! for( i = 0; i < 4; i++ ) { ! diff = 0.0; ! for( j = 0; j < 4; j++ ) { ! diff += (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0]) ! * (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0]) ! + (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1]) ! * (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1]); ! } ! if( diff < diffmin ) { ! diffmin = diff; ! cdir = (prevInfo->dir - i + 4) % 4; ! } ! } ! markerInfo[cid].dir = cdir; ! ! *prevInfo = markerInfo[cid]; ! *pcount = 1; ! } ! else { ! *pcount = 0; ! return -1; ! } ! } ! else { ! *prevInfo = markerInfo[cid]; ! *pcount = 1; ! } ! ! return cid; ! } --- 1,149 ---- ! #include <stdio.h> ! #include <stdlib.h> ! #include <AR/ar.h> ! #include "paddle.h" ! ! static char *get_buff( char *buf, int n, FILE *fp ); ! ! static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag, ! int marker_num, int id, ! ARMarkerInfo *prevInfo, int *pcount ); ! ! ! ARPaddleInfo *paddleInit( char *name ) ! { ! FILE *fp; ! ARPaddleInfo *paddleInfo; ! char buf[256], buf1[256]; ! ! if( (fp=fopen(name, "r")) == NULL ) return(0); ! ! arMalloc( paddleInfo, ARPaddleInfo, 1 ); ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%s", paddleInfo->name) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%s", buf1) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! if( (paddleInfo->marker_id = arLoadPatt(buf1)) < 0 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! get_buff(buf, 256, fp); ! if( sscanf(buf, "%lf", &paddleInfo->width) != 1 ) { ! fclose(fp); free(paddleInfo); return 0; ! } ! ! paddleInfo->center[0] = 0.0; ! paddleInfo->center[1] = 0.0; ! paddleInfo->active = 0; ! paddleInfo->pcount = 0; ! paddleInfo->pcountL = 0; ! paddleInfo->pcountR = 0; ! ! fclose(fp); ! ! return paddleInfo; ! } ! ! static char *get_buff( char *buf, int n, FILE *fp ) ! { ! char *ret; ! ! for(;;) { ! ret = fgets( buf, n, fp ); ! if( ret == NULL ) return(NULL); ! if( buf[0] != '\n' && buf[0] != '#' ) return(ret); ! } ! } ! ! int paddleGetTrans( ARPaddleInfo *paddleInfo, ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, ARParam *cparam ) ! { ! int id; ! ! id = get_marker( markerInfo, markerFlag, marker_num, paddleInfo->marker_id, ! &(paddleInfo->prevInfo), &(paddleInfo->pcount) ); ! ! if( id == -1 ) { paddleInfo->active = 0; return 0; } ! ! arGetTransMat(&markerInfo[id], ! paddleInfo->center, paddleInfo->width, paddleInfo->trans); ! markerFlag[id] = 1; ! ! paddleInfo->active = 1; ! ! return 0; ! } ! ! static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, int id, ! ARMarkerInfo *prevInfo, int *pcount ) ! { ! double rlen, rlenmin, rarea, diff, diffmin; ! int cid, cdir; ! int i, j; ! ! cid = -1; ! for( i = 0; i < marker_num; i++ ) { ! if( markerInfo[i].id == id && markerFlag[i] == 0 ) { ! if( cid == -1 ) cid = i; ! else { ! if( markerInfo[cid].cf < markerInfo[i].cf ) cid = i; ! } ! } ! } ! if( cid == -1 ) { ! if( *pcount == 0 ) return -1; ! ! rlenmin = 10.0; ! for( i = 0; i < marker_num; i++ ) { ! if( markerFlag[i] ) continue; ! rarea = (double)prevInfo->area / (double)markerInfo[i].area; ! if( rarea < 0.7 || rarea > 1.43 ) continue; ! rlen = ( (markerInfo[i].pos[0] - prevInfo->pos[0]) ! * (markerInfo[i].pos[0] - prevInfo->pos[0]) ! + (markerInfo[i].pos[1] - prevInfo->pos[1]) ! * (markerInfo[i].pos[1] - prevInfo->pos[1]) ) / markerInfo[i].area; ! if( rlen < 0.5 && rlen < rlenmin ) { ! rlenmin = rlen; ! cid = i; ! } ! } ! if( cid >= 0 && markerInfo[cid].cf < prevInfo->cf ) { ! markerInfo[cid].cf = prevInfo->cf; ! markerInfo[cid].id = prevInfo->id; ! diffmin = 10000.0 * 10000.0; ! cdir = -1; ! for( i = 0; i < 4; i++ ) { ! diff = 0.0; ! for( j = 0; j < 4; j++ ) { ! diff += (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0]) ! * (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0]) ! + (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1]) ! * (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1]); ! } ! if( diff < diffmin ) { ! diffmin = diff; ! cdir = (prevInfo->dir - i + 4) % 4; ! } ! } ! markerInfo[cid].dir = cdir; ! ! *prevInfo = markerInfo[cid]; ! *pcount = 1; ! } ! else { ! *pcount = 0; ! return -1; ! } ! } ! else { ! *prevInfo = markerInfo[cid]; ! *pcount = 1; ! } ! ! return cid; ! } |