diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/metadata.py	Fri Dec 05 12:13:53 2014 -0500
@@ -0,0 +1,170 @@
+# from moving import Point
+
+from datetime import datetime
+from os import path
+
+from sqlalchemy import create_engine, Column, Integer, Float, DateTime, String, ForeignKey
+from sqlalchemy.orm import relationship, backref, sessionmaker
+from sqlalchemy.ext.declarative import declarative_base
+
+from utils import datetimeFormat
+
+Base = declarative_base()
+
+class Site(Base):
+    __tablename__ = 'sites'
+    idx = Column(Integer, primary_key=True)
+    name = Column(String) # same as path, relative to the database position
+    description = Column(String) # longer names, eg intersection of road1 and road2
+    xcoordinate = Column(Float)  # ideally moving.Point, but needs to be 
+    ycoordinate = Column(Float)
+    
+    def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None):
+        self.name = name
+        self.description = description
+        self.xcoordinate = xcoordinate
+        self.ycoordinate = ycoordinate
+
+    def getFilename(self):
+        return self.name
+
+class EnvironementalFactors(Base):
+    '''Represents any environmental factors that may affect the results, in particular
+    * changing weather conditions
+    * changing road configuration, geometry, signalization, etc.
+    ex: sunny, rainy, before counter-measure, after counter-measure'''
+    __tablename__ = 'environmental_factors'
+    idx = Column(Integer, primary_key=True)
+    startTime = Column(DateTime)
+    endTime = Column(DateTime)
+    description = Column(String) # eg sunny, before, after
+    siteIdx = Column(Integer, ForeignKey('sites.idx'))
+
+    site = relationship("Site", backref=backref('environmental_factors', order_by = idx))
+
+    def __init__(self, startTime, endTime, description, site):
+        'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39'
+        self.startTime = datetime.strptime(startTime, datetimeFormat)
+        self.endTime = datetime.strptime(endTime, datetimeFormat)
+        self.description = description
+        self.site = site
+
+class CameraView(Base):
+    __tablename__ = 'camera_views'
+    idx = Column(Integer, primary_key=True)
+    frameRate = Column(Float)
+    homographyFilename = Column(String) # path to homograph filename, relative to the site name
+    cameraCalibrationFilename = Column(String) # path to full camera calibration, relative to the site name
+    siteIdx = Column(Integer, ForeignKey('sites.idx'))
+    homographyDistanceUnit = Column(String, default = 'm') # make sure it is default in the database
+    configurationFilename = Column(String) # path to configuration .cfg file, relative to site name
+
+    site = relationship("Site", backref=backref('camera_views', order_by = idx))
+
+    def __init__(self, frameRate, homographyFilename, cameraCalibrationFilename, site, configurationFilename):
+        self.frameRate = frameRate
+        self.homographyFilename = homographyFilename
+        self.site = site
+        self.configurationFilename = configurationFilename
+
+    def getHomographyFilename(self, relativeToSiteFilename = True):
+        if relativeToSiteFilename:
+            return self.site.getFilename()+path.sep+self.homographyFilename
+        else:
+            return self.homographyFilename
+
+class Alignment(Base):
+    __tablename__ = 'alignments'
+    idx = Column(Integer, primary_key=True)
+    cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
+    
+    cameraView = relationship("CameraView", backref=backref('alignments', order_by = idx))
+
+    def __init__(self, cameraView):
+        self.cameraView = cameraView
+
+class Point(Base):
+    __tablename__ = 'points'
+    alignmentIdx = Column(Integer, ForeignKey('alignments.idx'), primary_key=True)
+    index = Column(Integer, primary_key=True) # order of points in this alignment
+    x = Column(Float)
+    y = Column(Float)
+
+    alignment = relationship("Alignment", backref=backref('points', order_by = index))
+    
+    def __init__(self, alignmentIdx, index, x, y):
+        self.alignmentIdx = alignmentIdx
+        self.index = index
+        self.x = x
+        self.y = y
+
+class VideoSequence(Base):
+    __tablename__ = 'video_sequences'
+    idx = Column(Integer, primary_key=True)
+    name = Column(String) # path relative to the the site name
+    startTime = Column(DateTime)
+    duration = Column(Float) # video sequence duration
+    durationUnit = Column(String, default = 's')
+    siteIdx = Column(Integer, ForeignKey('sites.idx'))
+    cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
+    configurationFilename = Column(String)
+
+    site = relationship("Site", backref=backref('video_sequences', order_by = idx))
+    cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx))
+
+    def __init__(self, name, startTime, duration, site, cameraView, configurationFilename = None):
+        'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39'
+        self.name = name
+        self.startTime = datetime.strptime(startTime, datetimeFormat)
+        self.duration = duration
+        self.site = site
+        self.cameraView = cameraView
+        self.configurationFilename = configurationFilename
+
+    def getVideoSequenceFilename(self, relativeToSiteFilename = True):
+        if relativeToSiteFilename:
+            return self.site.getFilename()+path.sep+self.name
+        else:
+            return self.name
+
+        #def getConfigurationFilename(self):
+        #'returns the local configuration filename, or the one of the camera view otherwise'
+
+# 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)
+
+# class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines
+
+# class Analysis(Base): # parameters necessary for processing the data: free form
+# eg bounding box depends on camera view, tracking configuration depends on camera view 
+# results: sqlite
+
+def createDatabase(filename):
+    'creates a session to query the filename'
+    engine = create_engine('sqlite:///'+filename)
+    Base.metadata.create_all(engine)
+    Session = sessionmaker(bind=engine)
+    return Session()
+
+def connectDatabase(filename):
+    'creates a session to query the filename'
+    engine = create_engine('sqlite:///'+filename)
+    Session = sessionmaker(bind=engine)
+    return Session()
+
+def initializeSites(session, directoryName):
+    '''Initializes default site objects and Camera Views
+    
+    eg somedirectory/montreal/ contains intersection1, intersection2, etc.
+    The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.'''
+    from os import listdir, path
+    sites = []
+    cameraViews = []
+    names = listdir(directoryName)
+    for name in names:
+        if path.isdir(directoryName+'/'+name):
+            sites.append(Site(directoryName+'/'+name, None))
+            cameraViews.append(CameraView(-1, None, None, sites[-1], None))
+    session.add_all(sites)
+    session.add_all(cameraViews)
+    session.commit()
+# TODO crawler for video files?