Mercurial > hg > nsaunier > traffic-intelligence
comparison python/metadata.py @ 861:f9c9457b60c2
modification of storage of intrinsic camera and distortion parameters
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Fri, 04 Nov 2016 11:47:42 -0400 |
| parents | 37d14818db89 |
| children | 2d6249fe905a |
comparison
equal
deleted
inserted
replaced
| 860:07c5eab11eba | 861:f9c9457b60c2 |
|---|---|
| 2 | 2 |
| 3 from datetime import datetime, timedelta | 3 from datetime import datetime, timedelta |
| 4 from os import path | 4 from os import path |
| 5 from math import floor | 5 from math import floor |
| 6 | 6 |
| 7 from numpy import zeros | 7 from numpy import zeros, loadtxt, array |
| 8 | 8 |
| 9 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval | 9 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval |
| 10 from sqlalchemy.orm import relationship, backref, sessionmaker | 10 from sqlalchemy.orm import relationship, backref, sessionmaker |
| 11 from sqlalchemy.ext.declarative import declarative_base | 11 from sqlalchemy.ext.declarative import declarative_base |
| 12 | 12 |
| 78 name = Column(String) | 78 name = Column(String) |
| 79 resX = Column(Integer) | 79 resX = Column(Integer) |
| 80 resY = Column(Integer) | 80 resY = Column(Integer) |
| 81 frameRate = Column(Float) | 81 frameRate = Column(Float) |
| 82 frameRateTimeUnit = Column(String, default = 's') | 82 frameRateTimeUnit = Column(String, default = 's') |
| 83 intrinsicCameraMatrix00 = Column(Float) | 83 intrinsicCameraMatrixStr = Column(String) |
| 84 intrinsicCameraMatrix01 = Column(Float) | 84 distortionCoefficientsStr = Column(String) |
| 85 intrinsicCameraMatrix02 = Column(Float) | |
| 86 intrinsicCameraMatrix10 = Column(Float) | |
| 87 intrinsicCameraMatrix11 = Column(Float) | |
| 88 intrinsicCameraMatrix12 = Column(Float) | |
| 89 intrinsicCameraMatrix20 = Column(Float) | |
| 90 intrinsicCameraMatrix21 = Column(Float) | |
| 91 intrinsicCameraMatrix22 = Column(Float) | |
| 92 distortionCoefficients0 = Column(Float) | |
| 93 distortionCoefficients1 = Column(Float) | |
| 94 distortionCoefficients2 = Column(Float) | |
| 95 distortionCoefficients3 = Column(Float) | |
| 96 distortionCoefficients4 = Column(Float) | |
| 97 undistortedImageMultiplication = Column(Float) | 85 undistortedImageMultiplication = Column(Float) |
| 98 | 86 |
| 99 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None): | 87 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None): |
| 100 self.name = name | 88 self.name = name |
| 101 self.resX = resX | 89 self.resX = resX |
| 102 self.resY = resY | 90 self.resY = resY |
| 103 self.frameRate = frameRate | 91 self.frameRate = frameRate |
| 104 self.frameRateTimeUnit = frameRateTimeUnit | 92 self.frameRateTimeUnit = frameRateTimeUnit |
| 105 | 93 self.intrinsicCameraMatrix = None # should be np.array |
| 94 self.distortionCoefficients = None # list | |
| 95 | |
| 106 if trackingConfigurationFilename is not None: | 96 if trackingConfigurationFilename is not None: |
| 107 from storage import ProcessParameters | 97 from storage import ProcessParameters |
| 108 params = ProcessParameters(trackingConfigurationFilename) | 98 params = ProcessParameters(trackingConfigurationFilename) |
| 109 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix | 99 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix |
| 110 self.distortionCoefficients = params.distortionCoefficients | 100 self.distortionCoefficients = params.distortionCoefficients |
| 111 self.undistortedImageMultiplication = params.undistortedImageMultiplication | 101 self.undistortedImageMultiplication = params.undistortedImageMultiplication |
| 102 elif intrinsicCameraFilename is not None: | |
| 103 self.intrinsicCameraMatrix = loadtxt(intrinsicCameraFilename) | |
| 104 self.distortionCoefficients = distortionCoefficients | |
| 105 self.undistortedImageMultiplication = undistortedImageMultiplication | |
| 112 else: | 106 else: |
| 113 self.intrinsicCameraMatrix = intrinsicCameraMatrix | 107 self.intrinsicCameraMatrix = intrinsicCameraMatrix |
| 114 self.distortionCoefficients = distortionCoefficients | 108 self.distortionCoefficients = distortionCoefficients |
| 115 self.undistortedImageMultiplication = undistortedImageMultiplication | 109 self.undistortedImageMultiplication = undistortedImageMultiplication |
| 116 | 110 |
| 117 if self.intrinsicCameraMatrix is not None and self.intrinsicCameraMatrix.size == 9: | 111 if self.intrinsicCameraMatrix is not None: |
| 118 self.intrinsicCameraMatrix00 = self.intrinsicCameraMatrix[0,0] | 112 self.intrinsicCameraMatrixStr = '{}'.format(self.intrinsicCameraMatrix.tolist()) |
| 119 self.intrinsicCameraMatrix01 = self.intrinsicCameraMatrix[0,1] | |
| 120 self.intrinsicCameraMatrix02 = self.intrinsicCameraMatrix[0,2] | |
| 121 self.intrinsicCameraMatrix10 = self.intrinsicCameraMatrix[1,0] | |
| 122 self.intrinsicCameraMatrix11 = self.intrinsicCameraMatrix[1,1] | |
| 123 self.intrinsicCameraMatrix12 = self.intrinsicCameraMatrix[1,2] | |
| 124 self.intrinsicCameraMatrix20 = self.intrinsicCameraMatrix[2,0] | |
| 125 self.intrinsicCameraMatrix21 = self.intrinsicCameraMatrix[2,1] | |
| 126 self.intrinsicCameraMatrix22 = self.intrinsicCameraMatrix[2,2] | |
| 127 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5: | 113 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5: |
| 128 self.distortionCoefficients0 = self.distortionCoefficients[0] | 114 self.distortionCoefficientsStr = '{}'.format(self.distortionCoefficients) |
| 129 self.distortionCoefficients1 = self.distortionCoefficients[1] | |
| 130 self.distortionCoefficients2 = self.distortionCoefficients[2] | |
| 131 self.distortionCoefficients3 = self.distortionCoefficients[3] | |
| 132 self.distortionCoefficients4 = self.distortionCoefficients[4] | |
| 133 | 115 |
| 134 @orm.reconstructor | 116 @orm.reconstructor |
| 135 def initOnLoad(self): | 117 def initOnLoad(self): |
| 136 if self.intrinsicCameraMatrix00 is not None: | 118 if self.intrinsicCameraMatrixStr is not None: |
| 137 self.intrinsicCameraMatrix = zeros((3,3)) | 119 from ast import literal_eval |
| 138 self.intrinsicCameraMatrix[0,0] = self.intrinsicCameraMatrix00 | 120 self.intrinsicCameraMatrix = array(literal_eval(self.intrinsicCameraMatrixStr)) |
| 139 self.intrinsicCameraMatrix[0,1] = self.intrinsicCameraMatrix01 | |
| 140 self.intrinsicCameraMatrix[0,2] = self.intrinsicCameraMatrix02 | |
| 141 self.intrinsicCameraMatrix[1,0] = self.intrinsicCameraMatrix10 | |
| 142 self.intrinsicCameraMatrix[1,1] = self.intrinsicCameraMatrix11 | |
| 143 self.intrinsicCameraMatrix[1,2] = self.intrinsicCameraMatrix12 | |
| 144 self.intrinsicCameraMatrix[2,0] = self.intrinsicCameraMatrix20 | |
| 145 self.intrinsicCameraMatrix[2,1] = self.intrinsicCameraMatrix21 | |
| 146 self.intrinsicCameraMatrix[2,2] = self.intrinsicCameraMatrix22 | |
| 147 else: | 121 else: |
| 148 self.intrinsicCameraMatrix = None | 122 self.intrinsicCameraMatrix = None |
| 149 if self.distortionCoefficients0 is not None: | 123 if self.distortionCoefficientsStr is not None: |
| 150 self.distortionCoefficients = [0]*5 | 124 self.distortionCoefficients = literal_eval(self.distortionCoefficientsStr) |
| 151 self.distortionCoefficients[0] = self.distortionCoefficients0 | |
| 152 self.distortionCoefficients[1] = self.distortionCoefficients1 | |
| 153 self.distortionCoefficients[2] = self.distortionCoefficients2 | |
| 154 self.distortionCoefficients[3] = self.distortionCoefficients3 | |
| 155 self.distortionCoefficients[4] = self.distortionCoefficients4 | |
| 156 else: | 125 else: |
| 157 self.distortionCoefficients = None | 126 self.distortionCoefficients = None |
| 158 | 127 |
| 159 def computeUndistortMaps(self): | 128 def computeUndistortMaps(self): |
| 160 if self.undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None: | 129 if self.undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None: |
| 161 self.map1, self.map2 = computeUndistortMaps(self.resX, self.resY, self.undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients) | 130 self.map1, self.map2 = computeUndistortMaps(self.resX, self.resY, self.undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients) |
| 162 else: | 131 else: |
| 163 self.map1 = None | 132 self.map1 = None |
| 164 self.map2 = None | 133 self.map2 = None |
| 165 | 134 |
| 135 @staticmethod | |
| 136 def getCameraType(session, cameraTypeId): | |
| 137 'Returns the site(s) matching the index or the name' | |
| 138 if str.isdigit(cameraTypeId): | |
| 139 return session.query(CameraType).filter(CameraType.idx == int(cameraTypeId)).all() | |
| 140 else: | |
| 141 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all() | |
| 142 | |
| 166 class CameraView(Base): | 143 class CameraView(Base): |
| 167 __tablename__ = 'camera_views' | 144 __tablename__ = 'camera_views' |
| 168 idx = Column(Integer, primary_key=True) | 145 idx = Column(Integer, primary_key=True) |
| 169 description = Column(String) | 146 description = Column(String) |
| 170 homographyFilename = Column(String) # path to homograph filename, relative to the site name | 147 homographyFilename = Column(String) # path to homograph filename, relative to the site name |
