comparison python/metadata.py @ 819:fc8b3ce629d1

important modifications to metadata
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 22 Jun 2016 14:51:00 -0400
parents 180b6b0231c0
children 26daf35180ad
comparison
equal deleted inserted replaced
818:181bcb6dad3a 819:fc8b3ce629d1
1 # from moving import Point 1 # from moving import Point
2 2
3 from datetime import datetime 3 from datetime import datetime
4 from os import path 4 from os import path
5 5
6 from sqlalchemy import create_engine, Column, Integer, Float, DateTime, String, ForeignKey 6 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean
7 from sqlalchemy.orm import relationship, backref, sessionmaker 7 from sqlalchemy.orm import relationship, backref, sessionmaker
8 from sqlalchemy.ext.declarative import declarative_base 8 from sqlalchemy.ext.declarative import declarative_base
9 9
10 from utils import datetimeFormat 10 from utils import datetimeFormat, removeExtension
11 11
12 Base = declarative_base() 12 Base = declarative_base()
13 13
14 class Site(Base): 14 class Site(Base):
15 __tablename__ = 'sites' 15 __tablename__ = 'sites'
18 description = Column(String) # longer names, eg intersection of road1 and road2 18 description = Column(String) # longer names, eg intersection of road1 and road2
19 xcoordinate = Column(Float) # ideally moving.Point, but needs to be 19 xcoordinate = Column(Float) # ideally moving.Point, but needs to be
20 ycoordinate = Column(Float) 20 ycoordinate = Column(Float)
21 mapImageFilename = Column(String) # path to filename, relative to site name, ie sitename/mapImageFilename 21 mapImageFilename = Column(String) # path to filename, relative to site name, ie sitename/mapImageFilename
22 nUnitsPerPixel = Column(Float) # number of units of distance per pixel in map image 22 nUnitsPerPixel = Column(Float) # number of units of distance per pixel in map image
23 23 worldDistanceUnit = Column(String, default = 'm') # make sure it is default in the database
24 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None, mapImageFilename = None, nUnitsPerPixel = 1.): 24
25 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None, mapImageFilename = None, nUnitsPerPixel = 1., worldDistanceUnit = 'm'):
25 self.name = name 26 self.name = name
26 self.description = description 27 self.description = description
27 self.xcoordinate = xcoordinate 28 self.xcoordinate = xcoordinate
28 self.ycoordinate = ycoordinate 29 self.ycoordinate = ycoordinate
29 self.mapImageFilename = mapImageFilename 30 self.mapImageFilename = mapImageFilename
30 self.nUnitsPerPixel = nUnitsPerPixel 31 self.nUnitsPerPixel = nUnitsPerPixel
32 self.worldDistanceUnit = worldDistanceUnit
31 33
32 def getFilename(self): 34 def getFilename(self):
33 return self.name 35 return self.name
34 36
35 class EnvironementalFactors(Base): 37 class EnvironementalFactors(Base):
51 self.startTime = datetime.strptime(startTime, datetimeFormat) 53 self.startTime = datetime.strptime(startTime, datetimeFormat)
52 self.endTime = datetime.strptime(endTime, datetimeFormat) 54 self.endTime = datetime.strptime(endTime, datetimeFormat)
53 self.description = description 55 self.description = description
54 self.site = site 56 self.site = site
55 57
58 class CameraType(Base):
59 ''' Represents parameters of the specific camera used.
60
61 Taken and adapted from tvalib'''
62 __tablename__ = 'camera_types'
63 idx = Column(Integer, primary_key=True)
64 name = Column(String)
65 resX = Column(Integer)
66 resY = Column(Integer)
67 frameRate = Column(Float)
68 undistort = Column(Boolean)
69 intrinsicCameraMatrixStr = Column(String)
70 distortionCoefficientsStr = Column(String)
71 undistortedImageMultiplication = Column(Float)
72
73 def __init__(self, name, resX, resY, frameRate, trackingConfigurationFilename = None, undistort = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None):
74 self.name = name
75 self.resX = resX
76 self.resY = resY
77 self.frameRate = frameRate
78 self.undistort = False
79
80 if trackingConfigurationFilename is not None:
81 from storage import ProcessParameters
82 params = ProcessParameters(trackingConfigurationFilename)
83 if params.undistort:
84 self.undistort = params.undistort
85 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix
86 self.distortionCoefficients = params.distortionCoefficients
87 self.undistortedImageMultiplication = params.undistortedImageMultiplication
88 elif undistort is not None:
89 self.undistort = undistort
90 self.intrinsicCameraMatrix = intrinsicCameraMatrix
91 self.distortionCoefficients = distortionCoefficients
92 self.undistortedImageMultiplication = undistortedImageMultiplication
93
94 # populate the db
95 if self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None:
96 self.intrinsicCameraMatrixStr = ' '.join('{}'.format(x) for x in self.intrinsicCameraMatrix.flatten('C'))
97 self.distortionCoefficientsStr = ' '.join('{}'.format(x)for x in self.distortionCoefficients)
98
99 @orm.reconstructor
100 def initOnLoad(self):
101 from numpy import array
102 if len(self.intrinsicCameraMatrixStr) > 0:
103 self.intrinsicCameraMatrix = array([float(x) for x in self.intrinsicCameraMatrixStr.split(" ")]).reshape(3,3)
104 if len(self.distortionCoefficientsStr) > 0:
105 self.distortionCoefficients = [float(x) for x in self.distortionCoefficientsStr.split(" ")]
106
56 class CameraView(Base): 107 class CameraView(Base):
57 __tablename__ = 'camera_views' 108 __tablename__ = 'camera_views'
58 idx = Column(Integer, primary_key=True) 109 idx = Column(Integer, primary_key=True)
59 frameRate = Column(Float)
60 homographyFilename = Column(String) # path to homograph filename, relative to the site name 110 homographyFilename = Column(String) # path to homograph filename, relative to the site name
61 cameraCalibrationFilename = Column(String) # path to full camera calibration, relative to the site name
62 siteIdx = Column(Integer, ForeignKey('sites.idx')) 111 siteIdx = Column(Integer, ForeignKey('sites.idx'))
112 cameraTypeIdx = Column(Integer, ForeignKey('camera_types.idx'))
63 homographyDistanceUnit = Column(String, default = 'm') # make sure it is default in the database 113 homographyDistanceUnit = Column(String, default = 'm') # make sure it is default in the database
64 configurationFilename = Column(String) # path to configuration .cfg file, relative to site name 114 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name
65 115
66 site = relationship("Site", backref=backref('camera_views', order_by = idx)) 116 site = relationship("Site", backref=backref('sites', order_by = idx))
67 117 camera = relationship('CameraType', backref=backref('camera_views', order_by = idx))
68 def __init__(self, frameRate, homographyFilename, cameraCalibrationFilename, site, configurationFilename): 118
69 self.frameRate = frameRate 119 def __init__(self, homographyFilename, site, cameraType, trackingConfigurationFilename):
70 self.homographyFilename = homographyFilename 120 self.homographyFilename = homographyFilename
71 self.site = site 121 self.site = site
72 self.configurationFilename = configurationFilename 122 self.cameraType = cameraType
123 self.trackingConfigurationFilename = trackingConfigurationFilename
73 124
74 def getHomographyFilename(self, relativeToSiteFilename = True): 125 def getHomographyFilename(self, relativeToSiteFilename = True):
75 if relativeToSiteFilename: 126 if relativeToSiteFilename:
76 return self.site.getFilename()+path.sep+self.homographyFilename 127 return self.site.getFilename()+path.sep+self.homographyFilename
77 else: 128 else:
78 return self.homographyFilename 129 return self.homographyFilename
130
131 def getTrackingConfigurationFilename(self, relativeToSiteFilename = True):
132 if relativeToSiteFilename:
133 return self.site.getFilename()+path.sep+self.trackingConfigurationFilename
134 else:
135 return self.trackingConfigurationFilename
136
137 def getTrackingParameters(self):
138 return ProcessParameters(getTrackingConfigurationFilename())
79 139
80 class Alignment(Base): 140 class Alignment(Base):
81 __tablename__ = 'alignments' 141 __tablename__ = 'alignments'
82 idx = Column(Integer, primary_key=True) 142 idx = Column(Integer, primary_key=True)
83 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) 143 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
107 idx = Column(Integer, primary_key=True) 167 idx = Column(Integer, primary_key=True)
108 name = Column(String) # path relative to the the site name 168 name = Column(String) # path relative to the the site name
109 startTime = Column(DateTime) 169 startTime = Column(DateTime)
110 duration = Column(Float) # video sequence duration 170 duration = Column(Float) # video sequence duration
111 durationUnit = Column(String, default = 's') 171 durationUnit = Column(String, default = 's')
172 databaseFilename = Column(String) # path relative to the the site name
112 siteIdx = Column(Integer, ForeignKey('sites.idx')) 173 siteIdx = Column(Integer, ForeignKey('sites.idx'))
113 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) 174 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
114 configurationFilename = Column(String)
115 175
116 site = relationship("Site", backref=backref('video_sequences', order_by = idx)) 176 site = relationship("Site", backref=backref('video_sequences', order_by = idx))
117 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx)) 177 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx))
118 178
119 def __init__(self, name, startTime, duration, site, cameraView, configurationFilename = None): 179 def __init__(self, name, startTime, duration, site, cameraView, databaseFilename = None):
120 'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39' 180 'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39'
121 self.name = name 181 self.name = name
122 self.startTime = datetime.strptime(startTime, datetimeFormat) 182 self.startTime = datetime.strptime(startTime, datetimeFormat)
123 self.duration = duration 183 self.duration = duration
124 self.site = site 184 self.site = site
125 self.cameraView = cameraView 185 self.cameraView = cameraView
126 self.configurationFilename = configurationFilename 186 if databaseFilename is None and len(self.name) > 0:
187 self.databaseFilename = removeExtension(self.name)+'.sqlite'
127 188
128 def getVideoSequenceFilename(self, relativeToSiteFilename = True): 189 def getVideoSequenceFilename(self, relativeToSiteFilename = True):
129 if relativeToSiteFilename: 190 if relativeToSiteFilename:
130 return self.site.getFilename()+path.sep+self.name 191 return self.site.getFilename()+path.sep+self.name
131 else: 192 else:
132 return self.name 193 return self.name
133 194
134 #def getConfigurationFilename(self): 195
135 #'returns the local configuration filename, or the one of the camera view otherwise'
136 196
137 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file) 197 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file)
138 198
139 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines 199 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines
140 200