/* 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; }
void CensureDetector::FindKeypoints(std::vector<Keypoint>& v) { for(int lv=0;lv<7;lv++) { int margin = extFilterSize[lv+1>6?6:lv+1]/2; for(int i=margin;i<bufy-margin;i++) { for(int j=margin;j<bufx-margin;j++) { if(IsLocalExtremum(j,i,lv,param.nonMaxSuppThreshold)) { // if(HarrisTest(j, i, lv, param.harrisThreshold)) // { v.push_back(Keypoint(j,i,lv, filterResponse[lv][i*bufx+j])); // } } } } } }
/* Read keys using MMAP to speed things up */ std::vector<Keypoint> ReadKeysMMAP(FILE *fp) { int i, j, num, len, val, n; std::vector<Keypoint> kps; struct stat sb; /* Stat the file */ if (fstat(fileno(fp), &sb) < 0) { printf("[ReadKeysMMAP] Error: could not stat file\n"); return kps; } char *file = (char *)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fileno(fp), 0); char *file_start = file; char string_buf[1024]; char *str = string_buf; /* Find the first '\n' */ char *newline = strchr(file, '\n'); int pos = (int) (newline - file); memcpy(str, file, pos); str[pos] = 0; if (sscanf(str, "%d %d%n", &num, &len, &n) != 2) { printf("[ReadKeysMMAP] 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 */ file += (pos + 1); if (len != 128) { printf("[ReadKeysMMAP] Keypoint descriptor length invalid " "(should be 128)."); return kps; } for (i = 0; i < num; i++) { str = string_buf; /* Allocate memory for the keypoint. */ unsigned char *d = new unsigned char[len]; float x, y, scale, ori; /* Find the first '\n' */ newline = strchr(file, '\n'); pos = (int) (newline - file); memcpy(str, file, pos); str[pos] = 0; if (sscanf(str, "%f %f %f %f%n", &y, &x, &scale, &ori, &n) != 4) { printf("[ReadKeysMMAP] Invalid keypoint file format."); return kps; } file += (pos + 1); /* Find the next seven '\n's */ str = string_buf; char *seventh_newline = strchrn(file, '\n', 7); pos = (int) (seventh_newline - file); memcpy(str, file, pos); str[pos] = 0; for (j = 0; j < len; j++) { if (sscanf(str, "%d%n", &val, &n) != 1 || val < 0 || val > 255) { printf("[ReadKeysMMAP] Invalid keypoint file value."); return kps; } d[j] = (unsigned char) val; str += n; } file += (pos + 1); if (desc) kps.Add(Keypoint(x, y, d)); else kps.Add(Keypoint(x, y)); } /* Unmap */ if (munmap(file_start, sb.st_size) < 0) { printf("[ReadKeysMMAP] Error: could not unmap memory\n"); return kps; } return kps; }