Mercurial > hg > nsaunier > traffic-intelligence
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 |
| 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 | 248 else: |
| 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 | 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 | 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? |
