diff python/metadata.py @ 971:9897a13772fb

added utils to load video sequence in metadata
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 13 Dec 2017 14:06:20 -0500
parents bf401567a933
children b50145235f9e
line wrap: on
line diff
--- a/python/metadata.py	Thu Dec 07 23:31:54 2017 -0500
+++ b/python/metadata.py	Wed Dec 13 14:06:20 2017 -0500
@@ -8,7 +8,7 @@
 from sqlalchemy.orm import relationship, backref, sessionmaker
 from sqlalchemy.ext.declarative import declarative_base
 
-from utils import datetimeFormat, removeExtension, getExtension
+from utils import datetimeFormat, removeExtension, getExtension, TimeConverter
 from cvutils import computeUndistortMaps, videoFilenameExtensions, infoVideo
 from moving import TimeInterval
 
@@ -70,15 +70,7 @@
         else:
             return self.mapImageFilename
 
-    @staticmethod
-    def getSite(session, siteId):
-        'Returns the site(s) matching the index or the name'
-        if str.isdigit(siteId):
-            return session.query(Site).filter(Site.idx == int(siteId)).all()
-        else:
-            return session.query(Site).filter(Site.description.like('%'+siteId+'%')).all()
 
-    
 class EnvironementalFactors(Base):
     '''Represents any environmental factors that may affect the results, in particular
     * changing weather conditions
@@ -358,34 +350,54 @@
     Session = sessionmaker(bind=engine)
     return Session()
 
-def initializeSites(session, directoryName):
-    '''Initializes default site objects and Camera Views
+def getSite(session, siteId):
+    'Returns the site(s) matching the index or the name'
+    if str.isdigit(siteId):
+        return session.query(Site).filter(Site.idx == int(siteId)).all()
+    else:
+        return session.query(Site).filter(Site.description.like('%'+siteId+'%')).all()
+
+def getCameraView(session, viewId):
+    'Returns the site(s) matching the index'
+    return session.query(CameraView).filter(CameraView.idx == int(viewId)).first()
+
+def initializeSites(session, directoryName, nViewsPerSite = 1):
+    '''Initializes default site objects and n camera views per site
     
     eg somedirectory/montreal/ contains intersection1, intersection2, etc.
-    The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.'''
+    The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.
+    The views should be directories in somedirectory/montreal/intersection1'''
     sites = []
     cameraViews = []
     names = listdir(directoryName)
-    cameraViewIdx = 1
     for name in names:
         if path.isdir(directoryName+sep+name):
             sites.append(Site(directoryName+sep+name, None))
-            cameraViews.append(CameraView('view{}'.format(cameraViewIdx), None, sites[-1], None, None, None))
-            cameraViewIdx += 1
+            for cameraViewIdx in range(1, nViewsPerSite+1):
+                cameraViews.append(CameraView('view{}'.format(cameraViewIdx), None, sites[-1], None, None, None))
     session.add_all(sites)
     session.add_all(cameraViews)
     session.commit()
-# TODO crawler for video files?
 
 def initializeVideos(session, cameraView, directoryName, startTime = None, datetimeFormat = None):
     '''Initializes videos with time or tries to guess it from filename
     directoryName should contain the videos to find and be the relative path from the site location'''
     names = listdir(directoryName)
     videoSequences = []
+    if datetimeFormat is not None:
+        timeConverter = TimeConverter(datetimeFormat)
     for name in names:
         prefix = removeExtension(name)
         extension = getExtension(name)
         if extension in videoFilenameExtensions:
+            if datetimeFormat is not None:
+                from argparse import ArgumentTypeError
+                try:
+                    prefix = name[:name.rfind('_')]
+                    t1 = timeConverter.convert(prefix)
+                    print('DB time {} / Time from filename {}'.format(startTime, t1))
+                except ArgumentTypeError as e:
+                    print('File format error for time {} (prefix {})'.format(name, prefix))
             vidinfo = infoVideo(directoryName+sep+name)
             duration = vidinfo['number of frames']#timedelta(minutes = 27, seconds = 33)
             fps = vidinfo['fps']