Exemplo n.º 1
0
void
test_query_from_file(int verbose)
{
    VlKDForest *forest;
    int i;
    float *data, *query;
    vl_size dim;
    vl_size num;

    /*
     * load
     */
    data = load_data("data.bin", &dim, &num);
    forest = load_VlKDForest("forest.bin");
    forest->data = data;

    if((query = (float *)malloc(dim * sizeof(float))) == NULL){
        printf("not enough memoey\n");
        exit(1);
    }
    for(i = 0;i < dim; i++) query[i] = 0.5;
    if(verbose) printf("has created a query\n");

    /*
     * search neighbors
     */
    vl_size numNeighbors = 10;
    unsigned int numComparisons = 0 ;
    unsigned int maxNumComparisons = 0 ;
    VlKDForestNeighbor * neighbors ;

    vl_kdforest_set_max_num_comparisons (forest, maxNumComparisons) ;
    neighbors = vl_malloc (sizeof(VlKDForestNeighbor) * numNeighbors) ;

    numComparisons = vl_kdforest_query (forest, neighbors, numNeighbors,
                                        query);

    for(i = 0;i < numNeighbors; i++){
        printf("%d %f\n",
               neighbors[i].index + 1, neighbors[i].distance);

        /* check distance */
        if(fabs(
                dist_l2(dim, query, &data[neighbors[i].index * dim]) -
                neighbors[i].distance) > 1e-6){
            printf("%d distance is different. %f\n",
                  dist_l2(dim, query, &data[neighbors[i].index * dim]) );
        }
        /* check order */
        if(i != 0 && neighbors[i-1].distance > neighbors[i].distance){
            printf("order is wrong.\n");
        }
    }

    vl_free(neighbors);

    vl_kdforest_delete(forest);
    free(data);
    free(query);
}
Exemplo n.º 2
0
void kkdforest_query(float* point, int num_neighbors, unsigned int* indexes, float* distances, int* num_visited)
{
    if (forest == 0) {
        printf("no forest\n");
        return;
    }
    VlKDForestNeighbor* neighbors = malloc(sizeof(VlKDForestNeighbor) * num_neighbors);
    *num_visited = vl_kdforest_query(
                        forest,
                        neighbors,
                        num_neighbors,
                        point);
    
    int i;
    for (i=0; i<num_neighbors; i++)
    {
        indexes[i] = neighbors[i].index;
        distances[i] = neighbors[i].distance;
    }
    free(neighbors);
}
Exemplo n.º 3
0
void
mexFunction(int nout, mxArray *out[],
            int nin, const mxArray *in[])
{
  enum {IN_FOREST = 0, IN_DATA, IN_QUERY, IN_END} ;
  enum {OUT_INDEX = 0, OUT_DISTANCE} ;

  int            verbose = 0 ;
  int            opt ;
  int            next = IN_END ;
  mxArray const *optarg ;

  VlKDForest * forest ;
  mxArray const * forest_array = in[IN_FOREST] ;
  mxArray const * data_array = in[IN_DATA] ;
  mxArray const * query_array = in[IN_QUERY] ;
  mxArray * index_array ;
  mxArray * distance_array ;
  void * query ;
  vl_uint32 * index ;
  void * distance ;
  vl_size numNeighbors = 1 ;
  vl_size numQueries ;
  vl_uindex qi, ni;
  unsigned int numComparisons = 0 ;
  unsigned int maxNumComparisons = 0 ;
  VlKDForestNeighbor * neighbors ;
  mxClassID dataClass ;

  VL_USE_MATLAB_ENV ;

  /* -----------------------------------------------------------------
   *                                               Check the arguments
   * -------------------------------------------------------------- */

  if (nin < 3) {
    vlmxError(vlmxErrNotEnoughInputArguments, NULL) ;
  }
  if (nout > 2) {
    vlmxError(vlmxErrTooManyOutputArguments, NULL) ;
  }

  forest = new_kdforest_from_array (forest_array, data_array) ;

  dataClass = mxGetClassID (data_array) ;
  if (mxGetClassID (query_array) != dataClass) {
    vlmxError(vlmxErrInvalidArgument,
             "QUERY must have the same storage class as DATA.") ;
  }
  if (! vlmxIsReal (query_array)) {
    vlmxError(vlmxErrInvalidArgument,
             "QUERY must be real.") ;
  }
  if (! vlmxIsMatrix (query_array, forest->dimension, -1)) {
    vlmxError(vlmxErrInvalidArgument,
             "QUERY must be a matrix with TREE.NUMDIMENSIONS rows.") ;
  }

  while ((opt = vlmxNextOption (in, nin, options, &next, &optarg)) >= 0) {
    switch (opt) {
      case opt_num_neighs :
        if (! vlmxIsScalar(optarg) ||
            (numNeighbors = mxGetScalar(optarg)) < 1) {
          vlmxError(vlmxErrInvalidArgument,
                   "NUMNEIGHBORS must be a scalar not smaller than one.") ;
        }
        break;

      case opt_max_num_comparisons :
        if (! vlmxIsScalar(optarg)) {
          vlmxError(vlmxErrInvalidArgument,
                   "MAXNUMCOMPARISONS must be a scalar.") ;
        }
        maxNumComparisons = mxGetScalar(optarg) ;
        break;

      case opt_verbose :
        ++ verbose ;
        break ;
    }
  }

  vl_kdforest_set_max_num_comparisons (forest, maxNumComparisons) ;

  neighbors = vl_malloc (sizeof(VlKDForestNeighbor) * numNeighbors) ;

  query = mxGetData (query_array) ;
  numQueries = mxGetN (query_array) ;

  out[OUT_INDEX] = index_array = mxCreateNumericMatrix
    (numNeighbors, numQueries, mxUINT32_CLASS, mxREAL) ;

  out[OUT_DISTANCE] = distance_array = mxCreateNumericMatrix
    (numNeighbors, numQueries, dataClass, mxREAL) ;

  index = mxGetData (index_array) ;
  distance = mxGetData (distance_array) ;

  if (verbose) {
    VL_PRINTF ("vl_kdforestquery: number of queries: %d\n", numQueries) ;
    VL_PRINTF ("vl_kdforestquery: number of neighbors per query: %d\n", numNeighbors) ;
    VL_PRINTF ("vl_kdforestquery: max num of comparisons per query: %d\n",
               vl_kdforest_get_max_num_comparisons (forest)) ;
  }

  for (qi = 0 ; qi < numQueries ; ++ qi) {
    numComparisons += vl_kdforest_query (forest, neighbors, numNeighbors,
                                         query) ;
    switch (dataClass) {
      case mxSINGLE_CLASS:
      {
        float * distance_ = (float*) distance ;
        for (ni = 0 ; ni < numNeighbors ; ++ni) {
          *index++     = neighbors[ni].index + 1 ;
          *distance_++ = neighbors[ni].distance ;
        }
        query = (float*)query + vl_kdforest_get_data_dimension (forest) ;
        distance = distance_ ;
        break ;
      }
      case mxDOUBLE_CLASS:
      {
        double * distance_ = (double*) distance ;
        for (ni = 0 ; ni < numNeighbors ; ++ni) {
          *index++     = neighbors[ni].index + 1 ;
          *distance_++ = neighbors[ni].distance ;
        }
        query = (double*)query + vl_kdforest_get_data_dimension (forest)  ;
        distance = distance_ ;
        break ;
      }
      default:
        abort() ;
    }
  }

  if (verbose) {
    VL_PRINTF ("vl_kdforestquery: number of comparisons per query: %.3f\n",
               ((double) numComparisons) / numQueries) ;
    VL_PRINTF ("vl_kdforestquery: number of comparisons per neighbor: %.3f\n",
               ((double) numComparisons) / (numQueries * numNeighbors)) ;
  }

  vl_kdforest_delete (forest) ;
  vl_free (neighbors) ;
}
Exemplo n.º 4
0
void
test_simple(int verbose)
{
    VlKDForest *forest;
    int i, j;
    float *data, *query;
    vl_size dim = 128;
    vl_size num = 10000;
    vl_size numTrees = 1;

    /*
     * create a test data
     */
    if((data = create_data(dim ,num)) == NULL){
        printf("not enough memoey\n");
        exit(1);
    }
    if(verbose) printf("has created a test data\n");

    if((query = (float *)malloc(dim * sizeof(float))) == NULL){
        printf("not enough memoey\n");
        exit(1);
    }
    for(i = 0;i < dim; i++) query[i] = 0.5;
    if(verbose) printf("has created a query\n");

    /*
     * build a kd-tree forest
     */
    forest = kdtreebuild(1, dim, numTrees, VL_KDTREE_MEDIAN, num, data);
    if(verbose) printf("has created a forest\n");
    
    if(verbose && 0){
        for(j = 0;j < numTrees; j++){
            printf("dataIndex[%d] = [", j);
            for(i = 0;i < forest->numData; i++){
                printf("%d ",
                       forest->trees[j]->dataIndex[i].index + 1);
            }
            printf("]\n");
        }
    }

    /*
     * save
     */
    save_data("data.bin", data, dim, num);
    save_VlKDForest("forest.bin", forest);

    /*
     * search neighbors
     */
    vl_size numNeighbors = 10;
    unsigned int numComparisons = 0 ;
    unsigned int maxNumComparisons = 0 ;
    VlKDForestNeighbor * neighbors ;

    vl_kdforest_set_max_num_comparisons (forest, maxNumComparisons) ;
    neighbors = vl_malloc (sizeof(VlKDForestNeighbor) * numNeighbors) ;

    numComparisons = vl_kdforest_query (forest, neighbors, numNeighbors,
                                        query);

    for(i = 0;i < numNeighbors; i++){
        printf("%d %f\n",
               neighbors[i].index + 1, neighbors[i].distance);

        /* check distance */
        if(fabs(
                dist_l2(dim, query, &data[neighbors[i].index * dim]) -
                neighbors[i].distance) > 1e-6){
            printf("%d distance is different. %f\n",
                  dist_l2(dim, query, &data[neighbors[i].index * dim]) );
        }
        /* check order */
        if(i != 0 && neighbors[i-1].distance > neighbors[i].distance){
            printf("order is wrong.\n");
        }
    }

    vl_free(neighbors);
    vl_kdforest_delete(forest);
    free(data);
    free(query);
}
Exemplo n.º 5
0
int main (int argc, const char * argv[]) {
    int w=1280,h=720;
    int i=0;
    int nkeypoints=0;
    int press=0;
    char img2_file[] = "/Users/quake0day/ana2/MVI_0124_QT 768Kbps_012.mov";
    vl_bool render=1;
    vl_bool first=1;
    VlSiftFilt * myFilter=0;
    VlSiftKeypoint const* keys;
    //CvCapture * camera = cvCreateCameraCapture (CV_CAP_ANY);
    CvCapture * camera = cvCreateFileCapture(img2_file);
    vl_sift_pix *descriptorsA, *descriptorsB;
    int ndescA=0, ndescB=0;

    //DescriptorA file
    int dscfd;
    struct stat filestat;
    dscfd = open("/Users/quake0day/ana2/saveC.jpg.dsc", O_RDONLY, 0644);
    fstat(dscfd, &filestat);
    int filesize=filestat.st_size;
    descriptorsA=(vl_sift_pix*)mmap(0, filesize, PROT_READ, MAP_SHARED, dscfd, 0);
    ndescA=(filesize/sizeof(vl_sift_pix))/DESCSIZE;
    printf("number of descriptors: %d\n", ndescA);

    //Build kdtreeA
    VlKDForest *myforest=vl_kdforest_new(VL_TYPE_FLOAT, DESCSIZE, 1);
    vl_kdforest_build(myforest, ndescA, descriptorsA);

    //DescriptorsB file
    dscfd=open("/Users/quake0day/ana2/saveD.jpg.dsc", O_RDONLY, 0644);
    fstat(dscfd, &filestat);
    filesize=filestat.st_size;
    descriptorsB=(vl_sift_pix*)mmap(0, filesize, PROT_READ, MAP_SHARED, dscfd, 0);
    ndescB=(filesize/sizeof(vl_sift_pix))/DESCSIZE;
    printf("number of descriptors: %d\n", ndescB);

    //Build kdtreeB
    VlKDForest *myforestB=vl_kdforest_new(VL_TYPE_FLOAT, DESCSIZE, 1);
    vl_kdforest_build(myforestB, ndescB, descriptorsB);

    //Neighbors
    VlKDForestNeighbor *neighbors=(VlKDForestNeighbor*)malloc(sizeof(VlKDForestNeighbor));
    VlKDForestNeighbor *neighborsB=(VlKDForestNeighbor*)malloc(sizeof(VlKDForestNeighbor));

    //Image variables
    vl_sift_pix* fim;
    int err=0;
    int octave, nlevels, o_min;
    cvNamedWindow("Hello", 1);

    //For text
    CvFont font;
    double hScale=2;
    double vScale=2;
    int    lineWidth=2;
    cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth, 1);

    IplImage *myCVImage=cvQueryFrame(camera);//cvLoadImage("2.jpg", -1);

    IplImage *afterCVImage=cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 1);
    IplImage *resizingImg=cvCreateImage(cvSize(w, h), myCVImage->depth, myCVImage->nChannels);
    octave=2;
    nlevels=5;
    o_min=1;
    myFilter=vl_sift_new(w, h, octave, nlevels, o_min);
    vl_sift_set_peak_thresh(myFilter, 0.5);
    fim=malloc(sizeof(vl_sift_pix)*w*h);
    float thre;


    while (myCVImage) {
        dprintf("%d*%d\n",myCVImage->width,myCVImage->height);

        cvResize(myCVImage, resizingImg, CV_INTER_AREA);
        dprintf("resized scale:%d*%d\n",myCVImage->width,myCVImage->height);
        if (press=='s') {
            cvSaveImage("save.jpg", resizingImg);
        }
        cvConvertImage(resizingImg, afterCVImage, 0);


        for (i=0; i<h; i++) {
            for (int j=0; j<w; j++) {
                fim[i*w+j]=CV_IMAGE_ELEM(afterCVImage,uchar,i,j);
            }
        }

        //vl_sift_set_peak_thresh(myFilter, 0.5);
        //vl_sift_set_edge_thresh(myFilter, 10.0);
        first=1;
        while (1) {
            printf("~~~~~~~~~~start of octave~~~~~~~~~~~~\n");


            if (first) {
                first=0;
                thre=0.25;
                err=vl_sift_process_first_octave(myFilter, fim);
            }
            else {
                thre=0.05;
                err=vl_sift_process_next_octave(myFilter);
            }
            if (err) {
                err=VL_ERR_OK;
                break;
            }

            printf("Octave: %d\n", vl_sift_get_octave_index(myFilter));
            vl_sift_detect(myFilter);
            nkeypoints=vl_sift_get_nkeypoints(myFilter);
            dprintf("insider numkey:%d\n",nkeypoints);
            keys=vl_sift_get_keypoints(myFilter);
            dprintf("final numkey:%d\n",nkeypoints);

            int countA=0, countB=0;
            int matchcountA=0, matchcountB=0;
            float avgA=0, avgB=0;
            if (render) {
                for (i=0; i<nkeypoints; i++) {
                    //cvCircle(resizingImg, cvPoint(keys->x, keys->y), keys->sigma, cvScalar(100, 255, 50, 0), 1, CV_AA, 0);
                    dprintf("x:%f,y:%f,s:%f,sigma:%f,\n",keys->x,keys->y,keys->s,keys->sigma);

                    double angles [4] ;
                    int nangles ;


                    /* obtain keypoint orientations ........................... */
                    nangles=vl_sift_calc_keypoint_orientations(myFilter, angles, keys);

                    /* for each orientation ................................... */
                    for (int q = 0 ; q < (unsigned) 1 ; ++q)
                    {
                        vl_sift_pix descr [128] ;


                        /* compute descriptor (if necessary) */
                        vl_sift_calc_keypoint_descriptor(myFilter, descr, keys, angles[q]);

                        for (int j=0; j<128; j++)
                        {
                            descr[j]*=512.0;
                            descr[j]=(descr[j]<255.0)?descr[j]:255.0;
                        }

                        vl_kdforest_query(myforest, neighbors, 1, descr);
                        vl_kdforest_query(myforestB, neighborsB, 1, descr);
                        if (neighbors->distance<50000.0)
                        {
                            matchcountA++;
                            cvCircle(resizingImg, cvPoint(keys->x, keys->y), keys->sigma, cvScalar(100, 0, 0, 255), 1, CV_AA, 0);

                        }

                        if (neighborsB->distance<50000.0)
                        {
                            matchcountB++;
                            cvCircle(resizingImg, cvPoint(keys->x, keys->y), keys->sigma, cvScalar(0, 50, 255, 100), 1, CV_AA, 0);

                        }

                        countA++;
                        avgA+=neighbors->distance;
                        countB++;
                        avgB+=neighborsB->distance;

                    }
                    keys++;
                }
            }
            avgA=avgA/countA;
            float percentage=((float)matchcountA*2)/ndescA;
            printf("Percentage:%f\n", percentage);
            printf("avg:%f\n",avgA);
            printf("thre==%f\n", thre);
            if (percentage>=thre) {
                printf("A shows!!!\n");
                cvPutText (resizingImg, "A shows!!",cvPoint(50, 100), &font, cvScalar(0,255,255,0));

            }

            avgB=avgB/countB;
            percentage=((float)matchcountB*2.5)/ndescB;
            printf("Percentage:%f\n", percentage);
            printf("avg:%f\n",avgB);
            printf("thre==%f\n", thre);
            if (percentage>=thre) {
                printf("B shows!!!\n");
                cvPutText (resizingImg, "B shows!!",cvPoint(400, 100), &font, cvScalar(0,255,255,0));

            }
            printf("~~~~~~~~~~~end of octave~~~~~~~~~~~~\n");
        }

        cvShowImage("Hello", resizingImg);

        myCVImage = cvQueryFrame(camera);

        press=cvWaitKey(1);
        if( press=='q' )
            break;
        else if( press=='r' )
            render=1-render;
    }
    free(fim);
    free(neighbors);
    free(neighborsB);
    cvReleaseImage(&afterCVImage);
    cvReleaseImage(&resizingImg);
    cvReleaseImage(&myCVImage);

    return 0;
}