int arGetPatt( ARUint8 *image, int *x_coord, int *y_coord, int *vertex, ARUint8 ext_pat[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3] ) { ARUint32 ext_pat2[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3]; double world[4][2]; double local[4][2]; double para[3][3]; double d, xw, yw; int xc, yc; int xdiv, ydiv; int xdiv2, ydiv2; int lx1, lx2, ly1, ly2; int i, j; // int k1, k2, k3; // unreferenced double xdiv2_reciprocal; // [tp] double ydiv2_reciprocal; // [tp] int ext_pat2_x_index; int ext_pat2_y_index; int image_index; world[0][0] = 100.0; world[0][1] = 100.0; world[1][0] = 100.0 + 10.0; world[1][1] = 100.0; world[2][0] = 100.0 + 10.0; world[2][1] = 100.0 + 10.0; world[3][0] = 100.0; world[3][1] = 100.0 + 10.0; for( i = 0; i < 4; i++ ) { local[i][0] = x_coord[vertex[i]]; local[i][1] = y_coord[vertex[i]]; } get_cpara( world, local, para ); lx1 = (int)((local[0][0] - local[1][0])*(local[0][0] - local[1][0]) + (local[0][1] - local[1][1])*(local[0][1] - local[1][1])); lx2 = (int)((local[2][0] - local[3][0])*(local[2][0] - local[3][0]) + (local[2][1] - local[3][1])*(local[2][1] - local[3][1])); ly1 = (int)((local[1][0] - local[2][0])*(local[1][0] - local[2][0]) + (local[1][1] - local[2][1])*(local[1][1] - local[2][1])); ly2 = (int)((local[3][0] - local[0][0])*(local[3][0] - local[0][0]) + (local[3][1] - local[0][1])*(local[3][1] - local[0][1])); if( lx2 > lx1 ) lx1 = lx2; if( ly2 > ly1 ) ly1 = ly2; xdiv2 = AR_PATT_SIZE_X; ydiv2 = AR_PATT_SIZE_Y; if( arImageProcMode == AR_IMAGE_PROC_IN_FULL ) { while( xdiv2*xdiv2 < lx1/4 ) xdiv2*=2; while( ydiv2*ydiv2 < ly1/4 ) ydiv2*=2; } else { while( xdiv2*xdiv2*4 < lx1/4 ) xdiv2*=2; while( ydiv2*ydiv2*4 < ly1/4 ) ydiv2*=2; } if( xdiv2 > AR_PATT_SAMPLE_NUM ) xdiv2 = AR_PATT_SAMPLE_NUM; if( ydiv2 > AR_PATT_SAMPLE_NUM ) ydiv2 = AR_PATT_SAMPLE_NUM; xdiv = xdiv2/AR_PATT_SIZE_X; ydiv = ydiv2/AR_PATT_SIZE_Y; /* printf("%3d(%f), %3d(%f)\n", xdiv2, sqrt(lx1), ydiv2, sqrt(ly1)); */ xdiv2_reciprocal = 1.0 / xdiv2; ydiv2_reciprocal = 1.0 / ydiv2; put_zero( (ARUint8 *)ext_pat2, AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3*sizeof(ARUint32) ); for( j = 0; j < ydiv2; j++ ) { yw = 102.5 + 5.0 * (j+0.5) * ydiv2_reciprocal; for( i = 0; i < xdiv2; i++ ) { xw = 102.5 + 5.0 * (i+0.5) * xdiv2_reciprocal; d = para[2][0]*xw + para[2][1]*yw + para[2][2]; if( d == 0 ) return(-1); xc = (int)((para[0][0]*xw + para[0][1]*yw + para[0][2])/d); yc = (int)((para[1][0]*xw + para[1][1]*yw + para[1][2])/d); if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) { xc = ((xc+1)/2)*2; yc = ((yc+1)/2)*2; } if( xc >= 0 && xc < arImXsize && yc >= 0 && yc < arImYsize ) { ext_pat2_y_index = j/ydiv; ext_pat2_x_index = i/xdiv; image_index = (yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT; #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+3]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+2]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+1]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+2]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+3]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+0]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+2]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+0]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+2]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+2]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+0]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+2]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+0]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+1]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+1]; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs) ext_pat2[ext_pat2_y_index][ext_pat2_x_index][0] += image[image_index+0]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][1] += image[image_index+0]; ext_pat2[ext_pat2_y_index][ext_pat2_x_index][2] += image[image_index+0]; #else # error Unknown default pixel format defined in config.h #endif } } } for( j = 0; j < AR_PATT_SIZE_Y; j++ ) { for( i = 0; i < AR_PATT_SIZE_X; i++ ) { // PRL 2006-06-08. ext_pat[j][i][0] = ext_pat2[j][i][0] / (xdiv*ydiv); ext_pat[j][i][1] = ext_pat2[j][i][1] / (xdiv*ydiv); ext_pat[j][i][2] = ext_pat2[j][i][2] / (xdiv*ydiv); } } return(0); }
int arGetPatt( ARUint8 *image, int *x_coord, int *y_coord, int *vertex, ARUint8 ext_pat[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3] ) { double world[4][2]; double local[4][2]; double para[3][3]; double d, xw, yw; int xc, yc; int i, j; int k1, k2, k3; world[0][0] = 100.0; world[0][1] = 100.0; world[1][0] = 100.0 + 10.0; world[1][1] = 100.0; world[2][0] = 100.0 + 10.0; world[2][1] = 100.0 + 10.0; world[3][0] = 100.0; world[3][1] = 100.0 + 10.0; for( i = 0; i < 4; i++ ) { local[i][0] = x_coord[vertex[i]]; local[i][1] = y_coord[vertex[i]]; } get_cpara( world, local, para ); put_zero( (ARUint8 *)ext_pat, AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3 ); for( j = 0; j < AR_PATT_SAMPLE_NUM; j++ ) { yw = 102.5 + 5.0 * (j+0.5) / (double)AR_PATT_SAMPLE_NUM; for( i = 0; i < AR_PATT_SAMPLE_NUM; i++ ) { xw = 102.5 + 5.0 * (i+0.5) / (double)AR_PATT_SAMPLE_NUM; d = para[2][0]*xw + para[2][1]*yw + para[2][2]; if( d == 0 ) return(-1); xc = (int)((para[0][0]*xw + para[0][1]*yw + para[0][2])/d); yc = (int)((para[1][0]*xw + para[1][1]*yw + para[1][2])/d); if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) { xc = ((xc+1)/2)*2; yc = ((yc+1)/2)*2; } if( xc >= 0 && xc < arImXsize && yc >= 0 && yc < arImYsize ) { #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+3]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+3]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+2]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+1]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs) k1 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k1 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] + k1*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][0] = (k1 > 255)? 255: k1; k2 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k2 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] + k2*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][1] = (k2 > 255)? 255: k2; k3 = image[(yc*arImXsize+xc)*AR_PIX_SIZE_DEFAULT+0]; k3 = ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] + k3*(AR_PATT_SIZE_Y*AR_PATT_SIZE_X)/(AR_PATT_SAMPLE_NUM*AR_PATT_SAMPLE_NUM); ext_pat[j*AR_PATT_SIZE_Y/AR_PATT_SAMPLE_NUM][i*AR_PATT_SIZE_X/AR_PATT_SAMPLE_NUM][2] = (k3 > 255)? 255: k3; #else # error Unknown default pixel format defined in config.h #endif } } } return(0); }
int arGetPatt( ARUint8 *image, int *x_coord, int *y_coord, int *vertex, ARUint8 ext_pat[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3] ) { ARUint32 ext_pat2[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3]; double world[4][2]; double local[4][2]; double para[3][3]; double d, xw, yw; int xc, yc; int xdiv, ydiv; int xdiv2, ydiv2; int lx1, lx2, ly1, ly2; int i, j; // int k1, k2, k3; // unreferenced world[0][0] = 100.0; world[0][1] = 100.0; world[1][0] = 100.0 + 10.0; world[1][1] = 100.0; world[2][0] = 100.0 + 10.0; world[2][1] = 100.0 + 10.0; world[3][0] = 100.0; world[3][1] = 100.0 + 10.0; for( i = 0; i < 4; i++ ) { local[i][0] = x_coord[vertex[i]]; local[i][1] = y_coord[vertex[i]]; } get_cpara( world, local, para ); lx1 = (local[0][0] - local[1][0])*(local[0][0] - local[1][0]) + (local[0][1] - local[1][1])*(local[0][1] - local[1][1]); lx2 = (local[2][0] - local[3][0])*(local[2][0] - local[3][0]) + (local[2][1] - local[3][1])*(local[2][1] - local[3][1]); ly1 = (local[1][0] - local[2][0])*(local[1][0] - local[2][0]) + (local[1][1] - local[2][1])*(local[1][1] - local[2][1]); ly2 = (local[3][0] - local[0][0])*(local[3][0] - local[0][0]) + (local[3][1] - local[0][1])*(local[3][1] - local[0][1]); if( lx2 > lx1 ) lx1 = lx2; if( ly2 > ly1 ) ly1 = ly2; xdiv2 = AR_PATT_SIZE_X; ydiv2 = AR_PATT_SIZE_Y; if( arImageProcMode == AR_IMAGE_PROC_IN_FULL ) { while( xdiv2*xdiv2 < lx1/4 ) xdiv2*=2; while( ydiv2*ydiv2 < ly1/4 ) ydiv2*=2; } else { while( xdiv2*xdiv2*4 < lx1/4 ) xdiv2*=2; while( ydiv2*ydiv2*4 < ly1/4 ) ydiv2*=2; } if( xdiv2 > AR_PATT_SAMPLE_NUM ) xdiv2 = AR_PATT_SAMPLE_NUM; if( ydiv2 > AR_PATT_SAMPLE_NUM ) ydiv2 = AR_PATT_SAMPLE_NUM; xdiv = xdiv2/AR_PATT_SIZE_X; ydiv = ydiv2/AR_PATT_SIZE_Y; /* printf("%3d(%f), %3d(%f)\n", xdiv2, sqrt(lx1), ydiv2, sqrt(ly1)); */ put_zero( (ARUint8 *)ext_pat2, AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3*sizeof(ARUint32) ); for( j = 0; j < ydiv2; j++ ) { yw = 102.5 + 5.0 * (j+0.5) / (double)ydiv2; for( i = 0; i < xdiv2; i++ ) { xw = 102.5 + 5.0 * (i+0.5) / (double)xdiv2; d = para[2][0]*xw + para[2][1]*yw + para[2][2]; if( d == 0 ) return(-1); xc = (int)((para[0][0]*xw + para[0][1]*yw + para[0][2])/d); yc = (int)((para[1][0]*xw + para[1][1]*yw + para[1][2])/d); if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) { xc = ((xc+1)/2)*2; yc = ((yc+1)/2)*2; } if( xc >= 0 && xc < arImXsize && yc >= 0 && yc < arImYsize ) { #ifdef AR_PIX_FORMAT_ABGR ext_pat2[j/ydiv][i/xdiv][0] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+1]; ext_pat2[j/ydiv][i/xdiv][1] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+2]; ext_pat2[j/ydiv][i/xdiv][2] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+3]; #endif #ifdef AR_PIX_FORMAT_BGRA ext_pat2[j/ydiv][i/xdiv][0] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+0]; ext_pat2[j/ydiv][i/xdiv][1] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+1]; ext_pat2[j/ydiv][i/xdiv][2] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+2]; #endif #ifdef AR_PIX_FORMAT_BGR ext_pat2[j/ydiv][i/xdiv][0] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+0]; ext_pat2[j/ydiv][i/xdiv][1] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+1]; ext_pat2[j/ydiv][i/xdiv][2] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+2]; #endif #ifdef AR_PIX_FORMAT_RGBA ext_pat2[j/ydiv][i/xdiv][0] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+2]; ext_pat2[j/ydiv][i/xdiv][1] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+1]; ext_pat2[j/ydiv][i/xdiv][2] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+0]; #endif #ifdef AR_PIX_FORMAT_RGB ext_pat2[j/ydiv][i/xdiv][0] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+2]; ext_pat2[j/ydiv][i/xdiv][1] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+1]; ext_pat2[j/ydiv][i/xdiv][2] += image[(yc*arImXsize+xc)*AR_PIX_SIZE+0]; #endif } } } for( j = 0; j < AR_PATT_SIZE_Y; j++ ) { for( i = 0; i < AR_PATT_SIZE_Y; i++ ) { ext_pat[j][i][0] = ext_pat2[j][i][0] / (xdiv*ydiv); ext_pat[j][i][1] = ext_pat2[j][i][1] / (xdiv*ydiv); ext_pat[j][i][2] = ext_pat2[j][i][2] / (xdiv*ydiv); } } return(0); }