Mercurial Hosting > traffic-intelligence
comparison python/metadata.py @ 614:5e09583275a4
Merged Nicolas/trafficintelligence into default
author | Mohamed Gomaa <eng.m.gom3a@gmail.com> |
---|---|
date | Fri, 05 Dec 2014 12:13:53 -0500 |
parents | 1262faae12e7 |
children | 180b6b0231c0 |
comparison
equal
deleted
inserted
replaced
598:11f96bd08552 | 614:5e09583275a4 |
---|---|
1 # from moving import Point | |
2 | |
3 from datetime import datetime | |
4 from os import path | |
5 | |
6 from sqlalchemy import create_engine, Column, Integer, Float, DateTime, String, ForeignKey | |
7 from sqlalchemy.orm import relationship, backref, sessionmaker | |
8 from sqlalchemy.ext.declarative import declarative_base | |
9 | |
10 from utils import datetimeFormat | |
11 | |
12 Base = declarative_base() | |
13 | |
14 class Site(Base): | |
15 __tablename__ = 'sites' | |
16 idx = Column(Integer, primary_key=True) | |
17 name = Column(String) # same as path, relative to the database position | |
18 description = Column(String) # longer names, eg intersection of road1 and road2 | |
19 xcoordinate = Column(Float) # ideally moving.Point, but needs to be | |
20 ycoordinate = Column(Float) | |
21 | |
22 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None): | |
23 self.name = name | |
24 self.description = description | |
25 self.xcoordinate = xcoordinate | |
26 self.ycoordinate = ycoordinate | |
27 | |
28 def getFilename(self): | |
29 return self.name | |
30 | |
31 class EnvironementalFactors(Base): | |
32 '''Represents any environmental factors that may affect the results, in particular | |
33 * changing weather conditions | |
34 * changing road configuration, geometry, signalization, etc. | |
35 ex: sunny, rainy, before counter-measure, after counter-measure''' | |
36 __tablename__ = 'environmental_factors' | |
37 idx = Column(Integer, primary_key=True) | |
38 startTime = Column(DateTime) | |
39 endTime = Column(DateTime) | |
40 description = Column(String) # eg sunny, before, after | |
41 siteIdx = Column(Integer, ForeignKey('sites.idx')) | |
42 | |
43 site = relationship("Site", backref=backref('environmental_factors', order_by = idx)) | |
44 | |
45 def __init__(self, startTime, endTime, description, site): | |
46 'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39' | |
47 self.startTime = datetime.strptime(startTime, datetimeFormat) | |
48 self.endTime = datetime.strptime(endTime, datetimeFormat) | |
49 self.description = description | |
50 self.site = site | |
51 | |
52 class CameraView(Base): | |
53 __tablename__ = 'camera_views' | |
54 idx = Column(Integer, primary_key=True) | |
55 frameRate = Column(Float) | |
56 homographyFilename = Column(String) # path to homograph filename, relative to the site name | |
57 cameraCalibrationFilename = Column(String) # path to full camera calibration, relative to the site name | |
58 siteIdx = Column(Integer, ForeignKey('sites.idx')) | |
59 homographyDistanceUnit = Column(String, default = 'm') # make sure it is default in the database | |
60 configurationFilename = Column(String) # path to configuration .cfg file, relative to site name | |
61 | |
62 site = relationship("Site", backref=backref('camera_views', order_by = idx)) | |
63 | |
64 def __init__(self, frameRate, homographyFilename, cameraCalibrationFilename, site, configurationFilename): | |
65 self.frameRate = frameRate | |
66 self.homographyFilename = homographyFilename | |
67 self.site = site | |
68 self.configurationFilename = configurationFilename | |
69 | |
70 def getHomographyFilename(self, relativeToSiteFilename = True): | |
71 if relativeToSiteFilename: | |
72 return self.site.getFilename()+path.sep+self.homographyFilename | |
73 else: | |
74 return self.homographyFilename | |
75 | |
76 class Alignment(Base): | |
77 __tablename__ = 'alignments' | |
78 idx = Column(Integer, primary_key=True) | |
79 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) | |
80 | |
81 cameraView = relationship("CameraView", backref=backref('alignments', order_by = idx)) | |
82 | |
83 def __init__(self, cameraView): | |
84 self.cameraView = cameraView | |
85 | |
86 class Point(Base): | |
87 __tablename__ = 'points' | |
88 alignmentIdx = Column(Integer, ForeignKey('alignments.idx'), primary_key=True) | |
89 index = Column(Integer, primary_key=True) # order of points in this alignment | |
90 x = Column(Float) | |
91 y = Column(Float) | |
92 | |
93 alignment = relationship("Alignment", backref=backref('points', order_by = index)) | |
94 | |
95 def __init__(self, alignmentIdx, index, x, y): | |
96 self.alignmentIdx = alignmentIdx | |
97 self.index = index | |
98 self.x = x | |
99 self.y = y | |
100 | |
101 class VideoSequence(Base): | |
102 __tablename__ = 'video_sequences' | |
103 idx = Column(Integer, primary_key=True) | |
104 name = Column(String) # path relative to the the site name | |
105 startTime = Column(DateTime) | |
106 duration = Column(Float) # video sequence duration | |
107 durationUnit = Column(String, default = 's') | |
108 siteIdx = Column(Integer, ForeignKey('sites.idx')) | |
109 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) | |
110 configurationFilename = Column(String) | |
111 | |
112 site = relationship("Site", backref=backref('video_sequences', order_by = idx)) | |
113 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx)) | |
114 | |
115 def __init__(self, name, startTime, duration, site, cameraView, configurationFilename = None): | |
116 'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39' | |
117 self.name = name | |
118 self.startTime = datetime.strptime(startTime, datetimeFormat) | |
119 self.duration = duration | |
120 self.site = site | |
121 self.cameraView = cameraView | |
122 self.configurationFilename = configurationFilename | |
123 | |
124 def getVideoSequenceFilename(self, relativeToSiteFilename = True): | |
125 if relativeToSiteFilename: | |
126 return self.site.getFilename()+path.sep+self.name | |
127 else: | |
128 return self.name | |
129 | |
130 #def getConfigurationFilename(self): | |
131 #'returns the local configuration filename, or the one of the camera view otherwise' | |
132 | |
133 # 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) | |
134 | |
135 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines | |
136 | |
137 # class Analysis(Base): # parameters necessary for processing the data: free form | |
138 # eg bounding box depends on camera view, tracking configuration depends on camera view | |
139 # results: sqlite | |
140 | |
141 def createDatabase(filename): | |
142 'creates a session to query the filename' | |
143 engine = create_engine('sqlite:///'+filename) | |
144 Base.metadata.create_all(engine) | |
145 Session = sessionmaker(bind=engine) | |
146 return Session() | |
147 | |
148 def connectDatabase(filename): | |
149 'creates a session to query the filename' | |
150 engine = create_engine('sqlite:///'+filename) | |
151 Session = sessionmaker(bind=engine) | |
152 return Session() | |
153 | |
154 def initializeSites(session, directoryName): | |
155 '''Initializes default site objects and Camera Views | |
156 | |
157 eg somedirectory/montreal/ contains intersection1, intersection2, etc. | |
158 The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.''' | |
159 from os import listdir, path | |
160 sites = [] | |
161 cameraViews = [] | |
162 names = listdir(directoryName) | |
163 for name in names: | |
164 if path.isdir(directoryName+'/'+name): | |
165 sites.append(Site(directoryName+'/'+name, None)) | |
166 cameraViews.append(CameraView(-1, None, None, sites[-1], None)) | |
167 session.add_all(sites) | |
168 session.add_all(cameraViews) | |
169 session.commit() | |
170 # TODO crawler for video files? |