entweder als Zelle in Jupyter Notebook verwenden
oder als SerReader.py importieren:
from datetime import datetime,timedeltaimport numpy as npclass SerReader: """Class for reading LUCAM-RECORDER .ser files (astro video cameras > 8bit) random access, yields frames as numpy arrays usage: sr = SerReader(filename) opens file, get header and trailer frameTime, frame = sr.getFrame(i) called for each frame, yields one frame as Numpy array sr.printHeader() prints header information sr.close() close file at the moment: monochrome or raw 2byte/pixel only, no error handling
.. ser format description see: http://www.grischa-hahn.homepage.t-online.de/astro/ser/ """ def __init__(self, filename): """docstring SerReader init""" self.filename = filename f = open(self.filename,'rb') self.f = f f.seek(0,2) self.fileLength=f.tell() self.getHeader() self.getTrailer() def printHeader(self): """prints file header and file properties""" print('-----------------------------') print('filename', self.filename) print('fileLength', self.fileLength) print('frameSize', self.frameSize) print(' Header:') header=self.header print('FileID',header['FileID']) print('LuID',header['LuID']) print('ColorID',header['ColorID']) print('LittleEndian',header['LittleEndian']) print('ImageWidth',header['ImageWidth']) print('ImageHeight',header['ImageHeight']) print('PixelDepthPerPlane',header['PixelDepthPerPlane']) print('FrameCount',header['FrameCount']) print('Observer',header['Observer']) print('Instrument',header['Instrument']) print('Telescope',header['Telescope']) print('DateTime',header['DateTime']) print('DateTime_UTC',header['DateTime_UTC']) print('-----------------------------') def getFrame(self,frameNumber): """returns requested frame as nump array, UTC date time of frame if given in file""" f=self.f header=self.header f.seek(178+frameNumber*self.frameSize) frame = np.fromfile(f, dtype=np.uint16, count=header['ImageWidth']*header['ImageHeight']) frame.shape=(header['ImageWidth'],header['ImageHeight']) if len(self.trailer) >= frameNumber: us = self.trailer[frameNumber]/10 FrameDateTime = datetime(1,1,1) + timedelta(microseconds=us) else: FrameDateTime = 'not defined' return FrameDateTime, frame def closeFile(self): """close file""" f=self.f f.close() def getHeader(self): """private: read header information""" f=self.f f.seek(0,0) header={} header['FileID'] = np.fromfile(f, dtype=np.dtype(('S14', 1)), count=1)[0] header['LuID'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['ColorID'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['LittleEndian'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['ImageWidth'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['ImageHeight'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['PixelDepthPerPlane'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['FrameCount'] = np.fromfile(f, dtype=np.int32, count=1)[0] header['Observer'] = np.fromfile(f, dtype=np.dtype(('S40', 1)), count=1)[0] header['Instrument'] = np.fromfile(f, dtype=np.dtype(('S40', 1)), count=1)[0] header['Telescope'] = np.fromfile(f, dtype=np.dtype(('S40', 1)), count=1)[0] us = np.fromfile(f, dtype=np.int64, count=1)[0]/10 header['DateTime'] = datetime(1,1,1) + timedelta(microseconds=us) us = np.fromfile(f, dtype=np.int64, count=1)[0]/10 header['DateTime_UTC'] = datetime(1,1,1) + timedelta(microseconds=us) self.BytePerPixel=2 self.frameSize=np.int64(header['ImageWidth']*header['ImageHeight']*self.BytePerPixel) self.header=header return def getTrailer(self): """private: read trailer (UTC date time for each frame)""" f=self.f if 178+self.header['FrameCount']*self.frameSize < self.fileLength: f.seek(178+self.header['FrameCount']*self.frameSize) self.trailer = np.fromfile(f, dtype=np.int64, count=self.header['FrameCount']) else: self.trailer = [] return