changeset 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 07c5eab11eba
children 2d6249fe905a
files python/metadata.py python/storage.py
diffstat 2 files changed, 34 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- a/python/metadata.py	Sat Oct 29 16:34:05 2016 -0400
+++ b/python/metadata.py	Fri Nov 04 11:47:42 2016 -0400
@@ -4,7 +4,7 @@
 from os import path
 from math import floor
 
-from numpy import zeros
+from numpy import zeros, loadtxt, array
 
 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval
 from sqlalchemy.orm import relationship, backref, sessionmaker
@@ -80,79 +80,48 @@
     resY = Column(Integer)
     frameRate = Column(Float)
     frameRateTimeUnit = Column(String, default = 's')
-    intrinsicCameraMatrix00 = Column(Float)
-    intrinsicCameraMatrix01 = Column(Float)
-    intrinsicCameraMatrix02 = Column(Float)
-    intrinsicCameraMatrix10 = Column(Float)
-    intrinsicCameraMatrix11 = Column(Float)
-    intrinsicCameraMatrix12 = Column(Float)
-    intrinsicCameraMatrix20 = Column(Float)
-    intrinsicCameraMatrix21 = Column(Float)
-    intrinsicCameraMatrix22 = Column(Float)
-    distortionCoefficients0 = Column(Float)
-    distortionCoefficients1 = Column(Float)
-    distortionCoefficients2 = Column(Float)
-    distortionCoefficients3 = Column(Float)
-    distortionCoefficients4 = Column(Float)
+    intrinsicCameraMatrixStr = Column(String)
+    distortionCoefficientsStr = Column(String)
     undistortedImageMultiplication = Column(Float)
     
-    def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None):
+    def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None):
         self.name = name
         self.resX = resX
         self.resY = resY
         self.frameRate = frameRate
         self.frameRateTimeUnit = frameRateTimeUnit
-
+        self.intrinsicCameraMatrix = None # should be np.array
+        self.distortionCoefficients = None # list
+        
         if trackingConfigurationFilename is not None:
             from storage import ProcessParameters
             params = ProcessParameters(trackingConfigurationFilename)
             self.intrinsicCameraMatrix = params.intrinsicCameraMatrix
             self.distortionCoefficients = params.distortionCoefficients
             self.undistortedImageMultiplication = params.undistortedImageMultiplication
+        elif intrinsicCameraFilename is not None:
+            self.intrinsicCameraMatrix = loadtxt(intrinsicCameraFilename)
+            self.distortionCoefficients = distortionCoefficients
+            self.undistortedImageMultiplication = undistortedImageMultiplication
         else:
             self.intrinsicCameraMatrix = intrinsicCameraMatrix
             self.distortionCoefficients = distortionCoefficients
             self.undistortedImageMultiplication = undistortedImageMultiplication
             
-        if self.intrinsicCameraMatrix is not None and self.intrinsicCameraMatrix.size == 9:
-            self.intrinsicCameraMatrix00 = self.intrinsicCameraMatrix[0,0]
-            self.intrinsicCameraMatrix01 = self.intrinsicCameraMatrix[0,1]
-            self.intrinsicCameraMatrix02 = self.intrinsicCameraMatrix[0,2]
-            self.intrinsicCameraMatrix10 = self.intrinsicCameraMatrix[1,0]
-            self.intrinsicCameraMatrix11 = self.intrinsicCameraMatrix[1,1]
-            self.intrinsicCameraMatrix12 = self.intrinsicCameraMatrix[1,2]
-            self.intrinsicCameraMatrix20 = self.intrinsicCameraMatrix[2,0]
-            self.intrinsicCameraMatrix21 = self.intrinsicCameraMatrix[2,1]
-            self.intrinsicCameraMatrix22 = self.intrinsicCameraMatrix[2,2]
+        if self.intrinsicCameraMatrix is not None:
+            self.intrinsicCameraMatrixStr = '{}'.format(self.intrinsicCameraMatrix.tolist())
         if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5:
-            self.distortionCoefficients0 = self.distortionCoefficients[0]
-            self.distortionCoefficients1 = self.distortionCoefficients[1]
-            self.distortionCoefficients2 = self.distortionCoefficients[2]
-            self.distortionCoefficients3 = self.distortionCoefficients[3]
-            self.distortionCoefficients4 = self.distortionCoefficients[4]
+            self.distortionCoefficientsStr = '{}'.format(self.distortionCoefficients)
 
     @orm.reconstructor
     def initOnLoad(self):
-        if self.intrinsicCameraMatrix00 is not None:
-            self.intrinsicCameraMatrix = zeros((3,3))
-            self.intrinsicCameraMatrix[0,0] = self.intrinsicCameraMatrix00
-            self.intrinsicCameraMatrix[0,1] = self.intrinsicCameraMatrix01
-            self.intrinsicCameraMatrix[0,2] = self.intrinsicCameraMatrix02
-            self.intrinsicCameraMatrix[1,0] = self.intrinsicCameraMatrix10
-            self.intrinsicCameraMatrix[1,1] = self.intrinsicCameraMatrix11
-            self.intrinsicCameraMatrix[1,2] = self.intrinsicCameraMatrix12
-            self.intrinsicCameraMatrix[2,0] = self.intrinsicCameraMatrix20
-            self.intrinsicCameraMatrix[2,1] = self.intrinsicCameraMatrix21
-            self.intrinsicCameraMatrix[2,2] = self.intrinsicCameraMatrix22
+        if self.intrinsicCameraMatrixStr is not None:
+            from ast import literal_eval
+            self.intrinsicCameraMatrix = array(literal_eval(self.intrinsicCameraMatrixStr))
         else:
             self.intrinsicCameraMatrix = None
-        if self.distortionCoefficients0 is not None:
-            self.distortionCoefficients = [0]*5
-            self.distortionCoefficients[0] = self.distortionCoefficients0
-            self.distortionCoefficients[1] = self.distortionCoefficients1
-            self.distortionCoefficients[2] = self.distortionCoefficients2
-            self.distortionCoefficients[3] = self.distortionCoefficients3
-            self.distortionCoefficients[4] = self.distortionCoefficients4
+        if self.distortionCoefficientsStr is not None:
+            self.distortionCoefficients = literal_eval(self.distortionCoefficientsStr)
         else:
             self.distortionCoefficients = None
 
@@ -162,7 +131,15 @@
         else:
             self.map1 = None
             self.map2 = None
-    
+
+    @staticmethod
+    def getCameraType(session, cameraTypeId):
+        'Returns the site(s) matching the index or the name'
+        if str.isdigit(cameraTypeId):
+            return session.query(CameraType).filter(CameraType.idx == int(cameraTypeId)).all()
+        else:
+            return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all()
+
 class CameraView(Base):
     __tablename__ = 'camera_views'
     idx = Column(Integer, primary_key=True)
--- a/python/storage.py	Sat Oct 29 16:34:05 2016 -0400
+++ b/python/storage.py	Fri Nov 04 11:47:42 2016 -0400
@@ -437,8 +437,7 @@
 
 def deleteFromSqlite(filename, dataType):
     'Deletes (drops) some tables in the filename depending on type of data'
-    import os
-    if os.path.isfile(filename):
+    if path.isfile(filename):
         connection = sqlite3.connect(filename)
         if dataType == 'object':
             dropTables(connection, ['objects', 'objects_features'])
@@ -1258,6 +1257,9 @@
 
         config = ConfigParser()
         config.readfp(FakeSecHead(openCheck(filename)))
+        # check if path contains directory names
+        dirname = path.split(filename)[0]
+
         self.sectionHeader = config.sections()[0]
         # Tracking/display parameters
         self.videoFilename = config.get(self.sectionHeader, 'video-filename')
@@ -1268,8 +1270,8 @@
         else:
             self.homography = None
         self.intrinsicCameraFilename = config.get(self.sectionHeader, 'intrinsic-camera-filename')
-        if (path.exists(self.intrinsicCameraFilename)):
-            self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename)
+        if (path.exists(dirname+path.sep+self.intrinsicCameraFilename)):
+            self.intrinsicCameraMatrix = loadtxt(dirname+path.sep+self.intrinsicCameraFilename)
         else:
             self.intrinsicCameraMatrix = None
         distortionCoefficients = getValuesFromINIFile(filename, 'distortion-coefficients', '=')