Ejemplo n.º 1
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.º 2
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.º 3
0
    def _process_seq(self, input_file, output_subfolder):

        logger.debug("Processing {}".format(input_file))
        gpslog = open(os.path.join(output_subfolder, "gpsLog.txt"), 'w')

        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)

                    gps_data = frame.get_gps()
                    gps_data = ','.join(str(g) for g in gps_data)
                    gpslog.write(gps_data)
                    gpslog.write('\n')

                    # Need FFF files to extract meta, but we do it one go afterwards
                    if self.export_fff 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_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()

                    if self.export_tiff and self._check_overwrite(
                            filename_tiff):
                        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

        gpslog.close()
        return