Esempio n. 1
0
def dewarp(imagedir):
  # Loading from json file
  C = CameraParams()
  C.load(imagedir+"/params.json")
  K = cv.fromarray(C.K)
  D = cv.fromarray(C.D)
  print "loaded camera parameters"
  mapx = None
  mapy = None
  for f in os.listdir(imagedir):
    if (f.find('pgm')<0):
      continue
    image = imagedir+'/'+f
    print image
    original = cv.LoadImage(image,cv.CV_LOAD_IMAGE_GRAYSCALE)
    dewarped = cv.CloneImage(original);
    # setup undistort map for first time
    if (mapx == None or mapy == None):
      im_dims = (original.width, original.height)
      mapx = cv.CreateImage( im_dims, cv.IPL_DEPTH_32F, 1 );
      mapy = cv.CreateImage( im_dims, cv.IPL_DEPTH_32F, 1 );
      cv.InitUndistortMap(K,D,mapx,mapy)

    cv.Remap( original, dewarped, mapx, mapy )

    tmp1=cv.CreateImage((im_dims[0]/2,im_dims[1]/2),8,1)
    cv.Resize(original,tmp1)
    tmp2=cv.CreateImage((im_dims[0]/2,im_dims[1]/2),8,1)
    cv.Resize(dewarped,tmp2)

    cv.ShowImage("Original", tmp1 )
    cv.ShowImage("Dewarped", tmp2)
    cv.WaitKey(-1)
Esempio n. 2
0
    def getCameraWidth(self, alt):
        '''Using the camera parameters, with the width of the
        ground strip that the camera can see from a particular altitude'''

        #use the camera parameters
        c_params = CameraParams(lens=4.0)
        # load camera params and get the width of an image on the ground
        path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'chameleon1_arecont0.json')
        c_params.load(path)
        aov = math.degrees(2.0*math.atan((c_params.sensorwidth/1000.0)/(2.0*c_params.lens/1000.0)))
        groundWidth = 2.0*alt*math.tan(math.radians(aov/2))

        return groundWidth
Esempio n. 3
0
    def __init__(self):
        self.running = False
        self.unload = threading.Event()
        self.unload.clear()

        self.capture_thread = None
        self.save_thread = None
        self.scan_thread1 = None
        self.scan_thread2 = None
        self.transmit_thread = None
        self.view_thread = None

        self.settings = mp_settings.MPSettings([('depth', int, 8),
                                                ('gcs_address', str, None),
                                                ('gcs_view_port', int, 7543),
                                                ('bandwidth', int, 40000),
                                                ('bandwidth2', int, 2000),
                                                ('capture_brightness', int,
                                                 150), ('gamma', int, 950),
                                                ('brightness', float, 1.0),
                                                ('quality', int, 75),
                                                ('save_pgm', int, 1),
                                                ('transmit', int, 1),
                                                ('roll_stabilised', int, 1),
                                                ('minscore', int, 75),
                                                ('minscore2', int, 500),
                                                ('altitude', int, None),
                                                ('send1', int, 1),
                                                ('send2', int, 1),
                                                ('maxqueue1', int, None),
                                                ('maxqueue2', int, 30),
                                                ('thumbsize', int, 60),
                                                ('packet_loss', int, 0),
                                                ('gcs_slave', str, None)])

        self.capture_count = 0
        self.scan_count = 0
        self.error_count = 0
        self.error_msg = None
        self.region_count = 0
        self.fps = 0
        self.scan_fps = 0
        self.cam = None
        self.save_queue = Queue.Queue()
        self.scan_queue = Queue.Queue()
        self.transmit_queue = Queue.Queue()
        self.viewing = False

        self.c_params = CameraParams(lens=4.0)
        self.jpeg_size = 0
        self.xmit_queue = 0
        self.xmit_queue2 = 0
        self.efficiency = 1.0

        self.last_watch = 0
        self.frame_loss = 0
        self.boundary = None
        self.boundary_polygon = None

        self.bandwidth_used = 0
        self.rtt_estimate = 0
        self.bsocket = None
        self.bsend2 = None
        self.bsend_slave = None

        # setup directory for images
        self.camera_dir = os.path.join(os.path.dirname(mpstate.logfile_name),
                                       "camera")
        cuav_util.mkdir_p(self.camera_dir)

        self.mpos = mav_position.MavInterpolator(backlog=5000, gps_lag=0.3)
        self.joelog = cuav_joe.JoeLog(os.path.join(self.camera_dir, 'joe.log'),
                                      append=mpstate.continue_mode)
        # load camera params
        path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..',
                            '..', '..', 'cuav', 'data',
                            'chameleon1_arecont0.json')
        self.c_params.load(path)
Esempio n. 4
0
    def __init__(self):
        self.running = False
        self.unload = threading.Event()
        self.unload.clear()

        self.capture_thread = None
        self.save_thread = None
        self.scan_thread1 = None
        self.scan_thread2 = None
        self.transmit_thread = None
        self.view_thread = None

        self.settings = mp_settings.MPSettings(
            [ ('depth', int, 8),
              ('gcs_address', str, None),
              ('gcs_view_port', int, 7543),
              ('bandwidth',  int, 40000),
              ('bandwidth2', int, 2000),
              ('capture_brightness', int, 150),
              ('gamma', int, 950),
              ('brightness', float, 1.0),
              ('quality', int, 75),
              ('save_pgm', int, 1),
              ('transmit', int, 1),
              ('roll_stabilised', int, 1),
              ('minscore', int, 75),
              ('minscore2', int, 500),
              ('altitude', int, None),
              ('send1', int, 1),
              ('send2', int, 1),
              ('maxqueue1', int, None),
              ('maxqueue2', int, 30),
              ('thumbsize', int, 60),
              ('packet_loss', int, 0)              
              ]
            )

        self.capture_count = 0
        self.scan_count = 0
        self.error_count = 0
        self.error_msg = None
        self.region_count = 0
        self.fps = 0
        self.scan_fps = 0
        self.cam = None
        self.save_queue = Queue.Queue()
        self.scan_queue = Queue.Queue()
        self.transmit_queue = Queue.Queue()
        self.viewing = False
        
        self.c_params = CameraParams(lens=4.0)
        self.jpeg_size = 0
        self.xmit_queue = 0
        self.xmit_queue2 = 0
        self.efficiency = 1.0

        self.last_watch = 0
        self.frame_loss = 0
        self.boundary = None
        self.boundary_polygon = None

        self.bandwidth_used = 0
        self.rtt_estimate = 0
        self.bsocket = None
        self.bsend2 = None
        
        # setup directory for images
        self.camera_dir = os.path.join(os.path.dirname(mpstate.logfile_name),
                                      "camera")
        cuav_util.mkdir_p(self.camera_dir)

        self.mpos = mav_position.MavInterpolator(backlog=5000, gps_lag=0.3)
        self.joelog = cuav_joe.JoeLog(os.path.join(self.camera_dir, 'joe.log'), append=mpstate.continue_mode)
        # load camera params
        path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', '..', '..',
                            'cuav', 'data', 'chameleon1_arecont0.json')
        self.c_params.load(path)
Esempio n. 5
0
    def __init__(self):
        self.running = False
        self.unload = threading.Event()
        self.unload.clear()

        self.capture_thread = None
        self.save_thread = None
        self.scan_thread1 = None
        #self.scan_thread2 = None
        self.transmit_thread = None
        self.view_thread = None

        self.capture_count = 0
        self.scan_count = 0
        self.error_count = 0
        self.error_msg = None
        self.region_count = 0
        self.fps = 0
        self.scan_fps = 0
        self.cam = None
        self.save_queue = Queue.Queue()
        self.scan_queue = Queue.Queue()
        self.transmit_queue = Queue.Queue()
        self.viewing = False
        self.depth = 8
        self.gcs_address = None
        self.gcs_view_port = 7543
        self.bandwidth = 40000
        self.bandwidth2 = 800
        self.capture_brightness = 150
        self.gamma = 950
        self.c_params = CameraParams(lens=4.0)
        self.brightness = 1.0
        self.quality = 75
        self.jpeg_size = 0
        self.xmit_queue = 0
        self.xmit_queue2 = 0
        self.efficiency = 1.0

        self.last_watch = 0
        self.frame_loss = 0
        self.colour = 1
        self.boundary = None
        self.boundary_polygon = None
        self.packet_loss = 0
        self.save_pgm = True

        self.bandwidth_used = 0
        self.rtt_estimate = 0
        self.transmit = True

        self.roll_stabilised = True

        self.minscore = 3
        self.altitude = None
        self.bsocket = None
        self.bsend2 = None
        self.send2 = False
        self.thumbsize = 60
        
        # setup directory for images
        self.camera_dir = os.path.join(os.path.dirname(mpstate.logfile_name),
                                      "camera")
        cuav_util.mkdir_p(self.camera_dir)

        self.mpos = mav_position.MavInterpolator(backlog=5000, gps_lag=0.3)
        self.joelog = cuav_joe.JoeLog(os.path.join(self.camera_dir, 'joe.log'), append=mpstate.continue_mode)
        # load camera params
        path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', '..', '..',
                            'cuav', 'data', 'chameleon1_arecont0.json')
        self.c_params.load(path)
Esempio n. 6
0
def calibrate(imagedir):
  nimages = 0
  datapoints = []
  im_dims = (0,0)
  for f in os.listdir(imagedir):
    if (f.find('pgm')<0):
      continue
    image = imagedir+'/'+f
    grey = cv.LoadImage(image,cv.CV_LOAD_IMAGE_GRAYSCALE)
    found,points=cv.FindChessboardCorners(grey,dims,cv.CV_CALIB_CB_ADAPTIVE_THRESH)
    points=cv.FindCornerSubPix(grey,points,(11,11),(-1,-1),(cv.CV_TERMCRIT_EPS+cv.CV_TERMCRIT_ITER,30,0.1))

    if (found):
      print 'using ', image
      nimages += 1
      datapoints.append(points)
      im_dims = (grey.width, grey.height)

  #Number of points in chessboard
  num_pts = dims[0] * dims[1]
  #image points
  ipts = cv.CreateMat(nimages * num_pts, 2, cv.CV_32FC1)
  #object points
  opts = cv.CreateMat(nimages * num_pts, 3, cv.CV_32FC1)
  npts = cv.CreateMat(nimages, 1, cv.CV_32SC1)

  for i in range(0,nimages):
    k=i*num_pts
    squareSize = 1.0
    # squareSize is 1.0 (i.e. units of checkerboard)
    for j in range(num_pts):
      cv.Set2D(ipts,k,0,datapoints[i][j][0])
      cv.Set2D(ipts,k,1,datapoints[i][j][1])
      cv.Set2D(opts,k,0,float(j%dims[0])*squareSize)
      cv.Set2D(opts,k,1,float(j/dims[0])*squareSize)
      cv.Set2D(opts,k,2,0.0)
      k=k+1
    cv.Set2D(npts,i,0,num_pts)

  K = cv.CreateMat(3, 3, cv.CV_64FC1)
  D = cv.CreateMat(5, 1, cv.CV_64FC1)
  
  cv.SetZero(K)
  cv.SetZero(D)
  
  # focal lengths have 1/1 ratio
  K[0,0] = im_dims[0]
  K[1,1] = im_dims[0]
  K[0,2] = im_dims[0]/2
  K[1,2] = im_dims[1]/2
  K[2,2] = 1.0

  rcv = cv.CreateMat(nimages, 3, cv.CV_64FC1)
  tcv = cv.CreateMat(nimages, 3, cv.CV_64FC1)

  #print 'object'
  #print array(opts)
  #print 'image'
  #print array(ipts)
  #print 'npts'
  #print array(npts)

  size=cv.GetSize(grey)
  flags = 0
  #flags |= cv.CV_CALIB_FIX_ASPECT_RATIO
  #flags |= cv.CV_CALIB_USE_INTRINSIC_GUESS
  #flags |= cv.CV_CALIB_ZERO_TANGENT_DIST
  #flags |= cv.CV_CALIB_FIX_PRINCIPAL_POINT
  cv.CalibrateCamera2(opts, ipts, npts, size, K, D, rcv, tcv, flags)

  # storing results using CameraParams
  C = CameraParams(xresolution=im_dims[0], yresolution=im_dims[1])
  print array(K)
  print array(D)
  C.setParams(K, D)
  C.save(imagedir+"/params.json")
Esempio n. 7
0
def calibrate(imagedir, autodelete=True, validate=True):
  nimages = 0
  datapoints = []
  im_dims = (0,0)
  im_cnt = 0
  for f in os.listdir(imagedir):
    if (f.find('pgm')<0):
      continue
    image = imagedir+'/'+f
    grey = cv.LoadImage(image,cv.CV_LOAD_IMAGE_GRAYSCALE)
    found,points=cv.FindChessboardCorners(grey,dims,cv.CV_CALIB_CB_ADAPTIVE_THRESH)
    if found == 0:
      print 'Failed to find corners.'
      if (autodelete):
        print 'Deleting image: ' + f
        os.remove(image)
      else:
        print 'Skipping image: ' + f
    elif validate:
      grey_c = cv.CloneImage(grey)
      cv.DrawChessboardCorners(grey_c,dims,points,found)
      #show the final image
      if (grey_c.width > 640):
        tmp=cv.CreateImage((grey_c.width/2,grey_c.height/2),8,grey_c.channels)
        cv.Resize(grey_c,tmp)
        cv.ShowImage("calibrate", tmp)
      else:
        cv.ShowImage("calibrate", gray_c)
      #wait indefinitely
      print 'Use this image/quit ? (y)es/(n)o/(d)elete/(q)uit'
      key = chr(cv.WaitKey(0) & 255)
      if (key == 'y'):
        print 'Keeping image: ' + f + ' : ', im_cnt
        im_cnt+=1
      elif (key == 'q'):
        break
      elif (key == 'd'):
        print 'Deleting original image: ' + f
        os.remove(image)
        continue
      else:
        print 'Skipping image: ' + f
        continue
      
    points=cv.FindCornerSubPix(grey,points,(11,11),(-1,-1),(cv.CV_TERMCRIT_EPS+cv.CV_TERMCRIT_ITER,30,0.1))

    if (found):
      print 'using ', image
      nimages += 1
      datapoints.append(points)
      im_dims = (grey.width, grey.height)

  #Number of points in chessboard
  num_pts = dims[0] * dims[1]
  #image points
  ipts = cv.CreateMat(nimages * num_pts, 2, cv.CV_32FC1)
  #object points
  opts = cv.CreateMat(nimages * num_pts, 3, cv.CV_32FC1)
  npts = cv.CreateMat(nimages, 1, cv.CV_32SC1)

  for i in range(0,nimages):
    k=i*num_pts
    squareSize = 1.0
    # squareSize is 1.0 (i.e. units of checkerboard)
    for j in range(num_pts):
      cv.Set2D(ipts,k,0,datapoints[i][j][0])
      cv.Set2D(ipts,k,1,datapoints[i][j][1])
      cv.Set2D(opts,k,0,float(j%dims[0])*squareSize)
      cv.Set2D(opts,k,1,float(j/dims[0])*squareSize)
      cv.Set2D(opts,k,2,0.0)
      k=k+1
    cv.Set2D(npts,i,0,num_pts)

  K = cv.CreateMat(3, 3, cv.CV_64FC1)
  D = cv.CreateMat(5, 1, cv.CV_64FC1)
  
  cv.SetZero(K)
  cv.SetZero(D)
  
  # focal lengths have 1/1 ratio
  K[0,0] = im_dims[0]
  K[1,1] = im_dims[0]
  K[0,2] = im_dims[0]/2
  K[1,2] = im_dims[1]/2
  K[2,2] = 1.0

  rcv = cv.CreateMat(nimages, 3, cv.CV_64FC1)
  tcv = cv.CreateMat(nimages, 3, cv.CV_64FC1)

  #print 'object'
  #print array(opts)
  #print 'image'
  #print array(ipts)
  #print 'npts'
  #print array(npts)

  size=cv.GetSize(grey)
  flags = 0
  #flags |= cv.CV_CALIB_FIX_ASPECT_RATIO
  #flags |= cv.CV_CALIB_USE_INTRINSIC_GUESS
  #flags |= cv.CV_CALIB_ZERO_TANGENT_DIST
  #flags |= cv.CV_CALIB_FIX_PRINCIPAL_POINT
  cv.CalibrateCamera2(opts, ipts, npts, size, K, D, rcv, tcv, flags)

  # storing results using CameraParams
  C = CameraParams(xresolution=im_dims[0], yresolution=im_dims[1])
  print array(K)
  print array(D)
  C.setParams(K, D)
  C.save(imagedir+"/params.json")