int naiveNearestNeighbor( const float* vec, int laplacian, const CvSeq* model_keypoints, const CvSeq* model_descriptors ) { int length = (int)(model_descriptors->elem_size/sizeof(float)); int i, neighbor = -1; double d, dist1 = 1e6, dist2 = 1e6; CvSeqReader reader, kreader; cvStartReadSeq( model_keypoints, &kreader, 0 ); cvStartReadSeq( model_descriptors, &reader, 0 ); for( i = 0; i < model_descriptors->total; i++ ) { const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr; const float* mvec = (const float*)reader.ptr; CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader ); CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader ); if( laplacian != kp->laplacian ) continue; d = compareSURFDescriptors( vec, mvec, dist2, length ); if( d < dist1 ) { dist2 = dist1; dist1 = d; neighbor = i; } else if ( d < dist2 ) dist2 = d; } if ( dist1 < 0.6*dist2 ) return neighbor; return -1; }
int ObjectAspect::naiveNearestNeighbor(const float* vec, const std::vector<cv::KeyPoint>& model_keypoints, const float* model_descriptors, const std::map<int,int>& imageMap2D3D) { // length of descriptor const int LENGTH = 64; int neighbor = -1; double d = 0.; double dist1 = DBL_MAX, dist2 = DBL_MAX; for(size_t i = 0; i < model_keypoints.size(); i++ ) { if(imageMap2D3D.find(i)==imageMap2D3D.end()) continue; const float* mvec = &model_descriptors[i*64]; d = compareSURFDescriptors( vec, mvec, dist2, LENGTH ); if( d < dist1 ) { dist2 = dist1; dist1 = d; neighbor = i; } else if ( d < dist2 ) dist2 = d; } if ( dist1 < 0.6*dist2 ) return neighbor; return -1; }