AR2ImageSetT* ar2GenImageSet(ARUint8 *image, int xsize, int ysize, int nc, float dpi, float dpi_list[], int dpi_num) { AR2ImageSetT *imageSet; int i; if (nc != 1 && nc != 3) return NULL; if (dpi_num <= 0) return NULL; if (dpi_list[0] > dpi) return NULL; for (i = 1; i < dpi_num; i++) { if (dpi_list[i] > dpi_list[0]) return NULL; } arMalloc(imageSet, AR2ImageSetT, 1); imageSet->num = dpi_num; arMalloc(imageSet->scale, AR2ImageT*, imageSet->num); imageSet->scale[0] = ar2GenImageLayer1(image, xsize, ysize, nc, dpi, dpi_list[0]); for (i = 1; i < dpi_num; i++) { imageSet->scale[i] = ar2GenImageLayer2(imageSet->scale[0], dpi_list[i]); } return imageSet; }
AR2ImageSetT *ar2ReadImageSet( char *filename ) { FILE *fp; AR2JpegImageT *jpgImage; AR2ImageSetT *imageSet; float dpi; int i, k1; #if AR2_CAPABLE_ADAPTIVE_TEMPLATE int j, k2; ARUint *p1, *p2; #endif size_t len; const char ext[] = ".iset"; char *buf; len = strlen(filename) + strlen(ext) + 1; // +1 for nul terminator. arMalloc(buf, char, len); sprintf(buf, "%s%s", filename, ext); fp = fopen(buf, "rb"); free(buf); if (!fp) { ARLOGe("Error: unable to open file '%s%s' for reading.\n", filename, ext); return (NULL); } arMalloc( imageSet, AR2ImageSetT, 1 ); if( fread(&(imageSet->num), sizeof(imageSet->num), 1, fp) != 1 || imageSet->num <= 0) { ARLOGe("Error reading imageSet.\n"); goto bail; } ARLOGi("Imageset contains %d images.\n", imageSet->num); arMalloc( imageSet->scale, AR2ImageT*, imageSet->num ); arMalloc( imageSet->scale[0], AR2ImageT, 1 ); jpgImage = ar2ReadJpegImage2(fp); // Caller must free result. if( jpgImage == NULL || jpgImage->nc != 1 ) { ARLOGw("Falling back to reading '%s%s' in ARToolKit v4.x format.\n", filename, ext); free(imageSet->scale[0]); free(imageSet->scale); free(imageSet); if( jpgImage == NULL ) { rewind(fp); return ar2ReadImageSetOld(fp); } free(jpgImage); //COVHI10396 fclose(fp); return NULL; } imageSet->scale[0]->xsize = jpgImage->xsize; imageSet->scale[0]->ysize = jpgImage->ysize; imageSet->scale[0]->dpi = jpgImage->dpi; // The dpi value is not read correctly by jpeglib embedded in OpenCV 2.2.x. #if AR2_CAPABLE_ADAPTIVE_TEMPLATE imageSet->scale[0]->imgBWBlur[0] = jpgImage->image; // Create the blurred images. for( j = 1; j < AR2_BLUR_IMAGE_MAX; j++ ) { arMalloc( imageSet->scale[0]->imgBWBlur[j], ARUint8, imageSet->scale[0]->xsize * imageSet->scale[0]->ysize); p1 = dst->imgBWBlur[0]; p2 = dst->imgBWBlur[i]; for( k1 = 0; k1 < imageSet->scale[0]->xsize * imageSet->scale[0]->ysize; k1++ ) *(p2++) = *(p1++); defocus_image( imageSet->scale[0]->imgBWBlur[j], imageSet->scale[0]->xsize, imageSet->scale[0]->ysize, 3 ); } #else imageSet->scale[0]->imgBW = jpgImage->image; #endif free(jpgImage); // Minify for the other scales. // First, find the list of scales we wrote into the file. fseek(fp, (long)(-(int)sizeof(dpi)*(imageSet->num - 1)), SEEK_END); for( i = 1; i < imageSet->num; i++ ) { if( fread(&dpi, sizeof(dpi), 1, fp) != 1 ) { for( k1 = 0; k1 < i; k1++ ) { #if AR2_CAPABLE_ADAPTIVE_TEMPLATE for( k2 = 0; k2 < AR2_BLUR_IMAGE_MAX; k2++ ) free(imageSet->scale[k1]->imgBWBlur[k2]); #else free(imageSet->scale[k1]->imgBW); #endif free(imageSet->scale[k1]); } goto bail1; } imageSet->scale[i] = ar2GenImageLayer2( imageSet->scale[0], dpi ); if( imageSet->scale[i] == NULL ) { for( k1 = 0; k1 < i; k1++ ) { #if AR2_CAPABLE_ADAPTIVE_TEMPLATE for( k2 = 0; k2 < AR2_BLUR_IMAGE_MAX; k2++ ) free(imageSet->scale[k1]->imgBWBlur[k2]); #else free(imageSet->scale[k1]->imgBW); #endif free(imageSet->scale[k1]); } goto bail1; } } fclose(fp); return imageSet; bail1: free(imageSet->scale); bail: free(imageSet); fclose(fp); return NULL; }