Mercurial Hosting > traffic-intelligence
annotate trafficintelligence/metadata.py @ 1156:f7fbe624fff7
added helper functions for categorical variables
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Fri, 25 Sep 2020 11:56:59 -0400 |
parents | 6a8fe3ed3bc6 |
children | c4c50678c856 |
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 | 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 | 270 else: |
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 | 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 | 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 | 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 | 353 engine = create_engine('sqlite:///'+filename) |
354 Base.metadata.create_all(engine) | |
355 Session = sessionmaker(bind=engine) | |
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 | 360 if Path(filename).is_file(): |
361 engine = create_engine('sqlite:///'+filename) | |
362 Session = sessionmaker(bind=engine) | |
363 return Session() | |
364 else: | |
365 print('The file '+filename+' does not exist') | |
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 | 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 | 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 | 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 |