def query(self,datapoint,callback=distancefunc):
    if not type(datapoint) is pHash.DP:
      raise TypeError("expected a pHash.DP instance")
    # refresh info....
    self.initMVPFile()
    # malloc results structure 
    results = pHash.DPptrArray(self.knearest)
    # error handling
    if (results is None):
      raise MemoryError("expected a pHash.DP instance")
      
    # query datapoint in MVP tree
    ret = pHash.ph_query_mvptree(self.mvpfile,datapoint,self.knearest,self.radius,self.threshold,results.cast())
    # error handling
    if (type(ret) is int ):
      self.log.error("could not complete query, %d"%(retcode))
      raise PHashException("could not complete query, %d"%(retcode))
    retcode,nbfound = ret
    if (retcode != pHash.PH_SUCCESS and retcode != pHash.PH_ERRCAP):
      self.log.warning("could not complete query, %d"%(retcode))
      #self.log.debug("nbfound : %d"%(nbfound))
      raise PHashException("could not complete query, %d"%(retcode))

    # results treatment
    self.log.debug(" %d files found"%( nbfound))
    #
    for j in range (0,nbfound):
      # this own == false
      #print 'thisown',results[j].thisown
      #results[j].thisown=1
      # free dp.id ? 
      # free dp.hash ?
      pass
    res=[ (results[j],distancefunc(datapoint, results[j]) ) for j in range (0,nbfound)]
    return res
Exemple #2
0
    def query(self, datapoint, callback=distancefunc):
        if not type(datapoint) is pHash.DP:
            raise TypeError("expected a pHash.DP instance")
        # refresh info....
        self.initMVPFile()
        # malloc results structure
        results = pHash.DPptrArray(self.knearest)
        # error handling
        if (results is None):
            raise MemoryError("expected a pHash.DP instance")

        # query datapoint in MVP tree
        ret = pHash.ph_query_mvptree(self.mvpfile, datapoint, self.knearest,
                                     self.radius, self.threshold,
                                     results.cast())
        # error handling
        if (type(ret) is int):
            self.log.error("could not complete query, %d" % (retcode))
            raise PHashException("could not complete query, %d" % (retcode))
        retcode, nbfound = ret
        if (retcode != pHash.PH_SUCCESS and retcode != pHash.PH_ERRCAP):
            self.log.warning("could not complete query, %d" % (retcode))
            #self.log.debug("nbfound : %d"%(nbfound))
            raise PHashException("could not complete query, %d" % (retcode))

        # results treatment
        self.log.debug(" %d files found" % (nbfound))
        #
        for j in range(0, nbfound):
            # this own == false
            #print 'thisown',results[j].thisown
            #results[j].thisown=1
            # free dp.id ?
            # free dp.hash ?
            pass
        res = [(results[j], distancefunc(datapoint, results[j]))
               for j in range(0, nbfound)]
        return res
Exemple #3
0
def main(argv):
  '''
  '''
  logging.basicConfig(level=logging.DEBUG)
  
  print pHash.ph_about()

  if (len(argv) < 2):
    print "not enough input arguments"
    print "usage: %s directory dbname [radius] [knearest] [threshold]"%( sys.argv[0])
    return -1

  dir_name = argv[0]#/* name of files in directory of query images */
  filename = argv[1]#/* name of file to save db */

  mvpfile=pHash.MVPFile()
  mvpfile.filename = filename
  #@TODO
  #mvpfile.hashdist = distancefunc
  #mvpfile.hashdist = distancefunc #save: ret code 17
  pHash.my_set_callback(mvpfile,distancefunc)  
  mvpfile.hash_type = pHash.UINT64ARRAY

  nbfiles = 0
  print "using db %s"%( filename)
  print "using dir %s for query files"%( dir_name)
  nbfiles = 0
  print "dir name: %s"%( dir_name)
  nbfiles=0
  files=None
  for root, dirs, filest in os.walk(dir_name):
    nbfiles=len(filest)
    files=[os.path.join(root,f) for f in filest]
  files.sort()
  print "nb query files = %d"%( nbfiles)


  #DP *query = pHash.ph_malloc_datapoint(mvpfile.hash_type)
  query=pHash.ph_malloc_datapoint(mvpfile.hash_type)
  if (query is None):
    print "mem alloc error"
    return -3
  query.thisown=0

  argc=len(argv)+1
  radius = 30.0
  threshold = 15.0
  knearest = 20
  if (argc >= 4):
    radius = float(argv[3])
  
  if (argc >= 5):
    knearest = int(argv[4])
  
  if (argc >= 6):
      threshold = float(argv[5])
  
  print "radius = %f"%( radius)
  print "knearest = %d"%( knearest)
  print "threshold = %f"%( threshold)

  # malloc
  results = pHash.DPptrArray(knearest)
  if (results is None):
    return -3
  
  tmphash = 0x0000000000000000
  nbfound = 0
  count = 0
  sum_calcs = 0
  for i in range(0,nbfiles):
    ret=pHash.ph_dct_imagehash(files[i]) 
    if (type(ret) is int):
      print "unable to get hash"
      continue
    ret2,tmphash=ret

    print "query[%d]: %s %x"%( i, files[i], tmphash)
    query.id = files[i]
    query.hash = pHash.copy_ulong64Ptr(tmphash)
    query.hash_length = 1

    global nb_calcs
    nb_calcs = 0
    nbfound = 0
    ret = pHash.ph_query_mvptree(mvpfile,query,knearest,radius,threshold,results.cast())
    if (type(ret) is int ):
      print "could not complete query, %d"%(retcode)
      continue
    #print 'pHash.ph_query_mvptree',ret 
    # results DP **   
    retcode,nbfound = ret
    #print 'errcodes : pHash.PH_ERRCAP ',pHash.PH_ERRCAP
    if (retcode != pHash.PH_SUCCESS and retcode != pHash.PH_ERRCAP):
      print "could not complete query, %d"%(retcode)
      continue
    count+=1
    sum_calcs += nb_calcs
  
    print " %d files found"%( nbfound)
    for j in range (0,nbfound):
      d = distancefunc(query, results[j])
      print " %d  %s distance = %f"%( j, results[j].id, d)

    print "nb distance calcs: %d"%( nb_calcs)
    for j in range(0,nbfound):
      #free(results[j]->id)
      #del results[j].id
      results[j].id = None
      #del results[j].hash
      results[j].hash = None
      pHash.ph_free_datapoint(results[j])
    
  #end for i


  ave_calcs = float(sum_calcs)/float(count)      
  print "ave calcs/query: %f"%( ave_calcs)


  #for i in range (0, nbfiles):
  #  del files[i]

  del files

  pHash.ph_free_datapoint(query)
  del results
  #del mvpfile.filename

  return 0
def main(argv):
    '''
  '''
    logging.basicConfig(level=logging.DEBUG)

    print pHash.ph_about()

    if (len(argv) < 2):
        print "not enough input arguments"
        print "usage: %s directory dbname [radius] [knearest] [threshold]" % (
            sys.argv[0])
        return -1

    dir_name = argv[0]  #/* name of files in directory of query images */
    filename = argv[1]  #/* name of file to save db */

    mvpfile = pHash.MVPFile()
    mvpfile.filename = filename
    #@TODO
    #mvpfile.hashdist = distancefunc
    #mvpfile.hashdist = distancefunc #save: ret code 17
    pHash.my_set_callback(mvpfile, distancefunc)
    mvpfile.hash_type = pHash.UINT64ARRAY

    nbfiles = 0
    print "using db %s" % (filename)
    print "using dir %s for query files" % (dir_name)
    nbfiles = 0
    print "dir name: %s" % (dir_name)
    nbfiles = 0
    files = None
    for root, dirs, filest in os.walk(dir_name):
        nbfiles = len(filest)
        files = [os.path.join(root, f) for f in filest]
    files.sort()
    print "nb query files = %d" % (nbfiles)

    #DP *query = pHash.ph_malloc_datapoint(mvpfile.hash_type)
    query = pHash.ph_malloc_datapoint(mvpfile.hash_type)
    if (query is None):
        print "mem alloc error"
        return -3
    query.thisown = 0

    argc = len(argv) + 1
    radius = 30.0
    threshold = 15.0
    knearest = 20
    if (argc >= 4):
        radius = float(argv[3])

    if (argc >= 5):
        knearest = int(argv[4])

    if (argc >= 6):
        threshold = float(argv[5])

    print "radius = %f" % (radius)
    print "knearest = %d" % (knearest)
    print "threshold = %f" % (threshold)

    # malloc
    results = pHash.DPptrArray(knearest)
    if (results is None):
        return -3

    tmphash = 0x0000000000000000
    nbfound = 0
    count = 0
    sum_calcs = 0
    for i in range(0, nbfiles):
        ret = pHash.ph_dct_imagehash(files[i])
        if (type(ret) is int):
            print "unable to get hash"
            continue
        ret2, tmphash = ret

        print "query[%d]: %s %x" % (i, files[i], tmphash)
        query.id = files[i]
        query.hash = pHash.copy_ulong64Ptr(tmphash)
        query.hash_length = 1

        global nb_calcs
        nb_calcs = 0
        nbfound = 0
        ret = pHash.ph_query_mvptree(mvpfile, query, knearest, radius,
                                     threshold, results.cast())
        if (type(ret) is int):
            print "could not complete query, %d" % (retcode)
            continue
        #print 'pHash.ph_query_mvptree',ret
        # results DP **
        retcode, nbfound = ret
        #print 'errcodes : pHash.PH_ERRCAP ',pHash.PH_ERRCAP
        if (retcode != pHash.PH_SUCCESS and retcode != pHash.PH_ERRCAP):
            print "could not complete query, %d" % (retcode)
            continue
        count += 1
        sum_calcs += nb_calcs

        print " %d files found" % (nbfound)
        for j in range(0, nbfound):
            d = distancefunc(query, results[j])
            print " %d  %s distance = %f" % (j, results[j].id, d)

        print "nb distance calcs: %d" % (nb_calcs)
        for j in range(0, nbfound):
            #free(results[j]->id)
            #del results[j].id
            results[j].id = None
            #del results[j].hash
            results[j].hash = None
            pHash.ph_free_datapoint(results[j])

    #end for i

    ave_calcs = float(sum_calcs) / float(count)
    print "ave calcs/query: %f" % (ave_calcs)

    #for i in range (0, nbfiles):
    #  del files[i]

    del files

    pHash.ph_free_datapoint(query)
    del results
    #del mvpfile.filename

    return 0