@@ -31,6 +31,11 @@
except :
pass
try :
import telegraf
except Exception as e :
print (str (e ))
logging .getLogger ("paramiko" ).setLevel (logging .WARNING )
@@ -272,7 +277,6 @@ def __init__(self, config=None, config_filename=None, queue=None):
self .name = config .get ("name" , "DEFAULT_PANO_NAME" )
self .logger = logging .getLogger (self .name )
self ._output_dir = os .path .join (config .get ("output_dir" , "/home/images/upload" ), self .name )
self ._spool_dir = tempfile .mkdtemp (prefix = self .name )
self .output_dir = self ._output_dir
start_time_string = str (config .get ('starttime' , "0000" ))
@@ -384,6 +388,19 @@ def __init__(self, config=None, config_filename=None, queue=None):
self ._scan_order = self ._scan_order_translation .get (str (scan_order_unparsed ).lower ().replace (" " , "" ), 0 )
self .logger .info (self .summary )
try :
telegraf_client = telegraf .TelegrafClient (host = "localhost" , port = 8092 )
metric = {
"num_rows" : len (self ._tilt_pos_list ),
"num_cols" : len (self ._pan_pos_list ),
"recovery_index" : int (self ._recovery_file .get ("image_index" , 0 )),
"hfov" : self .camera .hfov ,
"vfov" : self .camera .vfov
}
telegraf_client .metric ("gigavision" , metric , tags = {'name' : self .name })
except :
pass
def set_current_as_first_corner (self ):
"""
This and :func:`set_current_as_second_corner`, both internally call enumerate positions.
@@ -893,89 +910,112 @@ def take_panorama(self):
# im1.shape[1]*len(self._pan_pos_list),
# 3), np.uint8)
# cv2.imwrite("overview.jpg", overview)
try :
telegraf_client = telegraf .TelegrafClient (host = "localhost" , port = 8092 )
except :
pass
with tempfile .TemporaryDirectory (prefix = self .name ) as spool :
def cap (_pan_pos : float , _tilt_pos : float , _image_index : int , lcap : int ) -> int :
"""
captures an image for the position _pan_pos,_tilt_pos with the image index _image_index
:param _pan_pos: the pan position to take an image
:param _tilt_pos: the tilt position to take an image
:param _image_index: index of the current image. used to write the image filename.
:param lcap: used to calculate how long capture is taking.
:return:
"""
self ._pantilt .position = _pan_pos , _tilt_pos
time .sleep (0.1 )
self .write_csv_log (_image_index , _pan_pos , _tilt_pos )
self .write_to_recovery_file (_image_index , now .strftime (ts_fmt ))
for _ in range (0 , 15 ):
filename = os .path .join (spool ,
now .strftime ("{name}_" + ts_fmt + "_{index:04}" ).format (name = self .name ,
index = _image_index + 1 ))
try :
output_filenames = list (self ._camera .capture (filename = filename ))
# output_filenames = self._camera.capture_monkey(filename=filename)
self .camera .communicate_with_updater ()
if type (output_filenames ) is list and len (output_filenames ):
# image = cv2.resize(self.camera.image.copy(),
# None, fx=0.1, fy=0.1,
# interpolation=cv2.INTER_NEAREST)
# yoff = _i * image.shape[0]
# xoff = _j * image.shape[1]
# overview[yoff:yoff+image.shape[0], xoff:xoff+image.shape[1]] = image
# cv2.imwrite("overview.jpg", overview)
for f in output_filenames :
shutil .move (f , os .path .join (this_dir , os .path .basename (f )))
self .logger .info ("wrote image {}/{}" .format (_image_index + 1 ,
(len (self ._pan_pos_list ) * len (
self ._tilt_pos_list ))))
lcap += 1
# update time per image
current_time = time .time ()
self ._seconds_per_image = (current_time - start_time ) / lcap
self .logger .info ("Seconds per image {0:.2f}s" .format (self ._seconds_per_image ))
return lcap
except Exception as e :
self .logger .error ("Bad things happened: {}" .format (str (e )))
else :
self .logger .error ("failed capturing!" )
return lcap
def cap (_pan_pos : float , _tilt_pos : float , _image_index : int , lcap : int ) -> int :
"""
captures an image for the position _pan_pos,_tilt_pos with the image index _image_index
:param _pan_pos: the pan position to take an image
:param _tilt_pos: the tilt position to take an image
:param _image_index: index of the current image. used to write the image filename.
:param lcap: used to calculate how long capture is taking.
:return:
"""
self ._pantilt .position = _pan_pos , _tilt_pos
time .sleep (0.1 )
self .write_csv_log (_image_index , _pan_pos , _tilt_pos )
self .write_to_recovery_file (_image_index , now .strftime (ts_fmt ))
for _ in range (0 , 15 ):
filename = os .path .join (self ._spool_dir ,
now .strftime ("{name}_" + ts_fmt + "_{index:04}" ).format (name = self .name ,
index = _image_index + 1 ))
try :
output_filenames = list (self ._camera .capture (filename = filename ))
# output_filenames = self._camera.capture_monkey(filename=filename)
self .camera .communicate_with_updater ()
if type (output_filenames ) is list and len (output_filenames ):
# image = cv2.resize(self.camera.image.copy(),
# None, fx=0.1, fy=0.1,
# interpolation=cv2.INTER_NEAREST)
# yoff = _i * image.shape[0]
# xoff = _j * image.shape[1]
# overview[yoff:yoff+image.shape[0], xoff:xoff+image.shape[1]] = image
# cv2.imwrite("overview.jpg", overview)
for f in output_filenames :
shutil .move (f , os .path .join (this_dir , os .path .basename (f )))
self .logger .info ("wrote image {}/{}" .format (_image_index + 1 ,
(len (self ._pan_pos_list ) * len (
self ._tilt_pos_list ))))
lcap += 1
# update time per image
current_time = time .time ()
self ._seconds_per_image = (current_time - start_time ) / lcap
self .logger .info ("Seconds per image {0:.2f}s" .format (self ._seconds_per_image ))
return lcap
except Exception as e :
self .logger .error ("Bad things happened: {}" .format (str (e )))
else :
self .logger .error ("failed capturing!" )
return lcap
# reverse it because we should start from top and go down
tilt_pos_list = list (reversed (self ._tilt_pos_list ))
pan_pos_list = self ._pan_pos_list
if self .scan_order == 1 :
# cols left
pan_pos_list = self ._pan_pos_list
# reverse it because we should start from top and go down
tilt_pos_list = list (reversed (self ._tilt_pos_list ))
elif self .scan_order == 3 :
# rows up
tilt_pos_list = self ._tilt_pos_list
pan_pos_list = list (reversed (self ._pan_pos_list ))
recovery_index = self ._recovery_file .get ('image_index' , 0 )
if self ._scan_order >= 2 :
for i , tilt_pos in enumerate (tilt_pos_list ):
for j , pan_pos in enumerate (pan_pos_list ):
image_index = i * len (pan_pos_list ) + j
if image_index < recovery_index :
continue
last_image_captured = cap (pan_pos , tilt_pos , image_index , last_image_captured )
else :
for j , pan_pos in enumerate (pan_pos_list ):
pan_pos_list = self ._pan_pos_list
if self .scan_order == 1 :
# cols left
pan_pos_list = self ._pan_pos_list
tilt_pos_list = list (reversed (self ._tilt_pos_list ))
elif self .scan_order == 3 :
# rows up
tilt_pos_list = self ._tilt_pos_list
pan_pos_list = list (reversed (self ._pan_pos_list ))
recovery_index = self ._recovery_file .get ('image_index' , 0 )
rolling = []
if self ._scan_order >= 2 :
for i , tilt_pos in enumerate (tilt_pos_list ):
image_index = j * (len (tilt_pos_list )) + i
if image_index < recovery_index :
continue
last_image_captured = cap (pan_pos , tilt_pos , image_index , last_image_captured )
for j , pan_pos in enumerate (pan_pos_list ):
image_index = i * len (pan_pos_list ) + j
if image_index < recovery_index :
continue
t = time .time ()
last_image_captured = cap (pan_pos , tilt_pos , image_index , last_image_captured )
rolling .append (time .time ()- t )
try :
metric = {'timing_avg_s' : sum (rolling )/ len (rolling ), 'total_images' : len (rolling )}
telegraf_client .metric ("gigavision" , metric , tags = {"name" : self .name })
except :
pass
else :
for j , pan_pos in enumerate (pan_pos_list ):
for i , tilt_pos in enumerate (tilt_pos_list ):
image_index = j * (len (tilt_pos_list )) + i
if image_index < recovery_index :
continue
t = time .time ()
last_image_captured = cap (pan_pos , tilt_pos , image_index , last_image_captured )
rolling .append (time .time () - t )
try :
metric = {'timing_avg_s' : sum (rolling ) / len (rolling ), 'total_images' : len (rolling )}
telegraf_client .metric ("gigavision" , metric , tags = {"name" : self .name })
except :
pass
shutil .move (self ._csv_log , os .path .join (self ._output_dir , os .path .basename (self ._csv_log )))
os .remove (self ._recovery_filename )
self ._recovery_file ['image_index' ] = 0
self .logger .info ("Panorama complete in {}" .format (sec2human (time .time () - start_time )))
t = time .time () - start_time
self .logger .info ("Panorama complete in {}" .format (sec2human (t )))
try :
telegraf_client .metric ("gigavision" , {'timing_total_s' : t }, tags = {"name" : self .name })
except :
pass
def calibrate_and_run (self ):
"""