/* Read keypoints from the given file pointer and return the list of * keypoints. The file format starts with 2 integers giving the total * number of keypoints and the size of descriptor vector for each * keypoint (currently assumed to be 128). Then each keypoint is * specified by 4 floating point numbers giving subpixel row and * column location, scale, and orientation (in radians from -PI to * PI). Then the descriptor vector for each keypoint is given as a * list of integers in range [0,255]. */ std::vector<Keypoint> ReadKeys(FILE *fp, bool descriptor) { int i, j, num, len, val; std::vector<Keypoint> kps; if (fscanf(fp, "%d %d", &num, &len) != 2) { printf("Invalid keypoint file beginning."); return kps; } #ifdef KEY_LIMIT num = MIN(num, 65536); // we'll store at most 65536 features per // image #endif /* KEY_LIMIT */ if (len != 128) { printf("Keypoint descriptor length invalid (should be 128)."); return kps; } for (i = 0; i < num; i++) { /* Allocate memory for the keypoint. */ unsigned char *d = new unsigned char[len]; float x, y, scale, ori; if (fscanf(fp, "%f %f %f %f", &y, &x, &scale, &ori) != 4) { printf("Invalid keypoint file format."); return kps; } for (j = 0; j < len; j++) { if (fscanf(fp, "%d", &val) != 1 || val < 0 || val > 255) { printf("Invalid keypoint file value."); return kps; } d[j] = (unsigned char) val; } if (descriptor) { kps.push_back(KeypointWithDesc(x, y, d)); } else { delete [] d; kps.push_back(Keypoint(x, y)); } } return kps; }
std::vector<KeypointWithDesc> ReadKeysFastGzip(gzFile fp, bool descriptor, float **scales, float **orients) { int i, j, num, len; std::vector<KeypointWithDesc> kps; char header[256]; gzgets(fp, header, 256); if (sscanf(header, "%d %d", &num, &len) != 2) { printf("Invalid keypoint file.\n"); return kps; } #ifdef KEY_LIMIT num = MIN(num, 65536); // we'll store at most 65536 features per // image #endif /* KEY_LIMIT */ if (len != 128) { printf("Keypoint descriptor length invalid (should be 128)."); return kps; } kps.resize(num); if (num > 0 && scales != NULL) { *scales = new float[num]; } if (num > 0 && orients != NULL) { *orients = new float[num]; } for (i = 0; i < num; i++) { /* Allocate memory for the keypoint. */ float x, y, scale, ori; char buf[1024]; gzgets(fp, buf, 1024); if (sscanf(buf, "%f %f %f %f\n", &y, &x, &scale, &ori) != 4) { printf("Invalid keypoint file format."); return kps; } if (scales != NULL) { (*scales)[i] = scale; } if (orients != NULL) { (*orients)[i] = ori; } /* Allocate memory for the keypoint. */ unsigned char *d = NULL; if (descriptor) d = new unsigned char[len]; int start = 0; for (int line = 0; line < 7; line++) { gzgets(fp, buf, 1024); if (!descriptor) continue; short int p[20]; if (line < 6) { sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu " "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu", p+0, p+1, p+2, p+3, p+4, p+5, p+6, p+7, p+8, p+9, p+10, p+11, p+12, p+13, p+14, p+15, p+16, p+17, p+18, p+19); for (j = 0; j < 20; j++) d[start + j] = p[j]; start += 20; } else { sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu", p+0, p+1, p+2, p+3, p+4, p+5, p+6, p+7); for (j = 0; j < 8; j++) d[start + j] = p[j]; } } // kps.push_back(KeypointWithDesc(x, y, d)); kps[i] = KeypointWithDesc(x, y, d); } return kps; }
/* Read keys more quickly */ std::vector<KeypointWithDesc> ReadKeysFast(FILE *fp, bool descriptor, float **scales, float **orients) { int i, j, num, len; std::vector<KeypointWithDesc> kps; if (fscanf(fp, "%d %d", &num, &len) != 2) { printf("Invalid keypoint file beginning."); return kps; } #ifdef KEY_LIMIT num = MIN(num, 65536); // we'll store at most 65536 features per // image #endif /* KEY_LIMIT */ if (len != DESCRIPTOR_LENGTH) { printf("Keypoint descriptor length invalid (should be DESCRIPTOR_LENGTH)."); return kps; } kps.resize(num); if (num > 0 && scales != NULL) { *scales = new float[num]; } if (num > 0 && orients != NULL) { *orients = new float[num]; } for (i = 0; i < num; i++) { /* Allocate memory for the keypoint. */ float x, y, scale, ori; if (fscanf(fp, "%f %f %f %f\n", &y, &x, &scale, &ori) != 4) { printf("Invalid keypoint file format."); return kps; } if (scales != NULL) { (*scales)[i] = scale; } if (orients != NULL) { (*orients)[i] = ori; } char buf[1024]; /* Allocate memory for the keypoint. */ unsigned char *d = NULL; if (descriptor) d = new unsigned char[len]; int start = 0; for (int line = 0; line < (DESCRIPTOR_LENGTH/20)+1; line++) { fgets(buf, 1024, fp); if (!descriptor) continue; unsigned char p[20]; //short int p[20]; if (line < (DESCRIPTOR_LENGTH/20)) { sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu " "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu", p+0, p+1, p+2, p+3, p+4, p+5, p+6, p+7, p+8, p+9, p+10, p+11, p+12, p+13, p+14, p+15, p+16, p+17, p+18, p+19); for (j = 0; j < 20; j++) d[start + j] = p[j]; start += 20; } else { for (j = 0; j < (DESCRIPTOR_LENGTH %20); j++){ sscanf(buf, "%hu", &p[j]); d[start + j] = p[j]; /*sscanf(buf,"%hu %hu %hu %hu",p+0, p+1, p+2, p+3);*/ } } } // kps.push_back(KeypointWithDesc(x, y, d)); kps[i] = KeypointWithDesc(x, y, d); } return kps; }