def read(self): index = 0 while (index == 0): match = next(self.it, None) if (match is None): self.current_file_idx = self.current_file_idx + 1 if (self.current_file_idx < len(self.file_list)): self._load_next_file() continue else: print('Loaded All Files') return None, None, None index = match.start() chunksize = index - self.prev_pos self.prev_pos = index # Extract next FFF frame if self.use_mmap is False: chunk = self.seq_blob[index:index + chunksize] else: chunk = self.seq_blob.read(chunksize) frame = Fff(chunk) gps_data = frame.get_gps() image = frame.get_image() drange = image.max() - image.min() preview_data = (255.0 * ((image - image.min()) / drange)).astype('uint8') preview_data = cv2.cvtColor(preview_data, cv2.COLOR_GRAY2RGB) return image, preview_data, gps_data
class TestFff: def setup_method(self): folder = os.path.dirname(os.path.abspath(__file__)) self.test_data_fff = os.path.join(folder, "test_data", "frame_000000.fff") self.test_data_meta = os.path.join(folder, "test_data", "frame_000000.txt") self.frame = Fff(self.test_data_fff) def test_read_image(self): image = self.frame.get_image() assert len(image.shape) == 2 def test_read_radiometric_image(self): image = self.frame.get_radiometric_image() assert len(image.shape) == 2 def test_fff_gps(self): coord = self.frame.get_gps() assert len(coord) == 9 def test_from_bytes(self): with open(self.test_data_fff, 'rb') as infile: self.frame = Fff(infile.read()) # Check GPS for sanity coord = self.frame.get_gps() assert len(coord) == 9
def test_from_bytes(self): with open(self.test_data_fff, 'rb') as infile: self.frame = Fff(infile.read()) # Check GPS for sanity coord = self.frame.get_gps() assert len(coord) == 9
def setup_method(self): folder = os.path.dirname(os.path.abspath(__file__)) self.test_data_fff = os.path.join(folder, "test_data", "frame_000000.fff") self.test_data_meta = os.path.join(folder, "test_data", "frame_000000.txt") self.frame = Fff(self.test_data_fff)
def __getitem__(self, index): """ Retuns a FFF image in the sequence """ offset, chunksize = self.pos[index] chunk = self.seq_blob[offset:offset+chunksize] return Fff(chunk)
def _process_seq(self, input_file, output_subfolder): logger.debug("Processing {}".format(input_file)) with open(input_file, 'rb') as seq_file: # Memory mapping may speed up things. This is kinda slow though, because we still have to parse the entire file # and then go back through the regexes to find individual frames. Should really use a stream. if self.use_mmap: seq_blob = mmap.mmap(seq_file.fileno(), 0, access=mmap.ACCESS_READ) else: seq_blob = seq_file.read() it = self._get_fff_iterator(seq_blob) pos = [] prev_pos = 0 meta = None for i, match in tqdm(enumerate(it)): index = match.start() chunksize = index-prev_pos pos.append((index, chunksize)) prev_pos = index if self.split_filetypes: self._make_split_folders(output_subfolder) filename_fff = os.path.join(output_subfolder, "raw", "frame_{0:06d}.fff".format(self.frame_count)) filename_tiff = os.path.join(output_subfolder, "radiometric", "frame_{0:06d}.tiff".format(self.frame_count)) filename_preview = os.path.join(output_subfolder, "preview", "frame_{:06d}.{}".format(self.frame_count, self.preview_format)) filename_meta = os.path.join(output_subfolder, "raw", "frame_{0:06d}.txt".format(self.frame_count)) else: filename_fff = os.path.join(output_subfolder, "frame_{0:06d}.fff".format(self.frame_count)) filename_tiff = os.path.join(output_subfolder, "frame_{0:06d}.tiff".format(self.frame_count)) filename_preview = os.path.join(output_subfolder, "frame_{:06d}.{}".format(self.frame_count, self.preview_format)) filename_meta = os.path.join(output_subfolder, "frame_{0:06d}.txt".format(self.frame_count)) if index == 0: continue # Extract next FFF frame if self.use_mmap is False: chunk = seq_blob[index:index+chunksize] else: chunk = seq_blob.read(chunksize) if i % self.step == 0: frame = Fff(chunk, height=self.height, width=self.width) # Need FFF files to extract meta, but we do it one go afterwards if self.export_meta and self._check_overwrite(filename_fff): frame.write(filename_fff) # We need at least one meta file to get the radiometric conversion coefficients if meta is None and self.export_radiometric: frame.write(filename_fff) self.exiftool.write_meta(filename_fff) meta = self.exiftool.meta_from_file(filename_meta) # Export raw files and/or radiometric convert them if self.export_tiff and self._check_overwrite(filename_tiff): if self.export_radiometric and meta is not None: image = frame.get_radiometric_image(meta) image += 273.15 # Convert to Kelvin image /= 0.04 else: image = frame.get_image() self._write_tiff(filename_tiff, image) # Export preview frame (crushed to 8-bit) if self.export_preview and self._check_overwrite(filename_preview): self._write_preview(filename_preview, image) self.frame_count += 1 return