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;
}
Пример #2
0
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;
}