Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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