annotate trafficintelligence/metadata.py @ 1144:6a8fe3ed3bc6

bug correction
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 28 Apr 2020 01:01:14 -0400
parents b3ee75b4978a
children c4c50678c856
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
1 from datetime import datetime, timedelta
1073
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
2 from pathlib import Path
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
3 from os import path, listdir, sep
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
4 from math import floor
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
5
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
6 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
7
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
8 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
9 from sqlalchemy.orm import relationship, backref, sessionmaker
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
10 from sqlalchemy.ext.declarative import declarative_base
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
11
1028
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1004
diff changeset
12 from trafficintelligence.utils import datetimeFormat, removeExtension, getExtension, TimeConverter
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1004
diff changeset
13 from trafficintelligence.cvutils import computeUndistortMaps, videoFilenameExtensions, infoVideo
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
14 from trafficintelligence.moving import TimeInterval, Trajectory
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
15
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
16 """
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
17 Metadata to describe how video data and configuration files for video analysis are stored
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
18
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
19 Typical example is
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
20
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
21 site1/view1/2012-06-01/video.avi
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
22 /2012-06-02/video.avi
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
23 ...
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
24 /view2/2012-06-01/video.avi
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
25 /2012-06-02/video.avi
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
26 ...
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
27
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
28 - where site1 is the path to the directory containing all information pertaining to the site,
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
29 relative to directory of the SQLite file storing the metadata
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
30 represented by Site class
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
31 (can contain for example the aerial or map image of the site, used for projection)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
32
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
33 - view1 is the directory for the first camera field of view (camera fixed position) at site site1
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
34 represented by CameraView class
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
35 (can contain for example the homography file, mask file and tracking configuration file)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
36
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
37 - YYYY-MM-DD is the directory containing all the video files for that day
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
38 with camera view view1 at site site1
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
39
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
40
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
41 """
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
42
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
43 Base = declarative_base()
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
44
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
45 class Site(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
46 __tablename__ = 'sites'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
47 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
48 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
49 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
50 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
51 ycoordinate = Column(Float)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
52 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
53 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
54 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
55
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
56 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
57 self.name = name
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
58 self.description = description
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
59 self.xcoordinate = xcoordinate
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
60 self.ycoordinate = ycoordinate
805
180b6b0231c0 added saving/loading points of interests
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 580
diff changeset
61 self.mapImageFilename = mapImageFilename
180b6b0231c0 added saving/loading points of interests
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 580
diff changeset
62 self.nUnitsPerPixel = nUnitsPerPixel
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
63 self.worldDistanceUnit = worldDistanceUnit
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
64
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
65 def getPath(self):
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
66 return self.name
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
67
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
68 def getMapImageFilename(self, relativeToSiteFilename = True):
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
69 if relativeToSiteFilename:
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
70 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
71 else:
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
72 return self.mapImageFilename
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
73
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
74
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
75 class EnvironementalFactors(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
76 '''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
77 * changing weather conditions
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
78 * changing road configuration, geometry, signalization, etc.
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
79 ex: sunny, rainy, before counter-measure, after counter-measure'''
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
80 __tablename__ = 'environmental_factors'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
81 idx = Column(Integer, primary_key=True)
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
82 startTime = Column(DateTime)
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
83 endTime = Column(DateTime)
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
84 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
85 siteIdx = Column(Integer, ForeignKey('sites.idx'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
86
955
a15e843af55a correcting errors in metadata names for backrefs
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 872
diff changeset
87 site = relationship("Site", backref = backref('environmentalFactors'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
88
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
89 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
90 '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
91 self.startTime = datetime.strptime(startTime, datetimeFormat)
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
92 self.endTime = datetime.strptime(endTime, datetimeFormat)
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
93 self.description = description
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
94 self.site = site
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
95
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
96 class CameraType(Base):
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
97 ''' Represents parameters of the specific camera used.
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
98
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
99 Taken and adapted from tvalib'''
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
100 __tablename__ = 'camera_types'
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
101 idx = Column(Integer, primary_key=True)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
102 name = Column(String)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
103 resX = Column(Integer)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
104 resY = Column(Integer)
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
105 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
106 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
107 intrinsicCameraMatrixStr = Column(String)
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
108 distortionCoefficientsStr = Column(String)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
109
957
5d9899504977 removed unnecessary field undistortedImageMultiplication
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 955
diff changeset
110 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None):
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
111 self.name = name
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
112 self.resX = resX
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
113 self.resY = resY
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
114 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
115 self.frameRateTimeUnit = frameRateTimeUnit
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
116 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
117 self.distortionCoefficients = None # list
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
118
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
119 if trackingConfigurationFilename is not None:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
120 from storage import ProcessParameters
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
121 params = ProcessParameters(trackingConfigurationFilename)
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
122 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
123 self.distortionCoefficients = params.distortionCoefficients
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
124 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
125 self.intrinsicCameraMatrix = loadtxt(intrinsicCameraFilename)
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
126 self.distortionCoefficients = distortionCoefficients
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
127 else:
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
128 self.intrinsicCameraMatrix = intrinsicCameraMatrix
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
129 self.distortionCoefficients = distortionCoefficients
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
130
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
131 if self.intrinsicCameraMatrix is not None:
872
c70adaeeddf5 solved issue with latest version of scikit-learn
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 867
diff changeset
132 self.intrinsicCameraMatrixStr = str(self.intrinsicCameraMatrix.tolist())
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
133 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5:
872
c70adaeeddf5 solved issue with latest version of scikit-learn
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 867
diff changeset
134 self.distortionCoefficientsStr = str(self.distortionCoefficients)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
135
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
136 @orm.reconstructor
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
137 def initOnLoad(self):
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
138 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
139 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
140 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
141 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
142 self.intrinsicCameraMatrix = None
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
143 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
144 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
145 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
146 self.distortionCoefficients = None
838
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
147
957
5d9899504977 removed unnecessary field undistortedImageMultiplication
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 955
diff changeset
148 def computeUndistortMaps(self, undistortedImageMultiplication = None):
5d9899504977 removed unnecessary field undistortedImageMultiplication
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 955
diff changeset
149 if undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None:
5d9899504977 removed unnecessary field undistortedImageMultiplication
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 955
diff changeset
150 [self.map1, self.map2], newCameraMatrix = computeUndistortMaps(self.resX, self.resY, undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients)
838
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
151 else:
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
152 self.map1 = None
2918de3d40fc first working version of display of merged tracking
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 836
diff changeset
153 self.map2 = None
861
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
154
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
155 @staticmethod
862
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
156 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
157 '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
158 if str.isdigit(cameraTypeId):
f9c9457b60c2 modification of storage of intrinsic camera and distortion parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 846
diff changeset
159 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
160 else:
862
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
161 if resX is not None:
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
162 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
163 else:
2d6249fe905a correcting bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 861
diff changeset
164 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
165
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
166 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
167
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
168 class CameraView(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
169 __tablename__ = 'camera_views'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
170 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
171 description = Column(String)
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
172 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
173 siteIdx = Column(Integer, ForeignKey('sites.idx'))
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
174 cameraTypeIdx = Column(Integer, ForeignKey('camera_types.idx'))
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
175 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
176 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
177 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
178
955
a15e843af55a correcting errors in metadata names for backrefs
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 872
diff changeset
179 site = relationship("Site", backref = backref('cameraViews'))
a15e843af55a correcting errors in metadata names for backrefs
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 872
diff changeset
180 cameraType = relationship('CameraType', backref = backref('cameraViews'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
181
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
182 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
183 self.description = description
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
184 self.homographyFilename = homographyFilename
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
185 self.site = site
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
186 self.cameraType = cameraType
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
187 self.trackingConfigurationFilename = trackingConfigurationFilename
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
188 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
189 self.virtual = virtual
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
190
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
191 def getHomographyFilename(self, relativeToSiteFilename = True):
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
192 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
193 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
194 else:
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
195 return self.homographyFilename
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
196
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
197 def getTrackingConfigurationFilename(self, relativeToSiteFilename = True):
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
198 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
199 return path.join(self.site.getPath(), self.trackingConfigurationFilename)
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
200 else:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
201 return self.trackingConfigurationFilename
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
202
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
203 def getMaskFilename(self, relativeToSiteFilename = True):
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
204 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
205 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
206 else:
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
207 return self.maskFilename
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
208
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
209 def getTrackingParameters(self):
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
210 return ProcessParameters(self.getTrackingConfigurationFilename())
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
211
825
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
212 def getHomographyDistanceUnit(self):
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
213 return self.site.worldDistanceUnit
6e4357e9116d corrected and changed matrix to individual columns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
214
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
215 class Alignment(Base):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
216 __tablename__ = 'alignments'
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
217 idx = Column(Integer, primary_key=True)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
218 siteIdx = Column(Integer, ForeignKey('sites.idx'))
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
219
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
220 site = relationship("Site", backref = backref('alignments'))
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
221
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
222 def __init__(self, site):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
223 self.site = site
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
224
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
225 def getTrajectory(self):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
226 t = Trajectory()
1144
6a8fe3ed3bc6 bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1142
diff changeset
227 for p in self.points:
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
228 t.addPositionXY(p.x_coordinate, p.y_coordinate)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
229 return t
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
230
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
231 class Point(Base):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
232 __tablename__ = 'positions'
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
233 trajectory_id = Column(Integer, ForeignKey('alignments.idx'), primary_key=True)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
234 frame_number = Column(Integer, primary_key=True) # order of points in this alignment, as index
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
235 x_coordinate = Column(Float)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
236 y_coordinate = Column(Float)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
237
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
238 alignment = relationship("Alignment", backref = backref('points', order_by = trajectory_id))
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
239
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
240 def __init__(self, alignment, index, x, y):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
241 self.alignment = alignment
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
242 self.frame_number = index
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
243 self.x_coordinate = x
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
244 self.y_coordinate = y
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
245
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
246 class VideoSequence(Base):
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
247 __tablename__ = 'video_sequences'
580
1262faae12e7 alignments may be stored in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
248 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
249 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
250 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
251 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
252 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
253 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
254 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx'))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
255
955
a15e843af55a correcting errors in metadata names for backrefs
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 872
diff changeset
256 cameraView = relationship("CameraView", backref = backref('videoSequences', order_by = idx))
420
def795d1120f first work on video metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
257
836
7058a40a4bbc updated metadata and code to merge features from different cameras
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 830
diff changeset
258 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
259 '''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
260 duration is a timedelta object'''
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
261 self.name = name
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
262 if isinstance(startTime, str):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
263 self.startTime = datetime.strptime(startTime, datetimeFormat)
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
264 else:
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
265 self.startTime = startTime
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
266 self.duration = duration
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
267 self.cameraView = cameraView
819
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
268 if databaseFilename is None and len(self.name) > 0:
fc8b3ce629d1 important modifications to metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 805
diff changeset
269 self.databaseFilename = removeExtension(self.name)+'.sqlite'
846
37d14818db89 minor bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 838
diff changeset
270 else:
37d14818db89 minor bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 838
diff changeset
271 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
272 self.virtual = virtual
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
273
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
274 def getVideoSequenceFilename(self, relativeToSiteFilename = True):
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
275 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
276 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
277 else:
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
278 return self.name
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
279
830
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
280 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
281 if relativeToSiteFilename:
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
282 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
283 else:
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
284 return self.databaseFilename
2a5856961933 first working version of feature merging (works with feature grouping)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 828
diff changeset
285
828
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
286 def getTimeInterval(self):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
287 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
288
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
289 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
290 '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
291 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
292
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
293 def intersection(self, startTime, endTime):
14e4ad7c7420 work on merging data for synchronized views
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 825
diff changeset
294 '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
295 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
296
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 819
diff changeset
297 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
298 '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
299 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
300 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
301 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
302 return None
424
e74a09bddb6d new fields
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 422
diff changeset
303
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
304 class TrackingAnnotation(Base):
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
305 __tablename__ = 'tracking_annotations'
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
306 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
307 description = Column(String) # description
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
308 groundTruthFilename = Column(String)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
309 firstFrameNum = Column(Integer) # first frame num of annotated data (could be computed on less data)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
310 lastFrameNum = Column(Integer)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
311 videoSequenceIdx = Column(Integer, ForeignKey('video_sequences.idx'))
867
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
312 maskFilename = Column(String) # path to mask file (can be different from camera view, for annotations), relative to site name
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
313 undistorted = Column(Boolean) # indicates whether the annotations were done in undistorted video space
865
5afa1d30edd8 minor improvement to path description and path accessors
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 862
diff changeset
314
955
a15e843af55a correcting errors in metadata names for backrefs
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 872
diff changeset
315 videoSequence = relationship("VideoSequence", backref = backref('trackingAnnotations'))
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
316
867
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
317 def __init__(self, description, groundTruthFilename, firstFrameNum, lastFrameNum, videoSequence, maskFilename, undistorted = True):
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
318 self.description = description
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
319 self.groundTruthFilename = groundTruthFilename
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
320 self.firstFrameNum = firstFrameNum
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
321 self.lastFrameNum = lastFrameNum
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
322 self.videoSequence = videoSequence
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
323 self.undistorted = undistorted
867
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
324 self.maskFilename = maskFilename
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
325
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
326 def getGroundTruthFilename(self, relativeToSiteFilename = True):
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
327 if relativeToSiteFilename:
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
328 return path.join(self.videoSequence.cameraView.site.getPath(), self.groundTruthFilename)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
329 else:
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
330 return self.groundTruthFilename
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
331
867
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
332 def getMaskFilename(self, relativeToSiteFilename = True):
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
333 if relativeToSiteFilename:
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
334 return path.join(self.videoSequence.cameraView.site.getPath(), self.maskFilename)
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
335 else:
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
336 return self.maskFilename
003445db1e30 forgot annotation mask filename
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 866
diff changeset
337
866
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
338 def getTimeInterval(self):
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
339 return TimeInterval(self.firstFrameNum, self.lastFrameNum)
8fba46899e74 addition of class to represent tracking annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 865
diff changeset
340
422
67c7ff5d6b26 added new fields for units, getting filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 421
diff changeset
341 # 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
342
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
343 # 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
344 # 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
345 # results: sqlite
421
4fce27946c60 first example of video metadata using sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 420
diff changeset
346
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
347 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
348 'creates a session to query the filename'
1073
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
349 if Path(filename).is_file():
1087
9cc51a2d3c46 bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1086
diff changeset
350 print('The file '+filename+' exists')
9cc51a2d3c46 bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1086
diff changeset
351 return None
9cc51a2d3c46 bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1086
diff changeset
352 else:
1073
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
353 engine = create_engine('sqlite:///'+filename)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
354 Base.metadata.create_all(engine)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
355 Session = sessionmaker(bind=engine)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
356 return Session()
425
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
357
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
358 def connectDatabase(filename):
425
a31dde19caa8 connect function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 424
diff changeset
359 'creates a session to query the filename'
1073
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
360 if Path(filename).is_file():
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
361 engine = create_engine('sqlite:///'+filename)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
362 Session = sessionmaker(bind=engine)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
363 return Session()
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
364 else:
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
365 print('The file '+filename+' does not exist')
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1050
diff changeset
366 return None
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
367
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
368 def getSite(session, siteId = None, name = None, description = None):
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
369 'Returns the site(s) matching the index or the name'
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
370 if siteId is not None:
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
371 return session.query(Site).filter(Site.idx == int(siteId)).all()
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
372 elif name is not None:
1142
b3ee75b4978a getSite minor mistake for name
Etienne Beauchamp <etienne-2.beauchamp@polymtl.ca>
parents: 1140
diff changeset
373 return session.query(Site).filter(Site.name.like('%'+name+'%')).all()
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
374 elif description is not None:
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
375 return session.query(Site).filter(Site.description.like('%'+description+'%')).all()
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
376 else:
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
377 print('No siteId, name or description have been provided to the function')
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
378 return []
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
379
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
380 def getCameraView(session, viewId):
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
381 'Returns the site(s) matching the index'
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
382 return session.query(CameraView).filter(CameraView.idx == int(viewId)).first()
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
383
1050
9d4a06f49cb8 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
384 def getSiteVideoSequences(site):
9d4a06f49cb8 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
385 return [vs for cv in site.cameraViews for vs in cv.videoSequences]
9d4a06f49cb8 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
386
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
387 def initializeSites(session, directoryName, nViewsPerSite = 1):
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
388 '''Initializes default site objects and n camera views per site
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
389
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
390 eg somedirectory/montreal/ contains intersection1, intersection2, etc.
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
391 The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
392 The views should be directories in somedirectory/montreal/intersection1'''
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
393 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
394 cameraViews = []
972
b50145235f9e bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 971
diff changeset
395 names = sorted(listdir(directoryName))
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
396 for name in names:
968
32a34a143c27 work on sumo and metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 957
diff changeset
397 if path.isdir(directoryName+sep+name):
32a34a143c27 work on sumo and metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 957
diff changeset
398 sites.append(Site(directoryName+sep+name, None))
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
399 for cameraViewIdx in range(1, nViewsPerSite+1):
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
400 cameraViews.append(CameraView('view{}'.format(cameraViewIdx), None, sites[-1], None, None, None))
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
401 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
402 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
403 session.commit()
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
404
970
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
405 def initializeVideos(session, cameraView, directoryName, startTime = None, datetimeFormat = None):
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
406 '''Initializes videos with time or tries to guess it from filename
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
407 directoryName should contain the videos to find and be the relative path from the site location'''
972
b50145235f9e bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 971
diff changeset
408 names = sorted(listdir(directoryName))
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
409 videoSequences = []
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
410 if datetimeFormat is not None:
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
411 timeConverter = TimeConverter(datetimeFormat)
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
412 for name in names:
970
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
413 prefix = removeExtension(name)
969
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
414 extension = getExtension(name)
5d788d2e8ffc work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 968
diff changeset
415 if extension in videoFilenameExtensions:
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
416 if datetimeFormat is not None:
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
417 from argparse import ArgumentTypeError
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
418 try:
972
b50145235f9e bug corrected
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 971
diff changeset
419 t1 = timeConverter.convert(name[:name.rfind('_')])
971
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
420 print('DB time {} / Time from filename {}'.format(startTime, t1))
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
421 except ArgumentTypeError as e:
9897a13772fb added utils to load video sequence in metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 970
diff changeset
422 print('File format error for time {} (prefix {})'.format(name, prefix))
970
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
423 vidinfo = infoVideo(directoryName+sep+name)
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
424 duration = vidinfo['number of frames']#timedelta(minutes = 27, seconds = 33)
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
425 fps = vidinfo['fps']
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
426 duration = timedelta(seconds=duration/fps)
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
427 videoSequences.append(VideoSequence(directoryName+sep+name, startTime, duration, cameraView, directoryName+sep+prefix+'.sqlite'))
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
428 startTime += duration
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
429 session.add_all(videoSequences)
bf401567a933 work on initializing videos for metadata
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 969
diff changeset
430 session.commit()
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
431
1086
8734742c08c0 major refactoring of curvilinear trajectory projections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1073
diff changeset
432 def generateTimeIntervals(videoSequences, maxTimeGap):
8734742c08c0 major refactoring of curvilinear trajectory projections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1073
diff changeset
433 ''
1140
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
434
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
435 def addAlignment(session, site, t):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
436 'Adds trajectory (moving.Trajectory) t to metadata of site'
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
437 al = Alignment(site)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
438 session.add(al)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
439 session.commit()
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
440 points = []
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
441 for i,p in enumerate(t):
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
442 points.append(Point(al, i, p.x, p.y))
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
443 session.add_all(points)
78dddfe7aa0f added alignments for sites
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1087
diff changeset
444 session.commit()
1086
8734742c08c0 major refactoring of curvilinear trajectory projections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1073
diff changeset
445
1004
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
446 # management
75601be6019f work on process
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 972
diff changeset
447 # TODO need to be able to copy everything from a site from one sqlite to another, and delete everything attached to a site