annotate python/metadata.py @ 865:5afa1d30edd8

minor improvement to path description and path accessors
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 08 Dec 2016 11:07:14 -0500
parents 2d6249fe905a
children 8fba46899e74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
1 # from moving import Point
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
3 from datetime import datetime, timedelta
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
4 from os import path
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
5 from math import floor
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
6
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
7 from numpy import zeros, loadtxt, array
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
8
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
9 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval
426
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
10 from sqlalchemy.orm import relationship, backref, sessionmaker
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
11 from sqlalchemy.ext.declarative import declarative_base
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
12
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
13 from utils import datetimeFormat, removeExtension
838
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
14 from cvutils import computeUndistortMaps
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
15 from moving import TimeInterval
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
16
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
17 Base = declarative_base()
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
18
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
19 class Site(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
20 __tablename__ = 'sites'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
21 idx = Column(Integer, primary_key=True)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
22 name = Column(String) # path to directory containing all site information (in subdirectories), relative to the database position
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
23 description = Column(String) # longer names, eg intersection of road1 and road2
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
24 xcoordinate = Column(Float) # ideally moving.Point, but needs to be
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
25 ycoordinate = Column(Float)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
26 mapImageFilename = Column(String) # path to map image file, relative to site name, ie sitename/mapImageFilename
805
180b6b0231c0 added saving/loading points of interests
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 580
diff changeset
27 nUnitsPerPixel = Column(Float) # number of units of distance per pixel in map image
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
28 worldDistanceUnit = Column(String, default = 'm') # make sure it is default in the database
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
29
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
30 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None, mapImageFilename = None, nUnitsPerPixel = 1., worldDistanceUnit = 'm'):
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
31 self.name = name
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
32 self.description = description
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
33 self.xcoordinate = xcoordinate
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
34 self.ycoordinate = ycoordinate
805
180b6b0231c0 added saving/loading points of interests
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 580
diff changeset
35 self.mapImageFilename = mapImageFilename
180b6b0231c0 added saving/loading points of interests
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 580
diff changeset
36 self.nUnitsPerPixel = nUnitsPerPixel
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
37 self.worldDistanceUnit = worldDistanceUnit
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
38
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
39 def getPath(self):
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
40 return self.name
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
41
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
42 def getMapImageFilename(self, relativeToSiteFilename = True):
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
43 if relativeToSiteFilename:
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
44 return path.join(self.getPath(), self.mapImageFilename)
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
45 else:
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
46 return self.mapImageFilename
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
47
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
48 @staticmethod
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
49 def getSite(session, siteId):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
50 'Returns the site(s) matching the index or the name'
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
51 if str.isdigit(siteId):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
52 return session.query(Site).filter(Site.idx == int(siteId)).all()
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
53 else:
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
54 return session.query(Site).filter(Site.description.like('%'+siteId+'%')).all()
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
55
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
56
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
57 class EnvironementalFactors(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
58 '''Represents any environmental factors that may affect the results, in particular
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
59 * changing weather conditions
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
60 * changing road configuration, geometry, signalization, etc.
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
61 ex: sunny, rainy, before counter-measure, after counter-measure'''
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
62 __tablename__ = 'environmental_factors'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
63 idx = Column(Integer, primary_key=True)
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
64 startTime = Column(DateTime)
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
65 endTime = Column(DateTime)
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
66 description = Column(String) # eg sunny, before, after
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
67 siteIdx = Column(Integer, ForeignKey('sites.idx'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
68
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
69 site = relationship("Site", backref=backref('environmental_factors', order_by = idx))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
70
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
71 def __init__(self, startTime, endTime, description, site):
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
72 'startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39'
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
73 self.startTime = datetime.strptime(startTime, datetimeFormat)
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
74 self.endTime = datetime.strptime(endTime, datetimeFormat)
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
75 self.description = description
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
76 self.site = site
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
77
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
78 class CameraType(Base):
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
79 ''' Represents parameters of the specific camera used.
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
80
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
81 Taken and adapted from tvalib'''
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
82 __tablename__ = 'camera_types'
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
83 idx = Column(Integer, primary_key=True)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
84 name = Column(String)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
85 resX = Column(Integer)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
86 resY = Column(Integer)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
87 frameRate = Column(Float)
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
88 frameRateTimeUnit = Column(String, default = 's')
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
89 intrinsicCameraMatrixStr = Column(String)
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
90 distortionCoefficientsStr = Column(String)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
91 undistortedImageMultiplication = Column(Float)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
92
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
93 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None):
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
94 self.name = name
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
95 self.resX = resX
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
96 self.resY = resY
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
97 self.frameRate = frameRate
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
98 self.frameRateTimeUnit = frameRateTimeUnit
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
99 self.intrinsicCameraMatrix = None # should be np.array
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
100 self.distortionCoefficients = None # list
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
101
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
102 if trackingConfigurationFilename is not None:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
103 from storage import ProcessParameters
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
104 params = ProcessParameters(trackingConfigurationFilename)
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
105 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
106 self.distortionCoefficients = params.distortionCoefficients
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
107 self.undistortedImageMultiplication = params.undistortedImageMultiplication
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
108 elif intrinsicCameraFilename is not None:
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
109 self.intrinsicCameraMatrix = loadtxt(intrinsicCameraFilename)
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
110 self.distortionCoefficients = distortionCoefficients
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
111 self.undistortedImageMultiplication = undistortedImageMultiplication
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
112 else:
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
113 self.intrinsicCameraMatrix = intrinsicCameraMatrix
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
114 self.distortionCoefficients = distortionCoefficients
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
115 self.undistortedImageMultiplication = undistortedImageMultiplication
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
116
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
117 if self.intrinsicCameraMatrix is not None:
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
118 self.intrinsicCameraMatrixStr = '{}'.format(self.intrinsicCameraMatrix.tolist())
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
119 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5:
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
120 self.distortionCoefficientsStr = '{}'.format(self.distortionCoefficients)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
121
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
122 @orm.reconstructor
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
123 def initOnLoad(self):
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
124 if self.intrinsicCameraMatrixStr is not None:
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
125 from ast import literal_eval
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
126 self.intrinsicCameraMatrix = array(literal_eval(self.intrinsicCameraMatrixStr))
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
127 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
128 self.intrinsicCameraMatrix = None
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
129 if self.distortionCoefficientsStr is not None:
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
130 self.distortionCoefficients = literal_eval(self.distortionCoefficientsStr)
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
131 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
132 self.distortionCoefficients = None
838
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
133
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
134 def computeUndistortMaps(self):
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
135 if self.undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None:
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
136 self.map1, self.map2 = computeUndistortMaps(self.resX, self.resY, self.undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients)
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
137 else:
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
138 self.map1 = None
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
139 self.map2 = None
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
140
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
141 @staticmethod
862
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
142 def getCameraType(session, cameraTypeId, resX = None):
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
143 'Returns the site(s) matching the index or the name'
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
144 if str.isdigit(cameraTypeId):
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
145 return session.query(CameraType).filter(CameraType.idx == int(cameraTypeId)).all()
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
146 else:
862
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
147 if resX is not None:
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
148 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).filter(CameraType.resX == resX).all()
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
149 else:
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
150 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all()
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
151
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
152 class CameraView(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
153 __tablename__ = 'camera_views'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
154 idx = Column(Integer, primary_key=True)
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
155 description = Column(String)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
156 homographyFilename = Column(String) # path to homograph file, relative to the site name
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
157 siteIdx = Column(Integer, ForeignKey('sites.idx'))
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
158 cameraTypeIdx = Column(Integer, ForeignKey('camera_types.idx'))
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
159 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
160 maskFilename = Column(String) # path to mask file, relative to site name
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
161 virtual = Column(Boolean) # indicates it is not a real camera view, eg merged
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
162
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
163 site = relationship("Site", backref=backref('sites', order_by = idx))
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
164 cameraType = relationship('CameraType', backref=backref('camera_views', order_by = idx))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
165
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
166 def __init__(self, description, homographyFilename, site, cameraType, trackingConfigurationFilename, maskFilename, virtual = False):
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
167 self.description = description
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
168 self.homographyFilename = homographyFilename
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
169 self.site = site
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
170 self.cameraType = cameraType
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
171 self.trackingConfigurationFilename = trackingConfigurationFilename
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
172 self.maskFilename = maskFilename
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
173 self.virtual = virtual
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
174
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
175 def getHomographyFilename(self, relativeToSiteFilename = True):
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
176 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
177 return path.join(self.site.getPath(), self.homographyFilename)
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
178 else:
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
179 return self.homographyFilename
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
180
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
181 def getTrackingConfigurationFilename(self, relativeToSiteFilename = True):
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
182 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
183 return path.join(self.site.getPath(), self.trackingConfigurationFilename)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
184 else:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
185 return self.trackingConfigurationFilename
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
186
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
187 def getMaskFilename(self, relativeToSiteFilename = True):
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
188 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
189 return path.join(self.site.getPath(), self.maskFilename)
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
190 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
191 return self.maskFilename
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
192
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
193 def getTrackingParameters(self):
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
194 return ProcessParameters(self.getTrackingConfigurationFilename())
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
195
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
196 def getHomographyDistanceUnit(self):
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
197 return self.site.worldDistanceUnit
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
198
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
199 class Alignment(Base):
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
200 __tablename__ = 'alignments'
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
201 idx = Column(Integer, primary_key=True)
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
202 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
203
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
204 cameraView = relationship("CameraView", backref=backref('alignments', order_by = idx))
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
205
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
206 def __init__(self, cameraView):
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
207 self.cameraView = cameraView
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
208
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
209 class Point(Base):
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
210 __tablename__ = 'points'
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
211 alignmentIdx = Column(Integer, ForeignKey('alignments.idx'), primary_key=True)
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
212 index = Column(Integer, primary_key=True) # order of points in this alignment
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
213 x = Column(Float)
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
214 y = Column(Float)
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
215
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
216 alignment = relationship("Alignment", backref=backref('points', order_by = index))
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
217
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
218 def __init__(self, alignmentIdx, index, x, y):
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
219 self.alignmentIdx = alignmentIdx
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
220 self.index = index
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
221 self.x = x
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
222 self.y = y
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
223
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
224 class VideoSequence(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
225 __tablename__ = 'video_sequences'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
226 idx = Column(Integer, primary_key=True)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
227 name = Column(String) # path to the video file relative to the the site name
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
228 startTime = Column(DateTime)
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
229 duration = Column(Interval) # video sequence duration
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
230 databaseFilename = Column(String) # path to the database file relative to the the site name
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
231 virtual = Column(Boolean) # indicates it is not a real video sequence (no video file), eg merged
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
232 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
233
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
234 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
235
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
236 def __init__(self, name, startTime, duration, cameraView, databaseFilename = None, virtual = False):
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
237 '''startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
238 duration is a timedelta object'''
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
239 self.name = name
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
240 if isinstance(startTime, str):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
241 self.startTime = datetime.strptime(startTime, datetimeFormat)
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
242 else:
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
243 self.startTime = startTime
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
244 self.duration = duration
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
245 self.cameraView = cameraView
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
246 if databaseFilename is None and len(self.name) > 0:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
247 self.databaseFilename = removeExtension(self.name)+'.sqlite'
846
37d14818db89 minor bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 838
diff changeset
248 else:
37d14818db89 minor bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 838
diff changeset
249 self.databaseFilename = databaseFilename
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
250 self.virtual = virtual
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
251
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
252 def getVideoSequenceFilename(self, relativeToSiteFilename = True):
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
253 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
254 return path.join(self.cameraView.site.getPath(), self.name)
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
255 else:
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
256 return self.name
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
257
830
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
258 def getDatabaseFilename(self, relativeToSiteFilename = True):
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
259 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
260 return path.join(self.cameraView.site.getPath(), self.databaseFilename)
830
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
261 else:
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
262 return self.databaseFilename
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
263
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
264 def getTimeInterval(self):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
265 return TimeInterval(self.startTime, self.startTime+self.duration)
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
266
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
267 def containsInstant(self, instant):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
268 'instant is a datetime'
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
269 return self.startTime <= instant and self.startTime+self.duration
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
270
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
271 def intersection(self, startTime, endTime):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
272 'returns the moving.TimeInterval intersection with [startTime, endTime]'
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
273 return TimeInterval.intersection(self.getTimeInterval(), TimeInterval(startTime, endTime))
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
274
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
275 def getFrameNum(self, instant):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
276 'Warning, there is no check of correct time units'
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
277 if self.containsInstant(instant):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
278 return int(floor((instant-self.startTime).seconds*self.cameraView.cameraType.frameRate))
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
279 else:
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
280 return None
424
e74a09bddb6d new fields
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 422
diff changeset
281
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
282 class TrackingAnnotation(Base):
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
283 __tablename__ = 'tracking_annotations'
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
284 idx = Column(Integer, primary_key=True)
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
285 description = Column(String) # description
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
286
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
287 # 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)
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
288
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
289 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
290
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
291 # class Analysis(Base): # parameters necessary for processing the data: free form
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
292 # eg bounding box depends on camera view, tracking configuration depends on camera view
424
e74a09bddb6d new fields
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 422
diff changeset
293 # results: sqlite
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
294
426
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
295 def createDatabase(filename):
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
296 'creates a session to query the filename'
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
297 engine = create_engine('sqlite:///'+filename)
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
298 Base.metadata.create_all(engine)
426
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
299 Session = sessionmaker(bind=engine)
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
300 return Session()
425
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
301
426
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
302 def connectDatabase(filename):
425
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
303 'creates a session to query the filename'
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
304 engine = create_engine('sqlite:///'+filename)
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
305 Session = sessionmaker(bind=engine)
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
306 return Session()
426
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
307
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
308 def initializeSites(session, directoryName):
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
309 '''Initializes default site objects and Camera Views
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
310
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
311 eg somedirectory/montreal/ contains intersection1, intersection2, etc.
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
312 The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.'''
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
313 from os import listdir, path
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
314 sites = []
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
315 cameraViews = []
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
316 names = listdir(directoryName)
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
317 for name in names:
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
318 if path.isdir(directoryName+'/'+name):
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
319 sites.append(Site(directoryName+'/'+name, None))
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
320 cameraViews.append(CameraView(-1, None, None, sites[-1], None))
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
321 session.add_all(sites)
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
322 session.add_all(cameraViews)
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
323 session.commit()
334e1151828b corrected creation and connection to database + helper function to generate sites and camera views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 425
diff changeset
324 # TODO crawler for video files?