def calibrate(imagedir, cbrow, cbcol): nimages = 0 datapoints = [] im_dims = (0,0) # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) objp = numpy.zeros((cbrow * cbcol, 3), numpy.float32) objp[:, :2] = numpy.mgrid[0:cbcol, 0:cbrow].T.reshape(-1, 2) # Arrays to store object points and image points from all the images. objpoints = [] # 3d point in real world space imgpoints = [] # 2d points in image plane. files = file_list(imagedir, ['jpg', 'jpeg', 'png']) for f in files: colour = cv2.imread(f) grey = cv2.cvtColor(colour, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(grey, (cbcol, cbrow), flags=cv2.CALIB_CB_ADAPTIVE_THRESH) if (ret): print('using ' + f) cv2.cornerSubPix(grey,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01)) objpoints.append(objp) imgpoints.append(corners) im_dims = grey.shape[:2] if len(imgpoints) == 0: print("Not enough good quality images. Aborting") return ret, K, D, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, grey.shape[::-1], None, None) # storing results using CameraParams C = CameraParams(lens=lens, sensorwidth=sensorwidth, xresolution=im_dims[1], yresolution=im_dims[0]) C.setParams(K, D) C.save(os.path.join(imagedir, "paramsout.json")) print("Saved params in " + os.path.join(imagedir, "paramsout.json"))
def load_camera_settings(): global image_height, image_width c_params = CameraParams(lens=4.0, xresolution=0, yresolution=0) if os.path.exists(config_file): c_params.load(config_file) image_height = c_params.yresolution image_width = c_params.xresolution print("Loaded %s" % config_file) else: print("Warning: %s not found. Using default resolution height=%i and width=%i" % (config_file,image_height,image_width))
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
def load_camera_settings(): global image_height, image_width c_params = CameraParams(lens=4.0, xresolution=0, yresolution=0) if os.path.exists(config_file): c_params.load(config_file) image_height = c_params.yresolution image_width = c_params.xresolution print("Loaded %s" % config_file) else: print( "Warning: %s not found. Using default resolution height=%i and width=%i" % (config_file, image_height, image_width))
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
def test_JoeLog_JoeIterator(): joelog = cuav_joe.JoeLog(os.path.join('.', 'joe.log'), False) regions = [] frame_time = 1478954763.0 C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=768) regions.append(cuav_region.Region(10, 10, 25, 23, None, scan_score=450)) regions.append(cuav_region.Region(200, 205, 252, 236, None, scan_score=420)) pos = mav_position.MavPosition(-30, 145, 34.56, 20, -56.67, 345, frame_time) joelog.add_regions(frame_time, regions, pos, 'img2017111312451230Z.png') joeread = cuav_joe.JoeIterator(os.path.join('.', 'joe.log')) joeret = joeread.getjoes() assert len(joeret) == 2 assert joeret[ 0] == "JoePosition(lat=-30.000235 lon=144.999639 MavPosition(pos -30.000000 145.000000 alt=34.6 roll=20.0 pitch=-56.7 yaw=345.0) img2017111312451230Z.png None (10, 10, 25, 23) latlon=(-30.000235126851315, 144.9996388367703) score=None Sat Nov 12 23:46:03 2016 2016111212460300Z)" or "JoePosition(lat=-30.000235 lon=144.999639 MavPosition(pos -30.000000 145.000000 alt=34.6 roll=20.0 pitch=-56.7 yaw=345.0) img2017111312451230Z.png None (10, 10, 25, 23) latlon=(-30.000235126851315, 144.9996388367703) score=None Sat Nov 12 12:46:03 2016 2016111212460300Z)" assert joeret[ 1] == "JoePosition(lat=-30.000367 lon=144.999711 MavPosition(pos -30.000000 145.000000 alt=34.6 roll=20.0 pitch=-56.7 yaw=345.0) img2017111312451230Z.png None (200, 205, 252, 236) latlon=(-30.000366794010567, 144.9997107272955) score=None Sat Nov 12 23:46:03 2016 2016111212460300Z)" or "JoePosition(lat=-30.000367 lon=144.999711 MavPosition(pos -30.000000 145.000000 alt=34.6 roll=20.0 pitch=-56.7 yaw=345.0) img2017111312451230Z.png None (200, 205, 252, 236) latlon=(-30.000366794010567, 144.9997107272955) score=None Sat Nov 12 12:46:03 2016 2016111212460300Z)" os.remove(os.path.join('.', 'joe.log'))
def dewarp(imagedir): # Loading from json file C = CameraParams.fromfile(os.path.join(imagedir, "params.json")) K = C.K D = C.D print("Loaded camera parameters from " + os.path.join(imagedir, "params.json")) for f in file_list(imagedir, ['jpg', 'jpeg', 'png']): print(f) colour = cv2.imread(f) grey = cv2.cvtColor(colour, cv2.COLOR_BGR2GRAY) h, w = grey.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix( K, D, (w, h), 1, (w, h)) mapx, mapy = cv2.initUndistortRectifyMap(K, D, None, newcameramtx, (w, h), 5) dewarped = cv2.remap(grey, mapx, mapy, cv2.INTER_LINEAR) x, y, w, h = roi dewarped = dewarped[y:y + h, x:x + w] grey = cv2.resize(grey, (0, 0), fx=0.5, fy=0.5) dewarped = cv2.resize(dewarped, (0, 0), fx=0.5, fy=0.5) cv2.imshow("Original", grey) cv2.imshow("Dewarped", dewarped) cv2.waitKey(-1)
def dewarp(imagedir): # Loading from json file C = CameraParams.fromfile(os.path.join(imagedir, "params.json")) K = C.K D = C.D print("Loaded camera parameters from " + os.path.join(imagedir, "params.json")) for f in file_list(imagedir, ['jpg', 'jpeg', 'png']): print(f) colour = cv2.imread(f) grey = cv2.cvtColor(colour, cv2.COLOR_BGR2GRAY) h, w = grey.shape[:2] newcameramtx, roi=cv2.getOptimalNewCameraMatrix(K, D, (w,h), 1, (w,h)) mapx, mapy = cv2.initUndistortRectifyMap(K, D, None, newcameramtx, (w,h), 5) dewarped = cv2.remap(grey, mapx, mapy, cv2.INTER_LINEAR) x, y, w, h = roi dewarped = dewarped[y:y+h, x:x+w] grey = cv2.resize(grey, (0,0), fx=0.5, fy=0.5) dewarped = cv2.resize(dewarped, (0,0), fx=0.5, fy=0.5) cv2.imshow("Original", grey ) cv2.imshow("Dewarped", dewarped) cv2.waitKey(-1)
def test_do_calibrate(): dirry = os.path.join('.', 'cuav', 'data', 'ChameleonArecort') outfile = os.path.join('.', 'cuav', 'data', 'ChameleonArecort', 'paramsout.json') calibrate.calibrate(dirry, 10, 7) assert os.path.isfile(outfile) C = CameraParams.fromfile(outfile) assert C is not None os.remove(outfile)
def gps_position_from_image_region(region, pos, width=1280, height=960, C=CameraParams(), altitude=None): ''' return a GPS position in an image given a MavPosition object and an image region tuple ''' if pos is None: return None x = (region.x1+region.x2)*0.5 y = (region.y1+region.y2)*0.5 return gps_position_from_xy(x, y, pos, C=C, altitude=altitude)
def check_camera_parms(self): '''check for change in camera parameters''' #dir is rel to this python file: if self.camera_settings.camparms is None: return False camfiletxt = pkg_resources.resource_string("cuav", self.camera_settings.camparms) try: self.c_params = CameraParams.fromstring(camfiletxt) return True except: return False
def check_camera_parms(self): '''check for change in camera parameters''' #dir is rel to this python file: if self.camera_settings.camparms is None: return False camfiletxt = pkg_resources.resource_string( "cuav", self.camera_settings.camparms) try: self.c_params = CameraParams.fromstring(camfiletxt) return True except: return False
def test_pixel_position_matt(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=768) (east, north) = pixel_position_matt(100, 100, 123, 0.1, 2, 0, C) assert abs(-67.3798 - east) < 0.001 assert abs(43.6719 - north) < 0.001 (east, north) = pixel_position_matt(0, 130, 57, 0.1, 2, 0, C) assert abs(-38.4761 - east) < 0.001 assert abs(18.188 - north) < 0.001
def test_pixel_coordinates(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=800) (lat, lon) = pixel_coordinates(512, 400, -50, 145, 123, 0, 0, 90, C) assert abs(-50 - lat) < 0.00001 assert abs(145 - lon) < 0.00001 (lat, lon) = pixel_coordinates(200, 100, -50, 145, 123, 2, 5, 50, C) assert abs(-49.99928 - lat) < 0.00001 assert abs(145.00001 - lon) < 0.00001
def test_meters_per_pixel(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=800) frame_time = 1478954763.0 pos = mav_position.MavPosition(-50, 145, 120, 0, 0, 90, frame_time) ret = meters_per_pixel(pos, C) assert abs(0.1463 - ret) < 0.001 pos = mav_position.MavPosition(-50, 145, 85, 3, 1, 45, frame_time) ret = meters_per_pixel(pos, C) assert abs(0.1041 - ret) < 0.001
def test_cam_params_dict(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=3000, yresolution=4000) C.setParams([[1, 2, 3], [4, 5, 6]], [0, 6, 7, 8]) Cdict = C.todict() C2dict = CameraParams.fromdict(Cdict) assert C.todict() == C2dict.todict() assert numpy.array_equal(C.K, C2dict.K) assert numpy.array_equal(C.D, C2dict.D)
def test_cam_params_txt(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1280, yresolution=960) C.setParams([[1, 2, 3], [4, 5, 6]], [0, 6, 7, 8]) C.save('foo.txt') C2 = CameraParams.fromfile('foo.txt') assert str(C) == str(C2) assert numpy.array_equal(C.K, C2.K) assert numpy.array_equal(C.D, C2.D) os.remove('foo.txt')
def __init__(self, slipmap, grid_width=20, grid_height=20, thumb_size=35, C=CameraParams(), camera_settings=None, image_settings=None, start_menu=False): self.thumb_size = thumb_size self.width = grid_width * thumb_size self.height = grid_height * thumb_size self.mosaic = cv.CreateImage((self.height, self.width), 8, 3) cuav_util.zero_image(self.mosaic) self.display_regions = grid_width * grid_height self.regions = [] self.regions_sorted = [] self.page = 0 self.sort_type = 'Time' self.images = [] self.current_view = 0 self.last_view_latlon = None self.view_filename = None self.full_res = False self.boundary = [] self.displayed_image = None self.last_click_position = None self.c_params = C self.camera_settings = camera_settings self.image_settings = image_settings self.start_menu = start_menu self.has_started = not start_menu import wx self.image_mosaic = mp_image.MPImage(title='Mosaic', mouse_events=True, key_events=True, auto_size=True) self.slipmap = slipmap self.selected_region = 0 self.view_image = None self.brightness = 1 # dictionary of image requests, contains True if fullres image is wanted self.image_requests = {} self.slipmap.add_callback(functools.partial(self.map_callback)) self.add_menus()
def test_gps_position_from_image_region(): frame_time = 1478954763.0 pos = mav_position.MavPosition(-50, 145, 120, 0, 0, 90, frame_time) region = cuav_region.Region(10, 10, 25, 23, None, scan_score=450) C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=800) (lat, lon) = gps_position_from_image_region(region, pos, width=1024, height=800, C=C, altitude=None) assert abs(-49.99934 - lat) < 0.00001 assert abs(145.00078 - lon) < 0.00001
def gps_position_from_xy(x, y, pos, C=CameraParams(), altitude=None): ''' return a GPS position in an image given a MavPosition object and an image x,y position ''' if pos is None: return None width=C.xresolution height=C.yresolution # assume the image came from the same camera but may no longer be original size scale_x = float(C.xresolution)/float(width) scale_y = float(C.yresolution)/float(height) x *= scale_x y *= scale_y if altitude is None: altitude = pos.altitude return pixel_coordinates(x, y, pos.lat, pos.lon, altitude, pos.pitch, pos.roll, pos.yaw, C)
def __init__(self, mpstate): super(CameraViewModule, self).__init__(mpstate, "cameraview") self.add_command('cameraview', self.cmd_cameraview, "camera view") self.roll = 0 self.pitch = 0 self.yaw = 0 self.mount_roll = 0 self.mount_pitch = 0 self.mount_yaw = 0 self.height = 0 self.lat = 0 self.lon = 0 self.home_height = 0 self.hdg = 0 self.elevation_model = mp_elevation.ElevationModel() self.camera_params = CameraParams() # TODO how to get actual camera params self.view_settings = mp_settings.MPSettings( [ ('r', float, 0.5), ('g', float, 0.5), ('b', float, 1.0), ]) self.update_col()
def test_gps_position_from_xy(): C = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1024, yresolution=800) frame_time = 1478954763.0 pos = mav_position.MavPosition(-50, 145, 120, 0, 0, 90, frame_time) (lat, lon) = gps_position_from_xy(512, 400, pos, C=C, altitude=120, shape=None) assert abs(-50 - lat) < 0.00001 assert abs(145 - lon) < 0.00001 (lat, lon) = gps_position_from_xy(200, 100, pos, C=C, altitude=120, shape=None) assert abs(-49.999589 - lat) < 0.00001 assert abs(145.000614 - lon) < 0.00001
def calibrate(imagedir, cbrow, cbcol): nimages = 0 datapoints = [] im_dims = (0, 0) # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) objp = numpy.zeros((cbrow * cbcol, 3), numpy.float32) objp[:, :2] = numpy.mgrid[0:cbcol, 0:cbrow].T.reshape(-1, 2) # Arrays to store object points and image points from all the images. objpoints = [] # 3d point in real world space imgpoints = [] # 2d points in image plane. files = file_list(imagedir, ['jpg', 'jpeg', 'png']) for f in files: colour = cv2.imread(f) grey = cv2.cvtColor(colour, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners( grey, (cbcol, cbrow), flags=cv2.CALIB_CB_ADAPTIVE_THRESH) if (ret): print('using ' + f) cv2.cornerSubPix( grey, corners, (11, 11), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01)) objpoints.append(objp) imgpoints.append(corners) im_dims = grey.shape[:2] if len(imgpoints) == 0: print("Not enough good quality images. Aborting") return ret, K, D, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, grey.shape[::-1], None, None) # storing results using CameraParams C = CameraParams(lens=lens, sensorwidth=sensorwidth, xresolution=im_dims[1], yresolution=im_dims[0]) C.setParams(K, D) C.save(os.path.join(imagedir, "paramsout.json")) print("Saved params in " + os.path.join(imagedir, "paramsout.json"))
def test_Mosaic(): #slipmap = mp_slipmap.MPSlipMap(service='GoogleSat', elevation=True, title='Map') #mocked_slipmap.return_value = 1 #monkeypatch.setattr('slipmap', lambda x: 1) mocked_slipmap = mock.MagicMock(return_value=1) C_params = CameraParams(lens=4.0, sensorwidth=5.0, xresolution=1280, yresolution=960) mosaic = cuav_mosaic.Mosaic(mocked_slipmap, C=C_params) mosaic.set_mosaic_size((200, 200)) assert mosaic.mosaic.shape == (175, 175, 3) f = os.path.join(os.getcwd(), 'tests', 'testdata', 'raw2016111223465120Z.png') img = cv2.imread(f) pos = mav_position.MavPosition(-30, 145, 34.56, 20, -56.67, 345, frame_time=1478994408.76) regions = [] regions.append(cuav_region.Region(1020, 658, 1050, 678, (30, 30), scan_score=20)) regions.append(cuav_region.Region(30, 54, 50, 74, (20, 20), scan_score=15)) regions.append(cuav_region.Region(30, 54, 55, 79, (25, 25), scan_score=10)) for i in range(40): regions.append(cuav_region.Region(200, 600, 220, 620, (20, 20), scan_score=45)) composite = cuav_region.CompositeThumbnail(img, regions) thumbs = cuav_mosaic.ExtractThumbs(composite, len(regions)) mosaic.add_regions(regions, thumbs, f, pos) mosaic.add_image(1478994408.76, f, pos) mosaic.show_region(0) mosaic.view_imagefile(f) assert mosaic.find_image_idx(f) == 0 mosaic.view_imagefile_by_idx(0) mocked_key = mock.MagicMock(return_value=1) mocked_key.objkey = "region 1" assert mosaic.show_selected(mocked_key) == True mosaic.show_closest((-30, 145), mocked_key) mosaic.view_image.terminate() #mosaic.map_menu_callback #mosaic.map_callback OBC_boundary = cuav_util.polygon_load(os.path.join(os.getcwd(), 'tests', 'testdata', 'OBC_boundary.txt')) mosaic.set_boundary(OBC_boundary) mosaic.change_page(1) mosaic.hide_page() assert len(mosaic.regions_sorted) == 25 mosaic.unhide_all() assert len(mosaic.regions_sorted) == 43 for i in ['Score', 'ScoreReverse', 'Distinctiveness', 'Whiteness', 'Time']: mosaic.sort_type = i mosaic.re_sort() #mosaic.menu_event assert mosaic.started() == True mosaic.popup_show_image(mosaic.regions[2]) mosaic.popup_fetch_image(mosaic.regions[2], 'fetchImageFull') assert len(mosaic.get_image_requests()) == 1 mosaic.view_image.terminate() #mosaic.menu_event_view mocked_pos = mock.MagicMock(return_value=1) mocked_pos.x = 10 mocked_pos.y = 10 assert mosaic.pos_to_region(mocked_pos) == mosaic.regions[0] assert mosaic.objkey_to_region(mocked_key) == mosaic.regions[1] #mosaic.mouse_event #mosaic.mouse_event_view mosaic.key_event(1) assert mosaic.region_on_page(2, 0) == True assert mosaic.region_on_page(2000, 20) == False mosaic.mouse_region = mosaic.regions[0] mosaic.display_mosaic_region(0) mosaic.redisplay_mosaic() assert mosaic.make_thumb(img, regions[0], 8).shape == (8, 8, 3) assert mosaic.make_thumb(img, regions[0], 30).shape == (30, 30, 3) mosaic.tag_image(1478994408.76) #mosaic.check_events mosaic.image_mosaic.terminate()
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), ("filter_type", str, "simple"), ("fullres", 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 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)
def __init__(self, slipmap, grid_width=20, grid_height=20, thumb_size=35, C=CameraParams(), camera_settings = None, image_settings = None, start_menu=False, classify=None): self.thumb_size = thumb_size self.width = grid_width * thumb_size self.height = grid_height * thumb_size self.mosaic = cv.CreateImage((self.height,self.width),8,3) cuav_util.zero_image(self.mosaic) self.display_regions = grid_width*grid_height self.regions = [] self.regions_sorted = [] self.regions_hidden = set() self.mouse_region = None self.ridx_by_frame_time = {} self.page = 0 self.sort_type = 'Time' self.images = [] self.current_view = 0 self.last_view_latlon = None self.view_filename = None self.full_res = False self.boundary = [] self.displayed_image = None self.last_click_position = None self.c_params = C self.camera_settings = camera_settings self.image_settings = image_settings self.start_menu = start_menu self.classify = classify self.has_started = not start_menu import wx self.image_mosaic = mp_image.MPImage(title='Mosaic', mouse_events=True, key_events=True, auto_size=False, report_size_changes=True) self.slipmap = slipmap self.selected_region = 0 self.view_image = None self.brightness = 1 # dictionary of image requests, contains True if fullres image is wanted self.image_requests = {} self.slipmap.add_callback(functools.partial(self.map_callback)) if classify: import lxml.objectify, lxml.etree with open(classify) as f: categories = lxml.objectify.fromstring(f.read()) cat_names = set() self.categories = [] try: for c in categories.category: self.categories.append((c.get('shortcut') or '', c.text)) if c.text in cat_names: print 'WARNING: category name',c.text,'used more than once' else: cat_names.add(c.text) except AttributeError as ex: print ex print 'failed to load any categories for classification' self.region_class = lxml.objectify.E.regions() self.add_menus()
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)